{"version":3,"sources":["../src/index.ts","../src/registry/entity-meta.ts","../src/registry/domains.ts","../src/catalog/edge-catalog.ts","../src/grammar/lifecycles.ts","../src/catalog/legacy-product-stages.ts","../src/catalog/entity-descriptions.ts","../src/shapes/base-node.ts","../src/shapes/document.ts","../src/registry/entity-type-resolution.ts","../src/grammar/hierarchy.ts","../src/grammar/projection.ts","../src/grammar/configuration-drift.ts","../src/grammar/scales.ts","../src/grammar/enum-scales.ts","../src/grammar/migrations.ts","../src/grammar/status-migrations.ts","../src/grammar/slugify.ts","../src/grammar/cross-scope.ts","../src/properties/property-schema.ts","../src/frameworks/canonical.ts","../src/grammar/validate.ts","../src/properties/property-modifiers.ts","../src/properties/edge-property-validation.ts","../src/presentation/entity-emoji.ts","../src/presentation/labels.ts","../src/presentation/tree-patterns.ts","../src/presentation/area-taxonomy.ts","../src/playbooks/definitions/index.ts","../src/step-sequence.ts","../src/playbooks/index.ts","../src/presentation/lenses.ts","../src/presentation/domain-rings.ts","../src/intelligence/domain-guides.ts","../src/intelligence/benchmarks/types.ts","../src/intelligence/benchmarks/count-benchmarks.ts","../src/intelligence/benchmarks/relationship-benchmarks.ts","../src/intelligence/benchmarks/ratio-benchmarks.ts","../src/intelligence/benchmarks/domain-activations.ts","../src/intelligence/benchmarks/index.ts","../src/intelligence/anti-patterns.ts","../src/intelligence/validation-profiles.ts","../src/intelligence/evaluator.ts","../src/intelligence/product-stage-coercion.ts","../src/approaches/types.ts","../src/approaches/definitions/index.ts","../src/regions/catalog.ts","../src/frameworks/categories.ts","../src/frameworks/relational-paths.ts","../src/frameworks/validate.ts","../src/format/canonical.ts"],"sourcesContent":["/**\n * @unified-product-graph/core: Unified Product Graph Specification\n *\n * The open specification and TypeScript SDK for product knowledge graphs.\n *\n * https://unifiedproductgraph.org\n * License: MIT\n */\n\nimport { UPG_DOMAINS, getTypes } from './registry/domains.js'\nimport { UPG_ENTITY_META } from './registry/entity-meta.js'\nimport { UPG_EDGE_CATALOG } from './catalog/edge-catalog.js'\nimport { UPG_LIFECYCLES } from './grammar/lifecycles.js'\nimport type { UPGEdgeType } from './shapes/edges.js'\n\nexport * from './catalog/index.js'\nexport * from './shapes/index.js'\nexport * from './registry/index.js'\nexport * from './grammar/index.js'\nexport * from './properties/index.js'\nexport * from './presentation/index.js'\nexport * from './intelligence/index.js'\nexport * from './playbooks/index.js'\nexport * from './approaches/index.js'\nexport * from './regions/index.js'\nexport * from './frameworks/index.js'\nexport * from './format/index.js'\n\n/**\n * The current spec version implemented by this package.\n * MUST stay in lockstep with the package.json version of the publish train —\n * it stamps the `upg_version` field of every `.upg` file written by the SDK.\n * The `check:version-lockstep` gate enforces this at release time.\n */\nexport const UPG_VERSION = '0.41.0' as const\n\n/**\n * The `.upg` JSON document format version. Written to the `upg_version` field.\n * Evolves independently from `UPG_VERSION` (the catalogue version).\n */\nexport const UPG_FORMAT_VERSION = '0.4.0' as const\n\n/**\n * The `.upg.md` format version. Reference: `spec/UPG-MARKDOWN-v0.1.md`.\n * Reference implementation: `@unified-product-graph/markdown`.\n */\nexport const MARKDOWN_FORMAT_VERSION = '0.1' as const\n\n// ─── Entity types (computed from domain registry) ─────────────────────────────\n\n/** Every active entity type in the spec. Computed from domains, so it never drifts. */\nexport const UPG_TYPES: readonly string[] = getTypes()\n\n/** O(1) lookup set for validation and filtering */\nexport const UPG_TYPES_SET: ReadonlySet<string> = new Set(UPG_TYPES)\n\n/** Human-readable display names: snake_case → Title Case. Handles known abbreviations. */\nexport const UPG_TYPE_NAMES: Record<string, string> = Object.fromEntries(\n  UPG_TYPES.map((t) => [\n    t,\n    t\n      .split('_')\n      .map((w) => {\n        if (['kpi', 'okr', 'sli', 'slo', 'sla', 'api', 'ci', 'ip', 'qa', 'ai', 'ml', 'nps', 'seo', 'gtm'].includes(w)) return w.toUpperCase()\n        if (w === 'a11y') return 'A11y'\n        return w.charAt(0).toUpperCase() + w.slice(1)\n      })\n      .join(' '),\n  ]),\n)\n\n// ─── Edge types (computed from edge catalog) ─────────────────────────────────\n\n/** Every edge type key in the spec. Computed from the edge catalog. */\nexport const UPG_EDGE_TYPES: readonly UPGEdgeType[] = Object.keys(\n  UPG_EDGE_CATALOG,\n) as UPGEdgeType[]\n\n/**\n * Lookup map: `\"source_type:target_type\"` → ordered list of canonical edge keys.\n *\n * Computed from the edge catalog. Multiple edges may share a `(source, target)`\n * pair, e.g. `learning_updates_hypothesis` (causal) and `learning_refines_hypothesis`\n * (cross-domain) both connect `learning → hypothesis`. Prior to v0.4.1 this map\n * was a `Record<string, UPGEdgeType>` populated by `Object.fromEntries`, which\n * silently dropped every collision but the last (35 pairs).\n *\n * The value is now a list, ordered as edges appear in `UPG_EDGE_CATALOG`. Use\n * `pickCanonicalEdge` for a single deterministic answer and `resolveAllEdges`\n * for the full candidate set.\n */\nexport const UPG_EDGE_PAIR_MAP: Record<string, UPGEdgeType[]> = (() => {\n  const map: Record<string, UPGEdgeType[]> = {}\n  for (const [key, def] of Object.entries(UPG_EDGE_CATALOG)) {\n    const pair = `${def.source_type}:${def.target_type}`\n    ;(map[pair] ??= []).push(key as UPGEdgeType)\n  }\n  return map\n})()\n\n// ─── Catalogue-aware edge resolver ───────────────────────────────────────────\n\n/**\n * Edge classification used as the canonical-pick hint and policy axis.\n * Mirrors `UPGEdgeDefinition.classification` in `catalog/edge-catalog.ts`.\n */\nexport type UPGEdgePickHint = 'hierarchy' | 'causal' | 'semantic' | 'cross-domain'\n\n/**\n * Deterministic precedence used when no hint is given, or when the hinted\n * classification yields no match for the pair.\n *\n * Containment (hierarchy) wins: adapters and importers almost always mean\n * \"parent contains child\" when they ask for an edge. Causal beats lateral\n * (semantic / cross-domain) because cause/effect is structurally stronger\n * than association. Cross-domain is last, as it is a deliberate \"bridge\"\n * marker and should never silently win over an intra-domain edge.\n */\nconst CLASSIFICATION_RANK: Record<UPGEdgePickHint, number> = {\n  hierarchy: 0,\n  causal: 1,\n  semantic: 2,\n  'cross-domain': 3,\n}\n\n/**\n * Return every catalogued edge for the given `(source, target)` pair.\n *\n * Order matches `UPG_EDGE_CATALOG` declaration order. Returns `[]` when the\n * pair is not in the catalogue.\n *\n * @example\n * resolveAllEdges('learning', 'hypothesis')\n * // → ['learning_updates_hypothesis', 'learning_refines_hypothesis']\n */\nexport function resolveAllEdges(\n  sourceType: string,\n  targetType: string,\n): UPGEdgeType[] {\n  return UPG_EDGE_PAIR_MAP[`${sourceType}:${targetType}`] ?? []\n}\n\n/**\n * Pick the canonical `UPGEdgeType` for a `(source, target)` pair under an\n * explicit policy.\n *\n * **Policy:**\n * 1. If `hint` is provided and an edge with that `classification` exists for\n *    the pair, return it (first declared wins for sub-collisions inside a\n *    single classification, declaration order is the canonical tiebreaker).\n * 2. Otherwise, return the highest-ranked classification edge available,\n *    using `CLASSIFICATION_RANK` (hierarchy ≻ causal ≻ semantic ≻ cross-domain).\n * 3. If the pair has no catalogued edges, return `null`.\n *\n * **Determinism:** for any `(source, target)` the picked edge is stable across\n * runs and never changes unless the catalog is edited. This is the v0.4.1 fix:\n * pair collisions are no longer last-wins.\n *\n * @example\n * pickCanonicalEdge('product', 'decision', 'hierarchy')\n * // → 'product_decided_via_decision'  (the hierarchy-class edge)\n *\n * pickCanonicalEdge('learning', 'hypothesis')\n * // → 'learning_updates_hypothesis'   (causal beats cross-domain)\n */\nexport function pickCanonicalEdge(\n  sourceType: string,\n  targetType: string,\n  hint?: UPGEdgePickHint,\n): UPGEdgeType | null {\n  const candidates = UPG_EDGE_PAIR_MAP[`${sourceType}:${targetType}`]\n  if (!candidates || candidates.length === 0) return null\n  if (candidates.length === 1) return candidates[0]!\n\n  // Try the explicit hint first.\n  if (hint) {\n    for (const key of candidates) {\n      if (UPG_EDGE_CATALOG[key].classification === hint) return key\n    }\n  }\n\n  // Deterministic fallback: lowest-ranked classification wins; declaration\n  // order breaks ties inside a classification.\n  let best: UPGEdgeType = candidates[0]!\n  let bestRank = CLASSIFICATION_RANK[\n    UPG_EDGE_CATALOG[best].classification as UPGEdgePickHint\n  ]\n  for (let i = 1; i < candidates.length; i++) {\n    const key = candidates[i]!\n    const rank = CLASSIFICATION_RANK[\n      UPG_EDGE_CATALOG[key].classification as UPGEdgePickHint\n    ]\n    if (rank < bestRank) {\n      best = key\n      bestRank = rank\n    }\n  }\n  return best\n}\n\n/**\n * Resolve the canonical `UPGEdgeType` for a containment relationship.\n *\n * Import adapters need to emit edges like \"epic contains user_story\" but\n * cannot safely construct raw `${parent}_contains_${child}` template strings,\n * because that union is closed and most pairs are not registered. This function looks\n * up the canonical edge for the given parent→child pair using\n * `pickCanonicalEdge` with the `'hierarchy'` hint, falling back through the\n * standard precedence when no hierarchy-class edge exists for the pair.\n *\n * **v0.4.1 contract change:**\n * - If the pair has any catalogued edge, a deterministic canonical pick is\n *   returned (hierarchy-class preferred; otherwise causal ≻ semantic ≻\n *   cross-domain). All 35 collision pairs from the v0.4.0 audit now return\n *   non-null, fixing silent last-wins behaviour.\n * - If the pair has no catalogued edge at all, `null` is returned so the\n *   caller can fall back to `node_informs_node` or skip the edge entirely.\n *\n * **Design note:** the `hint` argument is omitted from this function for\n * back-compat. All in-tree callers (Markdown, Notion, Linear, GitHub\n * adapters) are containment-only. Callers that need a different classification\n * should call `pickCanonicalEdge(source, target, hint)` directly.\n *\n * @param parentType - Source entity type string (e.g. `'epic'`)\n * @param childType  - Target entity type string (e.g. `'user_story'`)\n * @returns Canonical `UPGEdgeType` key, or `null` if the pair has no edges.\n *\n * @example\n * resolveContainmentEdge('feature_area', 'feature')  // → 'feature_area_contains_feature'\n * resolveContainmentEdge('release', 'persona')       // → null (no edge for pair)\n * resolveContainmentEdge('product', 'decision')      // → 'product_decided_via_decision' (hierarchy)\n */\nexport function resolveContainmentEdge(\n  parentType: string,\n  childType: string,\n): UPGEdgeType | null {\n  return pickCanonicalEdge(parentType, childType, 'hierarchy')\n}\n\n// ─── Counts (computed) ────────────────────────────────────────────────────────\n//\n// Two entity-type counts exist and they intentionally differ; each states its\n// filter so consumers (and introspection tools) can never conflate them\n// (DT-SPEC-2):\n//\n//   UPG_ENTITY_COUNT — ACTIVE, NON-DEPRECATED types only. Computed from\n//     `getTypes()` over `UPG_DOMAINS` (every type is assigned to exactly one\n//     domain; deprecated aliases are not). This is what `get_spec_version`,\n//     `list_type_labels`, and any \"how many types can I create?\" surface should\n//     report. Currently 324.\n//\n//   UPG_META_COUNT — EVERY entry in the meta registry, INCLUDING deprecated\n//     aliases (kpi, jtbd, pain_point, user_need, research_insight,\n//     hypothesis_claim, hypothesis_evidence, …). This is what `list_entity_types`\n//     reports because it must surface deprecated types so migrations can\n//     resolve them. Currently 362.\n//\n// The numbers are correct as-is; the difference (358 − 320) is exactly the\n// deprecated-alias set. Do NOT \"reconcile\" them to a single number — they\n// answer two different questions.\n\n/**\n * Total number of ACTIVE (non-deprecated) entity types.\n * Filter: types present in `UPG_DOMAINS` via `getTypes()`. Excludes deprecated\n * aliases. This is the canonical \"creatable types\" count (`get_spec_version`,\n * `list_type_labels`).\n */\nexport const UPG_ENTITY_COUNT = UPG_TYPES.length\n\n/** Total number of semantic domains */\nexport const UPG_DOMAIN_COUNT = UPG_DOMAINS.length\n\n/** Total number of edge types */\nexport const UPG_EDGE_COUNT = UPG_EDGE_TYPES.length\n\n/**\n * Total number of entity-type entries in the meta registry, INCLUDING\n * deprecated aliases. Filter: every `UPG_ENTITY_META` row, no exclusions. This\n * is the `list_entity_types` count and is strictly ≥ `UPG_ENTITY_COUNT`; the\n * gap is the deprecated-alias set.\n */\nexport const UPG_META_COUNT = UPG_ENTITY_META.length\n\n/**\n * How much lifecycle vocabulary the spec defines: the number of DISTINCT\n * (template, phase) pairs across `UPG_LIFECYCLES`.\n *\n * @remarks\n * WHAT IT COUNTS, and the definition IS the decision. A lifecycle is either\n * generated from a reusable template (`template_id` set) or hand-authored for one\n * entity type. Two entity types sharing the `OPERATIONAL` template have not\n * defined its phases twice, so the pair is keyed on the TEMPLATE where there is\n * one and on the ENTITY TYPE where there is not.\n *\n * WHY NOT THE OTHER TWO CANDIDATES, both of which were live when this was wired:\n *\n *   869 — every phase row across all 193 lifecycles. The literal size of the\n *   grammar, and it double-counts a template reused by nine entity types. The\n *   number appears in prose as a claim about how much vocabulary the spec HAS,\n *   which is not what 869 measures.\n *\n *   334 — carried in planning documents since 0.32.0 and never computed by\n *   anything. It does not reproduce under either real computation. It was\n *   transcribed forward, which is exactly the failure `check:count-drift` exists\n *   to end, and it is recorded here so nobody restores it.\n *\n * WIRED INTO `check:count-drift` AT 0.34.0. The condition was declared met in the\n * 0.33.0 CHANGELOG and deferred on the ground that adding a check would change\n * the shape of a release ratified as adding none. That ground is gone. Until now\n * this was the one figure in the truth line that no check asserted, which is why\n * it is also the one that drifted.\n *\n * Derived, never a literal: the count and any docket or CHANGELOG row quoting it\n * come from this computation, so two numbers cannot be derived twice.\n */\nexport const UPG_PHASE_COUNT = (() => {\n  const pairs = new Set<string>()\n  for (const lifecycle of UPG_LIFECYCLES) {\n    const owner = lifecycle.template_id ? `T:${lifecycle.template_id}` : `E:${lifecycle.entity_type}`\n    for (const phase of lifecycle.phases) pairs.add(`${owner}::${phase.id}`)\n  }\n  return pairs.size\n})()\n","/**\n * UPG Entity Type Metadata. Immutable `type_id`, human-readable `name`,\n * `maturity` (draft → proposed → stable → deprecated → removed), and version\n * tracking (`since`, `deprecated_in`, `replacement`).\n *\n * ## Maturity Promotion Rubric\n *\n * Promote `proposed → stable` when all of:\n *\n * 1. Referenced by ≥2 framework slots in `src/frameworks/definitions/`.\n * 2. Carries ≥3 properties in `UPG_PROPERTY_SCHEMA`.\n * 3. Has a lifecycle in `UPG_LIFECYCLES` or is documented lifecycle-free.\n * 4. No rename, merge, or restructure ticket open for 30+ days.\n *\n * Demote `proposed → deprecated` when:\n *\n * - 2 minor versions pass without a framework reference.\n * - Canonical overlap with a newer type.\n *\n * `scripts/audit-proposed-promotion.ts` checks the rubric.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type UPGEntityTypeMaturity = 'draft' | 'proposed' | 'stable' | 'deprecated' | 'removed'\n\n/**\n * Identity + lifecycle metadata for a single UPG entity type.\n *\n * @example\n * const personaMeta: EntityTypeMeta = {\n *   name: 'persona',\n *   type_id: 'ent_016',\n *   maturity: 'stable',\n *   since: '0.1.0',\n * }\n *\n * @example\n * // Deprecated type: readable in .upg files, migrates on write.\n * const painPointMeta: EntityTypeMeta = {\n *   name: 'pain_point',\n *   type_id: 'ent_018',\n *   maturity: 'deprecated',\n *   since: '0.1.0',\n *   deprecated_in: '0.1.0',\n *   replacement: 'need',\n * }\n */\nexport interface EntityTypeMeta {\n  /** Human-readable type name (e.g. 'need'). May change across versions. */\n  name: string\n  /** Immutable identifier (e.g. 'ent_313'). Never changes, even if name changes. */\n  type_id: string\n  /** Current maturity level */\n  maturity: UPGEntityTypeMaturity\n  /** UPG version when this type was introduced */\n  since: string\n  /** UPG version when this type was deprecated (if applicable) */\n  deprecated_in?: string\n  /** UPG version when this type was removed (if applicable) */\n  removed_in?: string\n  /** Canonical replacement type (if deprecated) */\n  replacement?: string\n  /**\n   * Frameworks usually applied to this type, by `UPGFramework.id`. A\n   * declarative, type-level affordance (\"these lenses are usually applied to\n   * me\"). Runtimes may offer them as default scoring/structuring exercises on\n   * creation. The score lives on the framework application (a `framework_exercise`\n   * includes-edge), never on the entity. Not field-absorption: this is a pointer,\n   * not embedded columns.\n   */\n  default_frameworks?: string[]\n  /**\n   * Portfolio-shared tier (0.18.0). True for the ~26 canonical / above-product /\n   * registry-hostable entity types a *second* product graph can legitimately point\n   * at — the strategy spine + measurement (outcome, objective, key_result, metric,\n   * vision, mission, strategic_theme, strategic_pillar, initiative, capability,\n   * dependency), competitive-intel canon (competitor, competitor_feature,\n   * competitor_signal, classification_value, classification_axis, market_segment),\n   * design/brand foundation atoms (design_system, design_component, brand_identity),\n   * cross-team org (team, department), and the registry / foundations (specification,\n   * primitive, operating_lifecycle, operating_stage).\n   *\n   * This is a NEW axis, orthogonal to region/domain/classification — none of those\n   * encode \"shareable across product graphs\". It is the derived guardrail for\n   * cross-product edge eligibility: an edge is *cross-capable* iff ≥1 endpoint type\n   * is `portfolio_shared` (see `isCrossCapable` / `crossProductScope`). Product-local\n   * types (persona, job, need, assumption, decision, role, stakeholder, `product`\n   * itself as a graph root) are deliberately NOT shared, so their internal\n   * decomposition edges stay resident (hard-rejected cross-product).\n   */\n  portfolio_shared?: boolean\n}\n\n// ─── Entity type registry ──────────────────────────────────────────────────────\n\nexport const UPG_ENTITY_META: readonly EntityTypeMeta[] = [\n  // Foundations (0.9.12): shared specifications + the primitives they define.\n  { name: 'specification', type_id: 'ent_352', maturity: 'proposed', since: '0.9.12', portfolio_shared: true },\n  { name: 'primitive', type_id: 'ent_353', maturity: 'proposed', since: '0.9.12', portfolio_shared: true },\n  { name: 'operating_lifecycle', type_id: 'ent_355', maturity: 'proposed', since: '0.11.6', portfolio_shared: true },\n  { name: 'operating_stage', type_id: 'ent_356', maturity: 'proposed', since: '0.11.6', portfolio_shared: true },\n\n  // ── Strategic ──\n  { name: 'product', type_id: 'ent_001', maturity: 'stable', since: '0.1.0' },\n  { name: 'outcome', type_id: 'ent_002', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'kpi', type_id: 'ent_003', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'metric' },\n  { name: 'objective', type_id: 'ent_004', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'key_result', type_id: 'ent_005', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'metric', type_id: 'ent_006', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,\n  // the metric-quality assessment artefact is settled with no open restructure.\n  { name: 'metric_quality_assessment', type_id: 'ent_339', maturity: 'stable', since: '0.2.2' },\n  { name: 'vision', type_id: 'ent_007', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'mission', type_id: 'ent_008', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'strategic_theme', type_id: 'ent_009', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'initiative', type_id: 'ent_010', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'capability', type_id: 'ent_011', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'value_stream', type_id: 'ent_012', maturity: 'stable', since: '0.1.0' },\n  { name: 'strategic_pillar', type_id: 'ent_013', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'assumption', type_id: 'ent_014', maturity: 'stable', since: '0.1.0' },\n  { name: 'decision', type_id: 'ent_015', maturity: 'stable', since: '0.1.0' },\n  { name: 'constraint', type_id: 'ent_348', maturity: 'stable', since: '0.4.3' },\n  // (0.17.4) Strategy-domain sibling of research_question / design_question,\n  // completing the domain-question triad. An open coordination/ownership question\n  // a plan is exposed to (distinct from `assumption`, which the plan is built on).\n  { name: 'strategic_question', type_id: 'ent_357', maturity: 'proposed', since: '0.17.4' },\n\n  // ── User ──\n  { name: 'persona', type_id: 'ent_016', maturity: 'stable', since: '0.1.0' },\n  { name: 'job', type_id: 'ent_017', maturity: 'stable', since: '0.1.0' },\n  { name: 'jtbd', type_id: 'ent_332', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'job' },\n  { name: 'pain_point', type_id: 'ent_018', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'need' },\n  { name: 'desired_outcome', type_id: 'ent_019', maturity: 'stable', since: '0.1.0' },\n  { name: 'job_step', type_id: 'ent_020', maturity: 'stable', since: '0.1.0' },\n  { name: 'user_need', type_id: 'ent_021', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'need' },\n  { name: 'need', type_id: 'ent_313', maturity: 'stable', since: '0.1.0' },\n  { name: 'switching_cost', type_id: 'ent_022', maturity: 'stable', since: '0.1.0' },\n\n  // ── Discovery ──\n  { name: 'opportunity', type_id: 'ent_023', maturity: 'stable', since: '0.1.0', default_frameworks: ['opportunity-sizing', 'rice-scoring'] },\n  { name: 'solution', type_id: 'ent_024', maturity: 'stable', since: '0.1.0', default_frameworks: ['rice-scoring'] },\n  { name: 'feasibility_study', type_id: 'ent_025', maturity: 'stable', since: '0.1.0' },\n  { name: 'design_sprint', type_id: 'ent_026', maturity: 'stable', since: '0.1.0' },\n\n  // ── Validation ──\n  // (since v0.4.0) `hypothesis` re-promoted to canonical-stable. The\n  // v0.2.8 rename to `hypothesis_claim` was over-split: \"claim\" is implied\n  // by being a hypothesis. Canonical name reverts; HypothesisClaimProperties\n  // renamed to HypothesisProperties. `hypothesis_claim` is now deprecated\n  // (→ `hypothesis`). `hypothesis_evidence` deprecated (→ `evidence`): the\n  // dual evidence_type enum smell resolved by enriching canonical `evidence`\n  // with evidence_rigor + evidence_source axes. Edge pattern switches to\n  // `hypothesis_has_evidence` (neutral, direction on node).\n  { name: 'hypothesis', type_id: 'ent_027', maturity: 'stable', since: '0.1.0' },\n  { name: 'hypothesis_claim', type_id: 'ent_344', maturity: 'deprecated', since: '0.2.8', deprecated_in: '0.4.0', replacement: 'hypothesis' },\n  { name: 'hypothesis_evidence', type_id: 'ent_345', maturity: 'deprecated', since: '0.2.8', deprecated_in: '0.4.0', replacement: 'evidence' },\n  // `experiment` is canonical (UPG-664). It has its own property schema\n  // (method, start_date, end_date, sample_size, expected_lift) and is the\n  // canonical unit of a structured test. The validation flow is\n  // `hypothesis → experiment_plan → experiment → experiment_run`: the plan is\n  // the validation design, the experiment is the structured test, the run is\n  // the optional multi-run/replication child.\n  { name: 'experiment', type_id: 'ent_028', maturity: 'stable', since: '0.1.0' },\n  // experiment_plan graduated proposed → stable (UPG-664). It is the canonical\n  // validation PLAN type — it absorbed `test_plan`'s planning properties\n  // (method / success_criteria / sample_size) when `test_plan` re-homed to the\n  // QA/testing domain (UPG-678).\n  { name: 'experiment_plan', type_id: 'ent_340', maturity: 'stable', since: '0.2.6' },\n  { name: 'experiment_run', type_id: 'ent_341', maturity: 'stable', since: '0.2.6' },\n  { name: 'learning', type_id: 'ent_029', maturity: 'stable', since: '0.1.0' },\n  // test_plan re-homed validation → testing/QA (UPG-678). It is the QA\n  // verification-procedure plan (test scope / environments / pass criteria);\n  // its former validation-planning role is carried by experiment_plan.\n  { name: 'test_plan', type_id: 'ent_030', maturity: 'stable', since: '0.1.0' },\n  { name: 'evidence', type_id: 'ent_031', maturity: 'stable', since: '0.1.0' },\n  { name: 'research_plan', type_id: 'ent_032', maturity: 'stable', since: '0.1.0' },\n\n  // ── Market Intelligence ──\n  { name: 'competitor', type_id: 'ent_033', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'competitor_feature', type_id: 'ent_034', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'competitor_signal', type_id: 'ent_354', maturity: 'proposed', since: '0.10.0', portfolio_shared: true },\n  { name: 'market_trend', type_id: 'ent_035', maturity: 'stable', since: '0.1.0' },\n  { name: 'market_segment', type_id: 'ent_036', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'competitive_analysis', type_id: 'ent_037', maturity: 'stable', since: '0.1.0' },\n  // Classification taxonomy hosted by competitive_analysis.\n  // F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases\n  // stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-\n  // analysis classification spine with no open rename/restructure ticket.\n  { name: 'classification_axis', type_id: 'ent_346', maturity: 'stable', since: '0.4.0', portfolio_shared: true },\n  { name: 'classification_value', type_id: 'ent_347', maturity: 'stable', since: '0.4.0', portfolio_shared: true },\n\n  // ── UX Research ──\n  { name: 'research_study', type_id: 'ent_038', maturity: 'stable', since: '0.1.0' },\n  { name: 'research_insight', type_id: 'ent_039', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'insight' },\n  { name: 'insight', type_id: 'ent_040', maturity: 'stable', since: '0.1.0' },\n  { name: 'participant', type_id: 'ent_041', maturity: 'stable', since: '0.1.0' },\n  { name: 'observation', type_id: 'ent_042', maturity: 'stable', since: '0.1.0' },\n  { name: 'quote', type_id: 'ent_043', maturity: 'stable', since: '0.1.0' },\n  { name: 'affinity_cluster', type_id: 'ent_044', maturity: 'stable', since: '0.1.0' },\n  { name: 'research_question', type_id: 'ent_045', maturity: 'stable', since: '0.1.0' },\n  { name: 'interview_guide', type_id: 'ent_046', maturity: 'stable', since: '0.1.0' },\n  { name: 'finding', type_id: 'ent_047', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'insight' },\n  { name: 'survey_response', type_id: 'ent_048', maturity: 'stable', since: '0.1.0' },\n  { name: 'highlight', type_id: 'ent_049', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'observation' },\n\n  // ── Design ──\n  { name: 'user_journey', type_id: 'ent_050', maturity: 'stable', since: '0.1.0' },\n  { name: 'journey_step', type_id: 'ent_051', maturity: 'stable', since: '0.1.0' },\n  { name: 'ux_insight', type_id: 'ent_052', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'insight' },\n  { name: 'design_question', type_id: 'ent_053', maturity: 'stable', since: '0.1.0' },\n  { name: 'how_might_we', type_id: 'ent_333', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'design_question' },\n  { name: 'design_concept', type_id: 'ent_054', maturity: 'stable', since: '0.1.0' },\n  { name: 'prototype', type_id: 'ent_055', maturity: 'stable', since: '0.1.0' },\n  { name: 'design_component', type_id: 'ent_056', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'design_token', type_id: 'ent_057', maturity: 'stable', since: '0.1.0' },\n  { name: 'brand_identity', type_id: 'ent_058', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'brand_colour', type_id: 'ent_059', maturity: 'stable', since: '0.1.0' },\n  { name: 'brand_typography', type_id: 'ent_060', maturity: 'stable', since: '0.1.0' },\n  { name: 'brand_voice', type_id: 'ent_061', maturity: 'stable', since: '0.1.0' },\n  { name: 'wireframe', type_id: 'ent_062', maturity: 'stable', since: '0.1.0' },\n  { name: 'design_pattern', type_id: 'ent_063', maturity: 'stable', since: '0.1.0' },\n  { name: 'design_guideline', type_id: 'ent_064', maturity: 'stable', since: '0.1.0' },\n  { name: 'annotation', type_id: 'ent_065', maturity: 'stable', since: '0.1.0' },\n  { name: 'interaction_spec', type_id: 'ent_066', maturity: 'stable', since: '0.1.0' },\n  { name: 'design_system', type_id: 'ent_067', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'user_flow', type_id: 'ent_068', maturity: 'stable', since: '0.1.0' },\n  { name: 'screen', type_id: 'ent_069', maturity: 'stable', since: '0.1.0' },\n  { name: 'screen_state', type_id: 'ent_070', maturity: 'stable', since: '0.1.0' },\n  // surface (0.27.0): the place inside a screen. `screen` is route-level\n  // (route / viewport / access_level); `surface` is the contested slot within\n  // it, carrying its occupants and the rule that arbitrates between them.\n  // Enters `proposed` per the maturity rubric (precedent: planning_cycle 0.20.0).\n  { name: 'surface', type_id: 'ent_359', maturity: 'proposed', since: '0.27.0' },\n  { name: 'configuration_axis', type_id: 'ent_360', maturity: 'proposed', since: '0.30.0' },\n  { name: 'journey_phase', type_id: 'ent_330', maturity: 'proposed', since: '0.2.0' },\n  { name: 'journey_action', type_id: 'ent_331', maturity: 'proposed', since: '0.2.0' },\n  { name: 'design_decision', type_id: 'ent_319', maturity: 'deprecated', since: '0.2.0', deprecated_in: '0.2.0', replacement: 'decision' },\n  // F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,\n  // the brand-identity set (logo + imagery) is settled with no open rename.\n  { name: 'brand_logo', type_id: 'ent_321', maturity: 'stable', since: '0.2.0' },\n  { name: 'brand_imagery', type_id: 'ent_322', maturity: 'stable', since: '0.2.0' },\n\n  // ── Product Spec ──\n  { name: 'feature_area', type_id: 'ent_314', maturity: 'stable', since: '0.1.0' },\n  { name: 'feature', type_id: 'ent_071', maturity: 'stable', since: '0.1.0' },\n  { name: 'epic', type_id: 'ent_072', maturity: 'stable', since: '0.1.0' },\n  // `user_story` is the templated \"As X, I want Y so Z\" promise: a stable,\n  // lifecycle-free design artefact (UCS pattern P5). The v0.2.7 split EXTRACTED\n  // the engineering work into a separate `task` (the lifecycle-bearing work-unit,\n  // linked via `task_implements_user_story`); the split was right. But the\n  // surviving statement half was renamed to the coined `story_statement`, which\n  // raised the adoption barrier. \"user story\" is the universally-recognised\n  // industry term for exactly this artefact. v0.7.0 (UPG-571) re-canonicalises\n  // the statement under `user_story`; `story_statement` becomes a deprecated\n  // alias. `story_task` (the original work half) was already collapsed into\n  // canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)\n  // + task (work), linked by `task_implements_user_story`.\n  //\n  // F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged\n  // user_story as a stable-spine candidate, but the v0.7.0 re-canon contract\n  // (UPG-571) freezes maturity at `proposed` until the re-canonicalised name\n  // has soaked across a full migration window. `user-story-split.test.ts`\n  // (\"user_story is canonical again (ent_073, proposed, not deprecated)\")\n  // asserts `proposed` as the post-re-canon invariant. Graduating here would\n  // break that contract; promotion is a separate, ticketed decision once the\n  // story_statement → user_story migration has fully aged out.\n  { name: 'user_story', type_id: 'ent_073', maturity: 'stable', since: '0.1.0' },\n  { name: 'story_statement', type_id: 'ent_342', maturity: 'deprecated', since: '0.2.7', deprecated_in: '0.7.0', replacement: 'user_story' },\n  { name: 'story_task', type_id: 'ent_343', maturity: 'deprecated', since: '0.2.7', deprecated_in: '0.4.0', replacement: 'task' },\n  { name: 'acceptance_criterion', type_id: 'ent_074', maturity: 'stable', since: '0.1.0' },\n  { name: 'release', type_id: 'ent_075', maturity: 'stable', since: '0.1.0' },\n  { name: 'task', type_id: 'ent_076', maturity: 'stable', since: '0.1.0' },\n  { name: 'bug', type_id: 'ent_077', maturity: 'stable', since: '0.1.0' },\n  { name: 'roadmap', type_id: 'ent_078', maturity: 'stable', since: '0.1.0' },\n  { name: 'roadmap_item', type_id: 'ent_079', maturity: 'stable', since: '0.1.0' },\n  { name: 'theme', type_id: 'ent_080', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.9.0', replacement: 'roadmap_theme' },\n  { name: 'roadmap_theme', type_id: 'ent_351', maturity: 'stable', since: '0.1.0' },\n  { name: 'changelog', type_id: 'ent_081', maturity: 'stable', since: '0.1.0' },\n  // (0.20.0) The cadence axis: a named, dated interval that work flows through\n  // and which nests (a program-increment contains iterations; a cycle contains\n  // its cooldown). One self-nesting type with a `cadence_kind` discriminator\n  // spans sprint / iteration / quarter / PI / cooldown rather than minting a\n  // type per methodology. `portfolio_shared` because a coarse cycle is an\n  // org-shared interval an objective in a rollup graph and a story in a product\n  // graph both schedule into.\n  { name: 'planning_cycle', type_id: 'ent_358', maturity: 'proposed', since: '0.20.0', portfolio_shared: true },\n\n  // ── Engineering ──\n  { name: 'bounded_context', type_id: 'ent_082', maturity: 'stable', since: '0.1.0' },\n  { name: 'service', type_id: 'ent_083', maturity: 'stable', since: '0.1.0' },\n  { name: 'domain_event', type_id: 'ent_084', maturity: 'stable', since: '0.1.0' },\n  { name: 'api_contract', type_id: 'ent_085', maturity: 'stable', since: '0.1.0' },\n  { name: 'architecture_decision', type_id: 'ent_086', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'decision' },\n  { name: 'technical_debt_item', type_id: 'ent_087', maturity: 'stable', since: '0.1.0' },\n  { name: 'feature_flag', type_id: 'ent_088', maturity: 'stable', since: '0.1.0' },\n  { name: 'deployment', type_id: 'ent_089', maturity: 'stable', since: '0.1.0' },\n  { name: 'aggregate', type_id: 'ent_090', maturity: 'stable', since: '0.1.0' },\n  { name: 'domain_entity', type_id: 'ent_091', maturity: 'stable', since: '0.1.0' },\n  { name: 'value_object', type_id: 'ent_092', maturity: 'stable', since: '0.1.0' },\n  { name: 'command', type_id: 'ent_093', maturity: 'stable', since: '0.1.0' },\n  { name: 'read_model', type_id: 'ent_094', maturity: 'stable', since: '0.1.0' },\n  { name: 'api_endpoint', type_id: 'ent_095', maturity: 'stable', since: '0.1.0' },\n  { name: 'database_schema', type_id: 'ent_096', maturity: 'stable', since: '0.1.0' },\n  { name: 'queue_topic', type_id: 'ent_097', maturity: 'stable', since: '0.1.0' },\n  { name: 'build_artifact', type_id: 'ent_098', maturity: 'stable', since: '0.1.0' },\n  { name: 'code_repository', type_id: 'ent_099', maturity: 'stable', since: '0.1.0' },\n  { name: 'library_dependency', type_id: 'ent_100', maturity: 'stable', since: '0.1.0' },\n  { name: 'integration_pattern', type_id: 'ent_101', maturity: 'stable', since: '0.1.0' },\n  { name: 'external_api', type_id: 'ent_102', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_flow', type_id: 'ent_103', maturity: 'stable', since: '0.1.0' },\n  { name: 'investigation', type_id: 'ent_315', maturity: 'stable', since: '0.2.0' },\n  { name: 'root_cause', type_id: 'ent_316', maturity: 'stable', since: '0.2.0' },\n  { name: 'symptom', type_id: 'ent_317', maturity: 'stable', since: '0.2.0' },\n  { name: 'fix', type_id: 'ent_318', maturity: 'stable', since: '0.2.0' },\n\n  // ── Growth ──\n  { name: 'north_star_metric', type_id: 'ent_104', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'metric' },\n  { name: 'input_metric', type_id: 'ent_105', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'metric' },\n  { name: 'funnel', type_id: 'ent_106', maturity: 'stable', since: '0.1.0' },\n  { name: 'funnel_step', type_id: 'ent_107', maturity: 'stable', since: '0.1.0' },\n  { name: 'acquisition_channel', type_id: 'ent_108', maturity: 'stable', since: '0.1.0' },\n  { name: 'growth_campaign', type_id: 'ent_109', maturity: 'stable', since: '0.1.0' },\n  { name: 'campaign', type_id: 'ent_337', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'growth_campaign' },\n  { name: 'cohort', type_id: 'ent_110', maturity: 'stable', since: '0.1.0' },\n  { name: 'behavioral_segment', type_id: 'ent_111', maturity: 'stable', since: '0.1.0' },\n  { name: 'segment', type_id: 'ent_338', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'behavioral_segment' },\n  { name: 'growth_loop', type_id: 'ent_112', maturity: 'stable', since: '0.1.0' },\n  { name: 'growth_experiment', type_id: 'ent_113', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'experiment' },\n  { name: 'variant', type_id: 'ent_114', maturity: 'stable', since: '0.1.0' },\n  { name: 'attribution_model', type_id: 'ent_115', maturity: 'stable', since: '0.1.0' },\n\n  // ── Business Model ──\n  { name: 'business_model', type_id: 'ent_116', maturity: 'stable', since: '0.1.0' },\n  { name: 'value_proposition', type_id: 'ent_117', maturity: 'stable', since: '0.1.0' },\n  { name: 'revenue_stream', type_id: 'ent_118', maturity: 'stable', since: '0.1.0' },\n  { name: 'pricing_tier', type_id: 'ent_119', maturity: 'stable', since: '0.1.0' },\n  { name: 'cost_structure', type_id: 'ent_120', maturity: 'stable', since: '0.1.0' },\n  { name: 'unit_economics', type_id: 'ent_121', maturity: 'stable', since: '0.1.0' },\n  { name: 'partnership', type_id: 'ent_122', maturity: 'stable', since: '0.1.0' },\n  { name: 'key_resource', type_id: 'ent_123', maturity: 'stable', since: '0.1.0' },\n  { name: 'key_activity', type_id: 'ent_124', maturity: 'stable', since: '0.1.0' },\n  { name: 'customer_segment_bm', type_id: 'ent_125', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'market_segment' },\n  { name: 'channel_bm', type_id: 'ent_126', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'distribution_channel' },\n  { name: 'target_customer_segment', type_id: 'ent_329', maturity: 'deprecated', since: '0.2.0', deprecated_in: '0.2.0', replacement: 'market_segment' },\n  { name: 'customer_relationship', type_id: 'ent_127', maturity: 'stable', since: '0.1.0' },\n  { name: 'distribution_channel', type_id: 'ent_128', maturity: 'stable', since: '0.1.0' },\n\n  // ── Go-To-Market ──\n  { name: 'gtm_strategy', type_id: 'ent_129', maturity: 'stable', since: '0.1.0' },\n  { name: 'ideal_customer_profile', type_id: 'ent_130', maturity: 'stable', since: '0.1.0' },\n  { name: 'positioning', type_id: 'ent_131', maturity: 'stable', since: '0.1.0' },\n  { name: 'messaging', type_id: 'ent_132', maturity: 'stable', since: '0.1.0' },\n  { name: 'launch', type_id: 'ent_133', maturity: 'stable', since: '0.1.0' },\n  { name: 'content_strategy', type_id: 'ent_134', maturity: 'stable', since: '0.1.0' },\n  { name: 'sales_motion', type_id: 'ent_135', maturity: 'stable', since: '0.1.0' },\n  { name: 'competitive_battle_card', type_id: 'ent_136', maturity: 'stable', since: '0.1.0' },\n  { name: 'demand_gen_program', type_id: 'ent_137', maturity: 'stable', since: '0.1.0' },\n  { name: 'territory', type_id: 'ent_138', maturity: 'stable', since: '0.1.0' },\n  { name: 'objection', type_id: 'ent_139', maturity: 'stable', since: '0.1.0' },\n  { name: 'rebuttal', type_id: 'ent_140', maturity: 'stable', since: '0.1.0' },\n  { name: 'proof_point', type_id: 'ent_141', maturity: 'stable', since: '0.1.0' },\n\n  // ── Team & Organisation ──\n  { name: 'team', type_id: 'ent_142', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'role', type_id: 'ent_143', maturity: 'stable', since: '0.1.0' },\n  { name: 'stakeholder', type_id: 'ent_144', maturity: 'stable', since: '0.1.0' },\n  { name: 'person', type_id: 'ent_349', maturity: 'stable', since: '0.5.0' },\n  { name: 'product_decision', type_id: 'ent_145', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'decision' },\n  { name: 'team_okr', type_id: 'ent_146', maturity: 'stable', since: '0.1.0' },\n  { name: 'retrospective', type_id: 'ent_147', maturity: 'stable', since: '0.1.0' },\n  { name: 'dependency', type_id: 'ent_148', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'department', type_id: 'ent_149', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'skill', type_id: 'ent_150', maturity: 'stable', since: '0.1.0' },\n  { name: 'ceremony', type_id: 'ent_151', maturity: 'stable', since: '0.1.0' },\n  { name: 'capacity_plan', type_id: 'ent_152', maturity: 'stable', since: '0.1.0' },\n\n  // ── Data & Analytics ──\n  { name: 'data_source', type_id: 'ent_153', maturity: 'stable', since: '0.1.0' },\n  { name: 'metric_definition', type_id: 'ent_154', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'metric' },\n  { name: 'event_schema', type_id: 'ent_155', maturity: 'stable', since: '0.1.0' },\n  { name: 'dashboard', type_id: 'ent_156', maturity: 'stable', since: '0.1.0' },\n  { name: 'ab_test', type_id: 'ent_157', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'experiment' },\n  { name: 'data_model', type_id: 'ent_158', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_quality_rule', type_id: 'ent_159', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_product', type_id: 'ent_160', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_pipeline', type_id: 'ent_161', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_lineage', type_id: 'ent_162', maturity: 'stable', since: '0.1.0' },\n  { name: 'glossary_term', type_id: 'ent_163', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_domain', type_id: 'ent_164', maturity: 'stable', since: '0.1.0' },\n  { name: 'report', type_id: 'ent_165', maturity: 'stable', since: '0.1.0' },\n\n  // ── Content & Knowledge ──\n  { name: 'content_piece', type_id: 'ent_166', maturity: 'stable', since: '0.1.0' },\n  { name: 'knowledge_base_article', type_id: 'ent_167', maturity: 'stable', since: '0.1.0' },\n  { name: 'brand_asset', type_id: 'ent_168', maturity: 'stable', since: '0.1.0' },\n  { name: 'internal_doc', type_id: 'ent_169', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'document' },\n  { name: 'prompt_template', type_id: 'ent_170', maturity: 'stable', since: '0.1.0' },\n  { name: 'content_calendar', type_id: 'ent_171', maturity: 'stable', since: '0.1.0' },\n  { name: 'content_theme', type_id: 'ent_172', maturity: 'stable', since: '0.1.0' },\n  { name: 'documentation_template', type_id: 'ent_173', maturity: 'stable', since: '0.1.0' },\n  { name: 'document', type_id: 'ent_320', maturity: 'stable', since: '0.2.0' },\n\n  // ── Legal & Compliance ──\n  { name: 'compliance_requirement', type_id: 'ent_174', maturity: 'stable', since: '0.1.0' },\n  { name: 'risk', type_id: 'ent_175', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_contract', type_id: 'ent_176', maturity: 'stable', since: '0.1.0' },\n  { name: 'legal_entity', type_id: 'ent_177', maturity: 'stable', since: '0.1.0' },\n  { name: 'ip_asset', type_id: 'ent_178', maturity: 'stable', since: '0.1.0' },\n  { name: 'audit_log_policy', type_id: 'ent_179', maturity: 'stable', since: '0.1.0' },\n  { name: 'contract', type_id: 'ent_180', maturity: 'stable', since: '0.1.0' },\n  { name: 'contract_clause', type_id: 'ent_181', maturity: 'stable', since: '0.1.0' },\n  { name: 'privacy_policy', type_id: 'ent_182', maturity: 'stable', since: '0.1.0' },\n  { name: 'compliance_framework', type_id: 'ent_183', maturity: 'stable', since: '0.1.0' },\n  { name: 'security_audit', type_id: 'ent_184', maturity: 'stable', since: '0.1.0' },\n\n  // ── DevOps & Platform ──\n  { name: 'service_level_indicator', type_id: 'ent_185', maturity: 'stable', since: '0.1.0' },\n  { name: 'sli', type_id: 'ent_334', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'service_level_indicator' },\n  { name: 'service_level_objective', type_id: 'ent_186', maturity: 'stable', since: '0.1.0' },\n  { name: 'slo', type_id: 'ent_335', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'service_level_objective' },\n  { name: 'error_budget', type_id: 'ent_187', maturity: 'stable', since: '0.1.0' },\n  { name: 'incident', type_id: 'ent_188', maturity: 'stable', since: '0.1.0' },\n  { name: 'postmortem', type_id: 'ent_189', maturity: 'stable', since: '0.1.0' },\n  { name: 'runbook', type_id: 'ent_190', maturity: 'stable', since: '0.1.0' },\n  { name: 'monitor', type_id: 'ent_191', maturity: 'stable', since: '0.1.0' },\n  { name: 'alert_rule', type_id: 'ent_192', maturity: 'stable', since: '0.1.0' },\n  { name: 'ci_pipeline', type_id: 'ent_193', maturity: 'stable', since: '0.1.0' },\n  { name: 'release_strategy', type_id: 'ent_194', maturity: 'stable', since: '0.1.0' },\n  { name: 'on_call_rotation', type_id: 'ent_195', maturity: 'stable', since: '0.1.0' },\n  { name: 'infrastructure_component', type_id: 'ent_196', maturity: 'stable', since: '0.1.0' },\n\n  // ── Security ──\n  { name: 'threat_model', type_id: 'ent_197', maturity: 'stable', since: '0.1.0' },\n  { name: 'threat', type_id: 'ent_198', maturity: 'stable', since: '0.1.0' },\n  { name: 'vulnerability', type_id: 'ent_199', maturity: 'stable', since: '0.1.0' },\n  { name: 'security_control', type_id: 'ent_200', maturity: 'stable', since: '0.1.0' },\n  { name: 'security_policy', type_id: 'ent_201', maturity: 'stable', since: '0.1.0' },\n  { name: 'security_incident', type_id: 'ent_202', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'incident' },\n  { name: 'penetration_test', type_id: 'ent_203', maturity: 'stable', since: '0.1.0' },\n  { name: 'security_review', type_id: 'ent_204', maturity: 'stable', since: '0.1.0' },\n  { name: 'data_classification', type_id: 'ent_205', maturity: 'stable', since: '0.1.0' },\n  { name: 'access_policy', type_id: 'ent_206', maturity: 'stable', since: '0.1.0' },\n\n  // ── Accessibility ──\n  { name: 'a11y_standard', type_id: 'ent_207', maturity: 'stable', since: '0.1.0' },\n  { name: 'a11y_guideline', type_id: 'ent_208', maturity: 'stable', since: '0.1.0' },\n  { name: 'a11y_audit', type_id: 'ent_209', maturity: 'stable', since: '0.1.0' },\n  { name: 'a11y_issue', type_id: 'ent_210', maturity: 'stable', since: '0.1.0' },\n  { name: 'a11y_annotation', type_id: 'ent_211', maturity: 'stable', since: '0.1.0' },\n\n  // ── QA & Testing ──\n  { name: 'test_suite', type_id: 'ent_212', maturity: 'stable', since: '0.1.0' },\n  { name: 'test_case', type_id: 'ent_213', maturity: 'stable', since: '0.1.0' },\n  { name: 'qa_session', type_id: 'ent_214', maturity: 'stable', since: '0.1.0' },\n  { name: 'regression_test', type_id: 'ent_215', maturity: 'stable', since: '0.1.0' },\n  { name: 'test_coverage_report', type_id: 'ent_216', maturity: 'stable', since: '0.1.0' },\n  { name: 'test_environment', type_id: 'ent_217', maturity: 'stable', since: '0.1.0' },\n  { name: 'defect_report', type_id: 'ent_218', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'support_ticket' },\n  { name: 'test_result', type_id: 'ent_327', maturity: 'proposed', since: '0.2.0' },\n\n  // ── Feedback & Voice of Customer ──\n  { name: 'feedback_program', type_id: 'ent_219', maturity: 'stable', since: '0.1.0' },\n  { name: 'feature_request', type_id: 'ent_220', maturity: 'stable', since: '0.1.0' },\n  { name: 'feedback_vote', type_id: 'ent_221', maturity: 'stable', since: '0.1.0' },\n  { name: 'nps_campaign', type_id: 'ent_222', maturity: 'stable', since: '0.1.0' },\n  { name: 'user_advisory_board', type_id: 'ent_223', maturity: 'stable', since: '0.1.0' },\n  { name: 'beta_program', type_id: 'ent_224', maturity: 'stable', since: '0.1.0' },\n  { name: 'feedback_theme', type_id: 'ent_225', maturity: 'stable', since: '0.1.0' },\n\n  // ── Pricing & Packaging ──\n  { name: 'pricing_strategy', type_id: 'ent_226', maturity: 'stable', since: '0.1.0' },\n  { name: 'pricing_experiment', type_id: 'ent_227', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'experiment' },\n  { name: 'package', type_id: 'ent_228', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'pricing_tier' },\n  { name: 'discount_strategy', type_id: 'ent_229', maturity: 'stable', since: '0.1.0' },\n  { name: 'trial_config', type_id: 'ent_230', maturity: 'stable', since: '0.1.0' },\n  { name: 'paywall', type_id: 'ent_231', maturity: 'stable', since: '0.1.0' },\n\n  // ── AI/ML Operations ──\n  { name: 'ai_model', type_id: 'ent_232', maturity: 'stable', since: '0.1.0' },\n  { name: 'prompt_version', type_id: 'ent_233', maturity: 'stable', since: '0.1.0' },\n  { name: 'eval_benchmark', type_id: 'ent_234', maturity: 'stable', since: '0.1.0' },\n  { name: 'eval_run', type_id: 'ent_235', maturity: 'stable', since: '0.1.0' },\n  { name: 'ai_cost_tracker', type_id: 'ent_236', maturity: 'stable', since: '0.1.0' },\n  { name: 'hallucination_report', type_id: 'ent_237', maturity: 'stable', since: '0.1.0' },\n  { name: 'ai_guardrail', type_id: 'ent_238', maturity: 'stable', since: '0.1.0' },\n  { name: 'model_comparison', type_id: 'ent_239', maturity: 'stable', since: '0.1.0' },\n  { name: 'ai_experiment', type_id: 'ent_323', maturity: 'proposed', since: '0.2.0' },\n  { name: 'ai_dataset', type_id: 'ent_324', maturity: 'proposed', since: '0.2.0' },\n  { name: 'ai_trace', type_id: 'ent_325', maturity: 'proposed', since: '0.2.0' },\n\n  // ── Agentic Workflows ──\n  { name: 'workflow_template', type_id: 'ent_240', maturity: 'stable', since: '0.1.0' },\n  { name: 'workflow_run', type_id: 'ent_241', maturity: 'stable', since: '0.1.0' },\n  { name: 'agent_definition', type_id: 'ent_242', maturity: 'stable', since: '0.1.0' },\n  { name: 'agent_session', type_id: 'ent_243', maturity: 'stable', since: '0.1.0' },\n  { name: 'review_gate', type_id: 'ent_244', maturity: 'stable', since: '0.1.0' },\n  { name: 'approval_record', type_id: 'ent_245', maturity: 'stable', since: '0.1.0' },\n  { name: 'agent_skill', type_id: 'ent_246', maturity: 'stable', since: '0.1.0' },\n  { name: 'agent_hook', type_id: 'ent_247', maturity: 'stable', since: '0.1.0' },\n  { name: 'workflow_artifact', type_id: 'ent_248', maturity: 'stable', since: '0.1.0' },\n  { name: 'agent_task', type_id: 'ent_326', maturity: 'proposed', since: '0.2.0' },\n\n  // ── Portfolio ──\n  { name: 'organization', type_id: 'ent_249', maturity: 'stable', since: '0.1.0' },\n  { name: 'portfolio', type_id: 'ent_250', maturity: 'stable', since: '0.1.0' },\n  { name: 'product_area', type_id: 'ent_251', maturity: 'stable', since: '0.1.0' },\n\n  // ── Sales & Revenue ──\n  { name: 'account', type_id: 'ent_252', maturity: 'stable', since: '0.1.0' },\n  { name: 'contact', type_id: 'ent_253', maturity: 'stable', since: '0.1.0' },\n  { name: 'lead', type_id: 'ent_254', maturity: 'stable', since: '0.1.0' },\n  { name: 'deal', type_id: 'ent_255', maturity: 'stable', since: '0.1.0' },\n  { name: 'pipeline_sales', type_id: 'ent_256', maturity: 'stable', since: '0.1.0' },\n  { name: 'pipeline_stage', type_id: 'ent_257', maturity: 'stable', since: '0.1.0' },\n  { name: 'quote_document', type_id: 'ent_258', maturity: 'stable', since: '0.1.0' },\n  { name: 'subscription', type_id: 'ent_259', maturity: 'stable', since: '0.1.0' },\n  { name: 'invoice', type_id: 'ent_260', maturity: 'stable', since: '0.1.0' },\n  { name: 'forecast', type_id: 'ent_261', maturity: 'stable', since: '0.1.0' },\n\n  // ── Program Management ──\n  { name: 'program', type_id: 'ent_262', maturity: 'stable', since: '0.1.0' },\n  { name: 'project', type_id: 'ent_263', maturity: 'stable', since: '0.1.0' },\n  // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,\n  // not one project's checkpoint — an org-wide \"Open Beta\" that several products'\n  // projects must all satisfy. Shared tier lets `project_targets_milestone` (and\n  // the other milestone edges) pass the cross-scope gate as `provisional`, same\n  // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).\n  { name: 'milestone', type_id: 'ent_264', maturity: 'stable', since: '0.1.0', portfolio_shared: true },\n  { name: 'risk_register', type_id: 'ent_265', maturity: 'stable', since: '0.1.0' },\n  { name: 'risk_item', type_id: 'ent_266', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'risk' },\n  { name: 'change_request', type_id: 'ent_267', maturity: 'stable', since: '0.1.0' },\n  { name: 'deliverable', type_id: 'ent_268', maturity: 'stable', since: '0.1.0' },\n  { name: 'resource_allocation', type_id: 'ent_269', maturity: 'stable', since: '0.1.0' },\n  { name: 'status_report', type_id: 'ent_270', maturity: 'stable', since: '0.1.0' },\n\n  // ── Marketing Operations ──\n  { name: 'marketing_strategy', type_id: 'ent_271', maturity: 'stable', since: '0.1.0' },\n  { name: 'marketing_channel', type_id: 'ent_272', maturity: 'stable', since: '0.1.0' },\n  { name: 'marketing_campaign_plan', type_id: 'ent_273', maturity: 'stable', since: '0.1.0' },\n  { name: 'email_sequence', type_id: 'ent_274', maturity: 'stable', since: '0.1.0' },\n  { name: 'social_post', type_id: 'ent_275', maturity: 'stable', since: '0.1.0' },\n  { name: 'seo_keyword', type_id: 'ent_276', maturity: 'stable', since: '0.1.0' },\n  { name: 'ad_creative', type_id: 'ent_277', maturity: 'stable', since: '0.1.0' },\n  { name: 'press_release', type_id: 'ent_278', maturity: 'stable', since: '0.1.0' },\n  { name: 'event', type_id: 'ent_279', maturity: 'stable', since: '0.1.0' },\n  { name: 'community_initiative', type_id: 'ent_280', maturity: 'stable', since: '0.1.0' },\n\n  // ── Operations & Customer Success ──\n  { name: 'support_ticket', type_id: 'ent_281', maturity: 'stable', since: '0.1.0' },\n  { name: 'customer_feedback', type_id: 'ent_282', maturity: 'stable', since: '0.1.0' },\n  { name: 'churn_reason', type_id: 'ent_283', maturity: 'stable', since: '0.1.0' },\n  { name: 'onboarding_flow', type_id: 'ent_284', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'user_flow' },\n  { name: 'customer_health_score', type_id: 'ent_285', maturity: 'stable', since: '0.1.0' },\n  { name: 'playbook', type_id: 'ent_286', maturity: 'stable', since: '0.1.0' },\n  { name: 'service_level_agreement', type_id: 'ent_287', maturity: 'stable', since: '0.1.0' },\n  { name: 'sla', type_id: 'ent_336', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.2.0', replacement: 'service_level_agreement' },\n  { name: 'customer_journey_stage', type_id: 'ent_288', maturity: 'stable', since: '0.1.0' },\n  { name: 'touchpoint', type_id: 'ent_289', maturity: 'stable', since: '0.1.0' },\n  { name: 'success_milestone', type_id: 'ent_290', maturity: 'stable', since: '0.1.0' },\n  { name: 'service_blueprint', type_id: 'ent_291', maturity: 'stable', since: '0.1.0' },\n  { name: 'nps_score', type_id: 'ent_292', maturity: 'deprecated', since: '0.1.0', deprecated_in: '0.1.0', replacement: 'nps_campaign' },\n\n  // ── Localisation & i18n ──\n  { name: 'locale', type_id: 'ent_293', maturity: 'stable', since: '0.1.0' },\n  { name: 'translation_key', type_id: 'ent_294', maturity: 'stable', since: '0.1.0' },\n  { name: 'translation_bundle', type_id: 'ent_295', maturity: 'stable', since: '0.1.0' },\n  { name: 'locale_config', type_id: 'ent_296', maturity: 'stable', since: '0.1.0' },\n  { name: 'cultural_adaptation', type_id: 'ent_297', maturity: 'stable', since: '0.1.0' },\n  { name: 'regional_pricing', type_id: 'ent_298', maturity: 'stable', since: '0.1.0' },\n\n  // ── Customer Education ──\n  { name: 'education_program', type_id: 'ent_299', maturity: 'stable', since: '0.1.0' },\n  { name: 'tutorial', type_id: 'ent_300', maturity: 'stable', since: '0.1.0' },\n  { name: 'walkthrough', type_id: 'ent_301', maturity: 'stable', since: '0.1.0' },\n  { name: 'webinar', type_id: 'ent_302', maturity: 'stable', since: '0.1.0' },\n  { name: 'certification', type_id: 'ent_303', maturity: 'stable', since: '0.1.0' },\n  { name: 'help_video', type_id: 'ent_304', maturity: 'stable', since: '0.1.0' },\n  { name: 'learning_path', type_id: 'ent_305', maturity: 'stable', since: '0.1.0' },\n\n  // ── Partners & Ecosystem ──\n  { name: 'partner_program', type_id: 'ent_306', maturity: 'stable', since: '0.1.0' },\n  { name: 'partner_tier', type_id: 'ent_307', maturity: 'stable', since: '0.1.0' },\n  { name: 'api_ecosystem', type_id: 'ent_308', maturity: 'stable', since: '0.1.0' },\n  { name: 'marketplace_listing', type_id: 'ent_309', maturity: 'stable', since: '0.1.0' },\n  { name: 'developer_portal', type_id: 'ent_310', maturity: 'stable', since: '0.1.0' },\n  { name: 'integration_partner', type_id: 'ent_311', maturity: 'stable', since: '0.1.0' },\n  { name: 'partner_revenue_share', type_id: 'ent_312', maturity: 'stable', since: '0.1.0' },\n\n  // ── Workspace ──\n  { name: 'workspace', type_id: 'ent_328', maturity: 'proposed', since: '0.2.0' },\n  { name: 'framework_exercise', type_id: 'ent_350', maturity: 'proposed', since: '0.8.4' },\n  { name: 'composition', type_id: 'ent_361', maturity: 'proposed', since: '0.31.0' },\n  // A dated, hashed rendition of a node that is already in the graph. Enters\n  // `proposed` per the maturity rubric (precedent: composition 0.31.0).\n  { name: 'capture', type_id: 'ent_362', maturity: 'proposed', since: '0.32.0' },\n] as const\n\n/**\n * Proposed entity types deliberately HELD at `proposed` by an open contract or\n * ADR, even where the mechanical promotion rubric (≥2 framework refs, ≥3\n * properties, lifecycle-or-free) would otherwise pass them. The freeze is a\n * decision, not an oversight: graduating one means deciding its contract is\n * settled enough to lift. Single source of truth for both the graduation test\n * (`maturity-graduation.test.ts`) and the promotion auditor\n * (`scripts/audit-proposed-promotion.ts`), so the rubric checker never invites a\n * graduation a contract forbids. Maps each type to its governing decision.\n */\nexport const DEFERRED_PROPOSED_BY_CONTRACT: Readonly<Record<string, string>> = {\n  // user_story (UPG-571) and experiment_run (UPG-664) graduated to stable in\n  // 0.12.6 — Captain lifted both freezes (\"we are using them\"). Their contracts\n  // are settled; they are now stable, not deferred.\n  ai_experiment: 'UPG-665: AI prompt/model restructure (open ADR).',\n  ai_dataset: 'UPG-665: AI prompt/model restructure (open ADR).',\n  ai_trace: 'UPG-665: AI prompt/model restructure (open ADR).',\n}\n\n// ─── Lookup helpers ────────────────────────────────────────────────────────────\n\n/** O(1) lookup: type name → metadata */\nexport const UPG_ENTITY_META_BY_NAME: ReadonlyMap<string, EntityTypeMeta> = new Map(\n  UPG_ENTITY_META.map((m) => [m.name, m]),\n)\n\n/** O(1) lookup: type_id → metadata */\nexport const UPG_ENTITY_META_BY_ID: ReadonlyMap<string, EntityTypeMeta> = new Map(\n  UPG_ENTITY_META.map((m) => [m.type_id, m]),\n)\n\n/** All active (non-deprecated, non-removed) type names */\nexport const UPG_ACTIVE_TYPES: readonly string[] = UPG_ENTITY_META\n  .filter((m) => m.maturity === 'stable' || m.maturity === 'proposed')\n  .map((m) => m.name)\n\n/** All deprecated type names */\nexport const UPG_DEPRECATED_TYPES: readonly string[] = UPG_ENTITY_META\n  .filter((m) => m.maturity === 'deprecated')\n  .map((m) => m.name)\n\n/**\n * The portfolio-shared entity types (0.18.0), derived from the `portfolio_shared`\n * flag on the records above — single source of truth, same derive-from-records\n * pattern as `UPG_ACTIVE_TYPES`. The 26 canonical / above-product types a second\n * product graph can reference. Snapshot-guarded (`cross-product-edges.test.ts`) so\n * adding or removing a shared tag is a deliberate, reviewed change.\n */\nexport const UPG_PORTFOLIO_SHARED_TYPES: readonly string[] = UPG_ENTITY_META\n  .filter((m) => m.portfolio_shared === true)\n  .map((m) => m.name)\n\n/**\n * Check if an entity type is portfolio-shared (0.18.0): a canonical / above-product\n * type a second product graph can point at. The necessary condition for a\n * cross-product edge — see `isCrossCapable` / `crossProductScope`.\n *\n * @example\n * isPortfolioSharedType('metric')   // → true\n * isPortfolioSharedType('persona')  // → false (echoable via shares_persona, not resident)\n * isPortfolioSharedType('product')  // → false (a graph root, not a shared reference target)\n */\nexport function isPortfolioSharedType(name: string): boolean {\n  return UPG_ENTITY_META_BY_NAME.get(name)?.portfolio_shared === true\n}\n\n/**\n * Check if a type name is deprecated.\n *\n * @example\n * isDeprecatedType('pain_point')   // → true  (replaced by 'need')\n * isDeprecatedType('package')      // → true  (replaced by 'pricing_tier')\n * isDeprecatedType('persona')      // → false\n * isDeprecatedType('not_a_type')   // → false (unknown types are not \"deprecated\")\n */\nexport function isDeprecatedType(name: string): boolean {\n  const meta = UPG_ENTITY_META_BY_NAME.get(name)\n  return meta?.maturity === 'deprecated'\n}\n\n/**\n * Get the replacement type for a deprecated type.\n *\n * @example\n * getReplacementType('pain_point')   // → 'need'\n * getReplacementType('package')      // → 'pricing_tier'\n * getReplacementType('persona')      // → undefined   (still canonical)\n */\nexport function getReplacementType(name: string): string | undefined {\n  const meta = UPG_ENTITY_META_BY_NAME.get(name)\n  return meta?.replacement\n}\n\n/**\n * Resolve a type name to its type_id (stable across renames).\n *\n * @example\n * getTypeId('persona')     // → 'ent_016'\n * getTypeId('package')     // → 'ent_228'  (id survives the rename to 'pricing_tier')\n * getTypeId('not_a_type')  // → undefined\n */\nexport function getTypeId(name: string): string | undefined {\n  return UPG_ENTITY_META_BY_NAME.get(name)?.type_id\n}\n\n/**\n * Resolve a type_id back to its current name.\n *\n * @example\n * getTypeName('ent_016')   // → 'persona'\n * getTypeName('ent_018')   // → 'pain_point' (deprecated; see `getReplacementType`)\n * getTypeName('ent_9999')  // → undefined\n */\nexport function getTypeName(typeId: string): string | undefined {\n  return UPG_ENTITY_META_BY_ID.get(typeId)?.name\n}\n","/**\n * UPG Domains. 36 flat semantic groupings of entity types.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGEntityType } from '../catalog/entity-catalog.js'\nimport { isDeprecatedType, getReplacementType } from './entity-meta.js'\n\n// ─── Domain definition ──────────────────────────────────────────────────────────\n\n/**\n * A semantic domain: a flat grouping of related entity types.\n *\n * @example\n * const userDomain: UPGDomain = {\n *   id: 'user',\n *   label: 'User',\n *   description: 'Who your users are and what drives them.',\n *   types: ['persona', 'job', 'need', 'desired_outcome', 'job_step', 'switching_cost'],\n * }\n */\nexport interface UPGDomain {\n  /** Machine-readable domain identifier */\n  id: string\n  /** Human-readable domain name */\n  label: string\n  /** Short description of what this domain covers */\n  description: string\n  /** Entity types in this domain */\n  types: readonly string[]\n}\n\n// ─── Domain registry ────────────────────────────────────────────────────────────\n\n// No explicit type annotation; `as const satisfies` preserves the literal ID\n// tuple so `UPGDomainId` below resolves to a proper union.\nexport const UPG_DOMAINS = [\n  {\n    id: 'strategy',\n    label: 'Strategy',\n    description: 'The high-level direction of your product. Tracks the product itself, vision, mission, strategic themes, strategic pillars, initiatives, and capabilities that define what to build. Outcomes, objectives, and key results (OKRs) measure progress. Metrics quantify success. Assumptions and decisions record the reasoning. Value streams map how value flows. Connects upward to Portfolio and downward to Product Specification and Discovery.',\n    types: [\n      'product', 'outcome', 'objective', 'key_result', 'metric',\n      'metric_quality_assessment',\n      'vision', 'mission', 'strategic_theme', 'initiative', 'capability',\n      'value_stream', 'strategic_pillar', 'assumption', 'decision',\n      'constraint', 'strategic_question',\n    ],\n  },\n  {\n    id: 'user',\n    label: 'User',\n    description: 'Who your users are and what drives them. Personas represent user archetypes. Jobs capture what users are trying to accomplish, broken into job steps. Needs are the gaps users experience. Desired outcomes define what success looks like. Switching costs capture barriers to change. Feeds into Discovery, Experience Design, and Strategy.',\n    types: [\n      'persona', 'job', 'need', 'desired_outcome',\n      'job_step', 'switching_cost',\n    ],\n  },\n  {\n    id: 'discovery',\n    label: 'Discovery',\n    description: 'Finding and shaping what to build next. Opportunities capture unmet needs worth pursuing. Solutions are candidate responses to opportunities. Feasibility studies assess viability. Design sprints are time-boxed exploration cycles. Bridges User (unmet needs) and Validation (testing ideas) to produce candidates for Product Specification.',\n    types: ['opportunity', 'solution', 'feasibility_study', 'design_sprint'],\n  },\n  {\n    id: 'validation',\n    label: 'Validation',\n    description: 'Testing ideas before committing to build them. Hypotheses state testable beliefs. Experiment plans structure the validation design. Experiments run the tests, with experiment runs capturing replication. Evidence captures what was observed. Learnings distill what was understood. Research plans coordinate broader investigation. Consumes opportunities from Discovery and insights from User Research, producing evidence that informs Strategy and Product Specification.',\n    types: ['hypothesis', 'experiment', 'experiment_plan', 'experiment_run', 'learning', 'evidence', 'research_plan'],\n  },\n  {\n    id: 'market_intelligence',\n    label: 'Market Intelligence',\n    description: 'The competitive landscape your product operates in. Competitors and their competitor features map the field. Market trends track industry shifts. Market segments define addressable audiences. Competitive analyses synthesize the full picture. Classification axes and values express the dimensional structure of the landscape (e.g. CMS Architecture × Editing Paradigm). Informs Strategy (positioning), Go-To-Market (battle cards), and Business Model (differentiation).',\n    types: ['competitor', 'competitor_feature', 'competitor_signal', 'market_trend', 'market_segment', 'competitive_analysis', 'classification_axis', 'classification_value'],\n  },\n  {\n    id: 'user_research',\n    label: 'User Research',\n    description: 'Primary research with real users. Research studies are the container. Participants are who you talk to. Interview guides structure conversations. Observations capture what you see. Quotes preserve exact words. Survey responses collect structured input. Affinity clusters group patterns. Research questions frame what you want to learn. Insights synthesize findings. Feeds User (persona refinement), Discovery (opportunities), and Validation (hypotheses).',\n    types: [\n      'research_study', 'insight', 'participant', 'observation',\n      'quote', 'affinity_cluster', 'research_question', 'interview_guide',\n      'survey_response',\n    ],\n  },\n  {\n    id: 'ux_design',\n    label: 'Experience Design',\n    description: 'How users experience and interact with your product. User journeys map end-to-end experiences, broken into journey steps. User flows chart navigation paths. Screens and screen states define what users see. Surfaces name the places inside a screen, who may occupy them, and the rule that settles contention. Design questions frame open problems. Design concepts explore possible solutions. Prototypes and wireframes make ideas tangible. Connects User (who) to Product Specification (what) through Design System (how).',\n    types: ['user_journey', 'journey_step', 'journey_phase', 'journey_action', 'user_flow', 'screen', 'screen_state', 'surface', 'design_question', 'design_concept', 'prototype', 'wireframe'],\n  },\n  {\n    id: 'design_system',\n    label: 'Design System',\n    description: 'The reusable building blocks of your product UI. The design system entity anchors the collection. Design components are the atoms. Design tokens encode colour, spacing, and typography values. Design patterns document recurring solutions. Design guidelines codify usage rules. Annotations mark up designs with notes. Interaction specs define behaviour contracts. Ensures consistency across Experience Design and Engineering. Referenced by Accessibility.',\n    types: ['design_component', 'design_token', 'design_system', 'design_pattern', 'design_guideline', 'annotation', 'interaction_spec'],\n  },\n  {\n    id: 'brand',\n    label: 'Brand Identity',\n    description: 'Your product\\'s visual and verbal identity. Brand identity is the root entity. Brand colour, brand typography, brand voice, brand logo, and brand imagery define the palette, type system, tone, mark, and visual language. Design System implements these at the component level. Go-To-Market applies them in external communications.',\n    types: ['brand_identity', 'brand_colour', 'brand_typography', 'brand_voice', 'brand_logo', 'brand_imagery', 'brand_asset'],\n  },\n  {\n    id: 'product_spec',\n    label: 'Product Specification',\n    description: 'What you are building and shipping. Feature areas group related capabilities. Features, epics, and user stories break work down. Acceptance criteria define done. Tasks and bugs track execution. Releases and changelogs mark what shipped. Roadmaps and roadmap items plan what comes next. Roadmap themes group roadmap work around the customer problem it solves, one level down from the strategic themes in Strategy. Planning cycles are the cadence axis: the named, dated, self-nesting intervals (sprint, iteration, quarter, program increment, cooldown) that work is scheduled through. Translates Strategy into Engineering and tracks delivery through Program Management.',\n    types: [\n      'feature', 'feature_area', 'epic', 'user_story', 'acceptance_criterion', 'release',\n      'task', 'bug', 'roadmap', 'roadmap_item', 'roadmap_theme', 'changelog',\n      'planning_cycle', 'configuration_axis',\n    ],\n  },\n  {\n    id: 'engineering',\n    label: 'Engineering',\n    description: 'The technical architecture and implementation. Bounded contexts, aggregates, domain entities, value objects, commands, read models, and domain events model the domain. Services, API contracts, API endpoints, and database schemas define interfaces. Queue topics and integration patterns connect systems. External APIs and library dependencies track what you consume. Data flows map how information moves. Code repositories and build artifacts track source and output. Feature flags gate rollout. Deployments mark releases. Technical debt items track shortcuts. Investigations, root causes, symptoms, and fixes handle incidents. Relies on DevOps and Security.',\n    types: [\n      'bounded_context', 'service', 'domain_event', 'api_contract',\n      'technical_debt_item', 'feature_flag', 'deployment', 'aggregate', 'domain_entity',\n      'value_object', 'command', 'read_model', 'api_endpoint', 'database_schema',\n      'queue_topic', 'build_artifact', 'code_repository', 'library_dependency',\n      'integration_pattern', 'external_api', 'data_flow',\n      'investigation', 'root_cause', 'symptom', 'fix',\n    ],\n  },\n  {\n    id: 'growth',\n    label: 'Growth',\n    description: 'How your product acquires, activates, and retains users. Funnels and funnel steps model conversion paths. Acquisition channels track where users come from. Growth campaigns run targeted experiments. Cohorts group users by behaviour or timing. Behavioral segments slice the user base. Growth loops model self-reinforcing cycles. Variants track A/B test alternatives. Attribution models assign credit across touchpoints. Connects to Data & Analytics, Marketing, and Business Model.',\n    types: [\n      'funnel', 'funnel_step', 'acquisition_channel',\n      'growth_campaign', 'cohort', 'behavioral_segment', 'growth_loop', 'variant',\n      'attribution_model',\n    ],\n  },\n  {\n    id: 'business_model',\n    label: 'Business Model',\n    description: 'How your product creates and captures value. The business model entity anchors the canvas. Value propositions define why customers buy. Revenue streams and pricing tiers model income. Cost structures and unit economics track spend. Partnerships and key resources identify what you need. Key activities define what you do. Target customer segments specify who you serve. Customer relationships describe how you engage. Distribution channels map how you deliver. Connects Strategy to Pricing & Packaging and Sales.',\n    types: [\n      'business_model', 'value_proposition', 'revenue_stream',\n      'cost_structure', 'unit_economics', 'partnership', 'key_resource', 'key_activity',\n      'customer_relationship', 'distribution_channel',\n    ],\n  },\n  {\n    id: 'go_to_market',\n    label: 'Go-To-Market',\n    description: 'Your plan to bring the product to market. GTM strategies set the overall approach. Ideal customer profiles define who to target. Positioning and messaging frame how you talk about it. Launches coordinate market entry. Content strategies plan thought leadership. Sales motions define how you sell. Competitive battle cards arm the team. Demand gen programs drive pipeline. Territories segment the market. Objections, rebuttals, and proof points handle resistance. Translates Market Intelligence and Business Model into Marketing and Sales.',\n    types: [\n      'gtm_strategy', 'ideal_customer_profile', 'positioning', 'messaging', 'launch',\n      'content_strategy', 'sales_motion', 'competitive_battle_card', 'demand_gen_program',\n      'territory', 'objection', 'rebuttal', 'proof_point',\n    ],\n  },\n  {\n    id: 'team_org',\n    label: 'Team & Organisation',\n    description: 'The people and structure behind the product. Teams are the units. Roles define responsibilities. Stakeholders track who has influence. People name accountable individuals. Team OKRs set team-level goals. Retrospectives capture team learnings. Dependencies map cross-team blockers. Departments structure the org. Skills track capabilities. Ceremonies define recurring rituals. Capacity plans model available effort. Connects to Program Management and Product Specification.',\n    types: [\n      'team', 'role', 'stakeholder', 'person', 'team_okr', 'retrospective',\n      'dependency', 'department', 'skill', 'ceremony', 'capacity_plan',\n    ],\n  },\n  {\n    id: 'data_analytics',\n    label: 'Data & Analytics',\n    description: 'How you measure and understand your product. Data sources define where data comes from. Event schemas standardize tracking. Data models structure the warehouse. Data pipelines move data between systems. Data lineage traces provenance. Data quality rules enforce standards. Data products package data for consumption. Data domains organize ownership. Dashboards and reports visualize insights. Glossary terms align vocabulary. Provides the measurement layer for Growth, Strategy, and Quality Assurance.',\n    types: [\n      'data_source', 'event_schema', 'dashboard',\n      'data_model', 'data_quality_rule', 'data_product', 'data_pipeline', 'data_lineage',\n      'glossary_term', 'data_domain', 'report',\n    ],\n  },\n  {\n    id: 'content',\n    label: 'Content & Knowledge',\n    description: 'All content your product team creates and manages. Content pieces are individual assets. Knowledge base articles serve users. Brand assets store visual collateral. Internal docs capture team knowledge. Prompt templates standardize AI interactions. Content calendars plan publication. Content themes group editorial focus. Documentation templates ensure consistency. Documents are general-purpose containers. Supports Marketing, Customer Education, and Customer Success.',\n    types: [\n      'content_piece', 'knowledge_base_article',\n      'content_calendar', 'content_theme', 'documentation_template',\n      'document',\n    ],\n  },\n  {\n    id: 'legal',\n    label: 'Legal',\n    description: 'Legal structure and intellectual property protection. Legal entities define corporate structure. IP assets track patents, trademarks, and copyrights. Contracts and contract clauses manage agreements. Privacy policies govern data handling. Connects to Compliance (regulatory requirements), Security (data classification), and Business Model (partnership agreements).',\n    types: ['legal_entity', 'ip_asset', 'contract', 'contract_clause', 'privacy_policy'],\n  },\n  {\n    id: 'devops',\n    label: 'DevOps & Platform',\n    description: 'The reliability and infrastructure layer. Service level indicators (SLIs) and service level objectives (SLOs) define targets. Error budgets track risk tolerance. Incidents and postmortems handle failures. Runbooks document response procedures. Monitors and alert rules detect problems. CI pipelines automate builds. Release strategies govern rollout. On-call rotations assign responsibility. Infrastructure components model the platform. Supports Engineering and connects to Security and Quality Assurance.',\n    types: [\n      'service_level_indicator', 'service_level_objective', 'error_budget', 'incident', 'postmortem', 'runbook', 'monitor',\n      'alert_rule', 'ci_pipeline', 'release_strategy', 'on_call_rotation',\n      'infrastructure_component',\n    ],\n  },\n  {\n    id: 'security',\n    label: 'Security',\n    description: 'Protecting your product and its users. Threat models map attack surfaces. Threats identify specific risks. Vulnerabilities track known weaknesses. Security controls are the mitigations. Security policies set rules. Penetration tests verify defences. Security reviews assess posture. Data classifications label sensitivity. Access policies govern who can reach what. Connects to Engineering, Compliance, and DevOps.',\n    types: [\n      'threat_model', 'threat', 'vulnerability', 'security_control', 'security_policy',\n      'penetration_test', 'security_review', 'data_classification',\n      'access_policy',\n    ],\n  },\n  {\n    id: 'accessibility',\n    label: 'Accessibility',\n    description: 'Ensuring your product is usable by everyone. A11y standards define the bar (WCAG, etc.). A11y guidelines translate standards into actionable rules. A11y audits assess compliance. A11y issues track violations. A11y annotations mark up designs with accessibility notes. Connects to Design System (component compliance), Experience Design (journey inclusion), and Quality Assurance (testing coverage).',\n    types: ['a11y_standard', 'a11y_guideline', 'a11y_audit', 'a11y_issue', 'a11y_annotation'],\n  },\n  {\n    id: 'testing',\n    label: 'Quality Assurance',\n    description: 'Verifying your product works correctly. Test plans define the verification approach (scope, environments, pass criteria). Test suites group related tests. Test cases define individual checks. QA sessions capture exploratory testing. Regression tests guard against regressions. Test coverage reports measure completeness. Test environments define where tests run. Test results record outcomes. Validates Engineering (code quality) and Product Specification (acceptance criteria). Feeds DevOps (release confidence).',\n    types: [\n      'test_plan', 'test_suite', 'test_case', 'qa_session', 'regression_test', 'test_coverage_report',\n      'test_environment', 'test_result',\n    ],\n  },\n  {\n    id: 'feedback',\n    label: 'Customer Feedback',\n    description: 'The voice of your customers after they use your product. Feedback programs are the containers. Feature requests capture what customers want. Feedback votes quantify demand. NPS campaigns measure satisfaction. User advisory boards provide structured input. Beta programs test with early adopters. Feedback themes group recurring patterns. Feeds User Research (patterns), Discovery (opportunities), and Strategy (priorities).',\n    types: [\n      'feedback_program', 'feature_request', 'feedback_vote', 'nps_campaign',\n      'user_advisory_board', 'beta_program', 'feedback_theme',\n    ],\n  },\n  {\n    id: 'pricing',\n    label: 'Pricing & Packaging',\n    description: 'How you package and price your product. Pricing strategies set the overall approach. Pricing tiers define what customers buy, bundling features, trials, gates, and discounts. Discount strategies manage promotions. Trial configs define free-to-paid conversion mechanics. Paywalls gate premium features. Connects Business Model (revenue streams) to Growth (conversion optimization) and Sales (deal structure).',\n    types: [\n      'pricing_strategy', 'pricing_tier', 'discount_strategy',\n      'trial_config', 'paywall',\n    ],\n  },\n  {\n    id: 'ai',\n    label: 'AI & Machine Learning',\n    description: 'AI and machine learning capabilities within your product. AI models track deployed models. Prompt templates define reusable prompts; prompt versions manage their evolution. Eval benchmarks and eval runs measure quality. AI cost trackers monitor spend. Hallucination reports flag reliability issues. AI guardrails set safety boundaries. Model comparisons evaluate alternatives. AI experiments test new approaches. AI datasets track training data. AI traces log inference chains. Connects to Engineering, Data & Analytics, and Product Specification.',\n    types: [\n      'ai_model', 'prompt_version', 'eval_benchmark', 'eval_run', 'ai_cost_tracker',\n      'hallucination_report', 'ai_guardrail', 'model_comparison',\n      'ai_experiment', 'ai_dataset', 'ai_trace', 'prompt_template',\n    ],\n  },\n  {\n    id: 'automation',\n    label: 'Workflows & Agents',\n    description: 'Automated processes and AI agents that operate on your product graph. Workflow templates define reusable processes. Workflow runs are executions. Workflow artifacts are outputs. Agent definitions describe autonomous agents. Agent sessions track their work. Agent skills define capabilities. Agent hooks wire triggers. Agent tasks are discrete units of agent work. Review gates enforce human checkpoints. Approval records log decisions. Extends Engineering and AI to reduce manual work across all domains.',\n    types: [\n      'workflow_template', 'workflow_run', 'agent_definition', 'agent_session',\n      'review_gate', 'approval_record', 'agent_skill', 'agent_hook', 'workflow_artifact',\n      'agent_task',\n    ],\n  },\n  {\n    id: 'portfolio',\n    label: 'Portfolio',\n    description: 'Multi-product management and organisational hierarchy. Organizations are the top-level entity. Portfolios group products by strategic axis (where you invest). Product areas group products by organisational axis (who owns what). Provides the container for Strategy (per-product direction) and enables cross-product edges that connect shared users, features, and infrastructure.',\n    types: ['organization', 'portfolio', 'product_area'],\n  },\n  {\n    id: 'sales',\n    label: 'Sales & Revenue',\n    description: 'Revenue operations from lead to invoice. Accounts represent companies. Contacts are people within accounts. Leads track inbound interest. Deals are active opportunities. Pipeline sales and pipeline stages model the sales funnel. Quote documents formalize offers. Subscriptions track recurring revenue. Invoices record billing. Forecasts project revenue. Connects Go-To-Market and Pricing & Packaging to Business Model.',\n    types: [\n      'account', 'contact', 'lead', 'deal', 'pipeline_sales', 'pipeline_stage',\n      'quote_document', 'subscription', 'invoice', 'forecast',\n    ],\n  },\n  {\n    id: 'program_mgmt',\n    label: 'Program Management',\n    description: 'Coordinating delivery across teams and timelines. Programs are the highest container. Projects break programs down. Milestones mark key dates, and hang from either a project or, where a product owns the date outright with no program above it, from the product itself. Risk registers track threats to delivery. Change requests manage scope changes. Deliverables define what ships. Resource allocations assign effort. Status reports communicate progress. Connects Product Specification (what to deliver) to Team & Organisation (who delivers).',\n    types: [\n      'program', 'project', 'milestone', 'risk_register', 'change_request',\n      'deliverable', 'resource_allocation', 'status_report',\n    ],\n  },\n  {\n    id: 'marketing',\n    label: 'Marketing',\n    description: 'Executing campaigns that reach your audience. Marketing strategies set direction. Marketing channels define where you reach people. Marketing campaign plans coordinate execution. Email sequences nurture leads. Social posts engage audiences. SEO keywords target search. Ad creatives drive paid acquisition. Press releases announce news. Events create in-person touchpoints. Community initiatives build grassroots engagement. Implements Go-To-Market and feeds Growth.',\n    types: [\n      'marketing_strategy', 'marketing_channel', 'marketing_campaign_plan', 'email_sequence',\n      'social_post', 'seo_keyword', 'ad_creative', 'press_release', 'event',\n      'community_initiative',\n    ],\n  },\n  {\n    id: 'customer_success',\n    label: 'Customer Success',\n    description: 'Keeping customers healthy and reducing churn. Support tickets track issues. Customer feedback captures post-sale voice. Churn reasons explain why customers leave. Customer health scores quantify account risk. Playbooks codify response patterns. Service level agreements set expectations. Customer journey stages map the post-sale arc. Touchpoints track every interaction. Success milestones mark key achievements. Service blueprints model the full service delivery. Connects Customer Feedback to Growth and Product Specification.',\n    types: [\n      'support_ticket', 'customer_feedback', 'churn_reason',\n      'customer_health_score', 'playbook', 'service_level_agreement', 'customer_journey_stage', 'touchpoint',\n      'success_milestone', 'service_blueprint',\n    ],\n  },\n  {\n    id: 'localisation',\n    label: 'Localisation',\n    description: 'Adapting your product for global audiences. Locales define supported languages and regions. Translation keys are individual translatable strings. Translation bundles group keys for deployment. Locale configs store per-locale settings. Cultural adaptations track region-specific adjustments beyond language. Regional pricing models location-based pricing. Connects to Content & Knowledge, Pricing & Packaging, and Experience Design.',\n    types: [\n      'locale', 'translation_key', 'translation_bundle', 'locale_config',\n      'cultural_adaptation', 'regional_pricing',\n    ],\n  },\n  {\n    id: 'education',\n    label: 'Customer Education',\n    description: 'Teaching users how to succeed with your product. Education programs are the containers. Tutorials provide step-by-step instruction. Walkthroughs guide users through features. Webinars deliver live education. Certifications validate mastery. Help videos offer visual guidance. Learning paths sequence content into curricula. Supports Customer Success (onboarding), Content & Knowledge (educational material), and Growth (activation).',\n    types: [\n      'education_program', 'tutorial', 'walkthrough', 'webinar', 'certification',\n      'help_video', 'learning_path',\n    ],\n  },\n  {\n    id: 'ecosystem',\n    label: 'Partners & Ecosystem',\n    description: 'The network of partners and integrations around your product. Partner programs define the structure. Partner tiers segment partners by value. API ecosystems track integration surfaces. Marketplace listings manage distribution. Developer portals serve external builders. Integration partners are specific collaborators. Partner revenue shares model economics. Extends Business Model (partnership value) and Engineering (API ecosystem).',\n    types: [\n      'partner_program', 'partner_tier', 'api_ecosystem', 'marketplace_listing',\n      'developer_portal', 'integration_partner', 'partner_revenue_share',\n    ],\n  },\n  {\n    id: 'compliance',\n    label: 'Compliance',\n    description: 'Meeting regulatory and governance requirements. Compliance frameworks define which standards apply (SOC 2, GDPR, etc.). Compliance requirements are individual mandates. Risks track exposure. Data contracts formalize data-sharing agreements. Audit log policies govern what gets logged. Security audits assess compliance posture. Connects to Legal, Security, and Data & Analytics.',\n    types: ['compliance_requirement', 'risk', 'data_contract', 'audit_log_policy', 'compliance_framework', 'security_audit'],\n  },\n  {\n    id: 'workspace',\n    label: 'Workspace',\n    description: 'Spatial thinking spaces for arranging entities, debating decisions, and committing to the graph. Workspaces are transient canvases that sit alongside all other domains, letting you compose and explore relationships before they become permanent graph structure. A framework exercise is a structured workspace: one run of a framework (MoSCoW, RICE, Kano, …) applied to a chosen set of entities, with each entity\\'s result recorded on the exercise-to-entity edge rather than the entity itself. A composition is the durable other half: a named, published view assembled from a canvas, with a stable slug people link to and a revision history, whose frozen arrangement holds pointers rather than copied content.',\n    types: ['workspace', 'framework_exercise', 'composition', 'capture'],\n  },\n  {\n    id: 'foundations',\n    label: 'Foundations',\n    description: 'The shared specifications and foundational primitives a product organisation stewards or implements everywhere. Specifications are governed specs (query languages, protocols, data formats, encodings) like NQL or Structured Text; primitives are the compositional units those specs define (a block, a reference, a query value). Both are registry-hostable canonicals that products implement, expose, or conform to. Distinct from a product feature: a specification has no single owner, no P&L, and no buyer; it is the rulebook many products point at.',\n    types: ['specification', 'primitive', 'operating_lifecycle', 'operating_stage'],\n  },\n] as const satisfies readonly UPGDomain[]\n\n// ─── Derived domain ID union ────────────────────────────────────────────────────\n\n/**\n * Union of every canonical domain identifier, derived from UPG_DOMAINS.\n *\n * Adding, removing, or renaming a domain updates this type automatically.\n * Do NOT maintain a separate list here.\n */\nexport type UPGDomainId = typeof UPG_DOMAINS[number]['id']\n\n// ─── Reverse map: entity type → domain id ───────────────────────────────────────\n\n/**\n * Canonical entity-type → domain-id lookup. O(1) access, derived from\n * `UPG_DOMAINS` at module init. Never maintained by hand.\n *\n * Prefer this over walking `UPG_DOMAINS` in downstream packages: the repeated\n * `UPG_DOMAINS.find(d => d.types.includes(t))?.id` pattern is a drift risk\n * (subtle `includes` vs `indexOf` semantics, missing null-guards, etc.).\n */\nexport const UPG_ENTITY_TO_DOMAIN: Readonly<Record<UPGEntityType, UPGDomainId>> =\n  Object.freeze(\n    Object.fromEntries(\n      UPG_DOMAINS.flatMap((d) => d.types.map((t) => [t, d.id] as const))\n    ) as Record<UPGEntityType, UPGDomainId>\n  )\n\n// ─── Helper functions ───────────────────────────────────────────────────────────\n\n/**\n * Get all entity types across all domains.\n *\n * @example\n * const types = getTypes()\n * types.includes('persona')    // → true\n * types.includes('feature')    // → true\n * types.length                 // → 300+ (all active types)\n */\nexport function getTypes(): string[] {\n  return UPG_DOMAINS.flatMap((d) => [...d.types])\n}\n\n/**\n * Look up which domain an entity type belongs to.\n *\n * @example\n * const d = getDomainForType('persona')\n * // d?.id     === 'user'\n * // d?.name   === 'User'\n *\n * @example\n * getDomainForType('not_a_type')   // → undefined\n */\nexport function getDomainForType(entityType: string): UPGDomain | undefined {\n  // `types` is a narrow literal tuple per domain; widen for runtime .includes.\n  const direct = UPG_DOMAINS.find((d) => (d.types as readonly string[]).includes(entityType))\n  if (direct) return direct\n  // A deprecated alias resolves its domain THROUGH its replacement (0.38.0).\n  // Rule, not rows: putting alias rows into UPG_DOMAINS would make deprecated\n  // names look canonical in every consumer that iterates a domain's `types`,\n  // and 36 duplicated assignments would drift. The field case: 36 icon-carrying\n  // aliases (kpi, pain_point, sla, jtbd, ...) rendered tone-neutral in every\n  // surface because their names had no direct row — each of their replacements\n  // always had one. Hop limit guards a hypothetical alias-to-alias chain.\n  let name = entityType\n  for (let hop = 0; hop < 3; hop++) {\n    if (!isDeprecatedType(name)) return undefined\n    const replacement = getReplacementType(name)\n    if (!replacement) return undefined\n    const viaReplacement = UPG_DOMAINS.find((d) => (d.types as readonly string[]).includes(replacement))\n    if (viaReplacement) return viaReplacement\n    name = replacement\n  }\n  return undefined\n}\n\n/**\n * Look up the canonical domain id for a typed entity type. O(1).\n *\n * Returns `undefined` only for the degenerate case where an entity type is\n * absent from every domain, which spec-integrity tests guarantee never\n * happens for active types. Callers with a `UPGEntityType` can treat the\n * result as non-null, but the return type keeps the escape hatch for\n * defensive string-typed call sites.\n *\n * @example\n * getDomainIdForType('persona')       // → 'user'\n * getDomainIdForType('feature')       // → 'product_spec'\n * getDomainIdForType('competitor')    // → 'market_intelligence'\n */\nexport function getDomainIdForType(entityType: UPGEntityType): UPGDomainId | undefined {\n  return UPG_ENTITY_TO_DOMAIN[entityType]\n}\n","/**\n * UPG Edge Catalog. Maps each canonical edge type to its verb pair and classification.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { PropertySchema } from '../properties/property-schema.js'\n\n// ─── Polymorphic endpoint marker ────────────────────────────────────\n\n/**\n * Wildcard sentinel for `source_type` / `target_type` on polymorphic edges.\n * Matches any node. Polymorphic edges must be registered in\n * `UPG_POLYMORPHIC_EDGE_KEYS`. See `src/ARCHITECTURE.md`, \"Polymorphic Edges\".\n */\nexport const UPG_WILDCARD_ENDPOINT = 'node' as const\nexport type UPGWildcardEndpoint = typeof UPG_WILDCARD_ENDPOINT\n\n// ─── Edge definition shape ────────────────────────────────────────────────────\n\n/**\n * The shape of a single canonical edge in `UPG_EDGE_CATALOG`.\n *\n * @example\n * const personaPursuesJob: UPGEdgeDefinition = {\n *   forward_verb: 'pursues',\n *   reverse_verb: 'pursued_by',\n *   classification: 'semantic',\n *   source_type: 'persona',\n *   target_type: 'job',\n * }\n */\nexport interface UPGEdgeDefinition {\n  /** Active voice verb: \"source [forward_verb] target\". */\n  forward_verb: string\n  /** Reverse reading: \"target [reverse_verb] source\". */\n  reverse_verb: string\n  /** Structural classification of this edge */\n  classification: 'hierarchy' | 'causal' | 'semantic' | 'cross-domain'\n  /** Source entity type. `UPGEntityType` or `'node'` (polymorphic wildcard). */\n  source_type: string\n  /** Target entity type. `UPGEntityType` or `'node'` (polymorphic wildcard). */\n  target_type: string\n  /**\n   * Opt-in to the gated edge-property model. When `true`, instances of this\n   * edge type MAY carry `properties` (validated against the relevant schema);\n   * when absent/false, validators reject any `properties` on the edge. This\n   * keeps plain semantic edges payload-free while letting a small, deliberate\n   * set of edges (currently `framework_exercise_includes_node`) hold a value\n   * that belongs to the relationship rather than to either endpoint.\n   */\n  carries_properties?: boolean\n  /**\n   * For `carries_properties` edges: the typed shape of the `properties` bag,\n   * keyed by property name (same `PropertyDefinition` shape entity properties\n   * use). When present, the writers reject unknown property keys and validators\n   * range-check typed values (e.g. an `assessment` against its `scale_id`);\n   * when absent, a `carries_properties` edge accepts an unvalidated bag (the\n   * pre-0.10.4 behaviour, still used by `feature_rivals_competitor_feature`).\n   * Discoverable via `get_edge_type`.\n   */\n  property_schema?: PropertySchema\n  /**\n   * Dual-registration marker (0.17.3). When `true`, this within-graph catalog edge\n   * is ALSO a valid cross-product edge: its endpoints can legitimately live in\n   * DIFFERENT graphs within a portfolio (a connective, rollup-laddering, reference,\n   * org-ownership, or competitive-intel relationship), so `batch_create_cross_product_edges`\n   * admits it across files. This is the single source of truth for the cross-product\n   * whitelist: `UPGCrossEdgeType` (the union) and `UPG_CROSS_EDGE_TYPES` (the runtime\n   * list) both derive the dual-registered half from this flag, so flagging one edge\n   * here is the only edit needed to admit it. NOT for product-spine or org-spine\n   * containment, whose endpoints must co-reside in one graph. Portfolio-native edges\n   * that only ever exist across products (shares_*, depends_on_product, instance_of,\n   * rolls_up_to, the area and foundation edges) have no within-graph catalog entry and\n   * live in `UPG_CROSS_ONLY_EDGE_TYPES` instead. Discoverable via `get_edge_type`.\n   */\n  cross_product_eligible?: true\n  /**\n   * Deliberate-only marker (0.17.4). When `true`, this edge carries a meaning that\n   * is a deliberate authoring act, NOT a relationship that can be inferred from a\n   * source's hierarchy or a generic parent nesting. `objective_defers_feature` /\n   * `objective_defers_capability` mean an objective explicitly PARKS a\n   * feature/capability out of scope, the opposite of the \"this child contributes to\n   * this parent\" link a nesting implies. Generic-inference chokepoints\n   * (`inferEdgeTypeWithTier` in auto-nest mode, the adapter parentage resolvers)\n   * skip these, declining to auto-materialise them so the write path falls back to a\n   * `node_informs_node` link or a decline+warn. Explicit resolution\n   * (`resolve_edge_for_pair`, `create_edge`) is UNAFFECTED — the edge is authored on\n   * request. Single source of truth: `UPG_DELIBERATE_ONLY_EDGE_TYPES` (the runtime\n   * list) and `isDeliberateOnlyEdge` derive from this flag, so flagging one edge here\n   * is the only edit needed. Discoverable via `get_edge_type`.\n   */\n  deliberate_only?: true\n}\n\n/**\n * Property schema carried by the two classification cross-edges\n * (`competitor_classified_as_classification_value` and its polymorphic sibling\n * `node_classified_as_classification_value`). Identical for both: the metadata a\n * classification carries does not depend on what is being classified. All keys\n * are optional (back-compat: the 218 existing classification edges carry none);\n * the only conditional requirement is internal to `confidence` (value + label),\n * mirroring the `competitor.confidence` entity precedent. 0.10.4.\n */\nexport const CLASSIFICATION_EDGE_PROPERTY_SCHEMA: PropertySchema = {\n  confidence: {\n    type: 'assessment',\n    scale_id: 'confidence_5',\n    description:\n      'How sure we are this node belongs in this classification cell, on the canonical confidence_5 scale. Numeric value plus a high/medium/low label.',\n    properties: {\n      value: { type: 'number', description: 'Numeric value 1-5 (confidence_5).' },\n      label: { type: 'string', description: 'Qualitative label (Guessing/Hunch/Some evidence/Confident/Data-backed, or high/medium/low).' },\n      scale_id: { type: 'string', description: 'Scale rated on (optional; defaults confidence_5).' },\n      normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n    },\n    required: ['value', 'label'],\n  },\n  assessed_on: {\n    type: 'string',\n    description:\n      'Provenance: ISO date-time the classification was made or last re-checked. Drives staleness queries. @example \"2026-06-13\"',\n  },\n  rationale: {\n    type: 'string',\n    description:\n      'Optional. Short note on why this node sits in this cell. Edge-level, distinct from classification_value.rationale (why the value exists as a category).',\n  },\n  evidence: {\n    type: 'string',\n    description:\n      'Optional. A source URL, or a competitor_signal / evidence node id backing the classification. Mirrors feature_rivals_competitor_feature.evidence (free text or a node id).',\n  },\n}\n\n/**\n * Property schema carried by the two defer edges (`objective_defers_feature`\n * and `objective_defers_capability`, 0.17.4). A single freeform `deferred_to`\n * key names the period the parked work is deferred to. Freeform on purpose,\n * mirroring `strategic_theme.time_horizon` (\"Q1 2026\", \"FY26\"): a deferral\n * target is a planning label, not a typed date, and can name a quarter, a\n * release, or a coarser horizon. Optional (a defer edge is meaningful without\n * a stated period); the writers reject any other key.\n */\nexport const DEFER_EDGE_PROPERTY_SCHEMA: PropertySchema = {\n  deferred_to: {\n    type: 'string',\n    description:\n      'Target period the parked work is deferred to. Freeform, mirroring strategic_theme.time_horizon. @example \"Q4 2026\", \"FY27\", \"next release\".',\n  },\n}\n\n/**\n * Property schema carried by `surface_varies_by_configuration_axis` (0.30.0).\n *\n * CONDITIONAL EXISTENCE, expressed as an edge. The surface exists in the stored\n * graph regardless; this edge says which members of the configuration family it\n * appears in. No edge at all means invariant, which is why every graph written\n * before this existed keeps meaning exactly what it meant.\n */\nexport const CONFIGURATION_VARIANCE_EDGE_PROPERTY_SCHEMA: PropertySchema = {\n  present_under: {\n    type: 'string[]',\n    description:\n      'Values of the axis under which this surface exists. Every entry must name a member of the axis\\'s closed `values` list, and an empty list is a modelling error rather than a way to say \"never\" (a surface that exists under no configuration should be deleted, not declared). Omitting the edge entirely is how a surface says it is present in every configuration. @example [\"legacy_nav\"]',\n  },\n}\n\n/**\n * Property schema carried by the two surface-composition edges\n * (`surface_contains_surface` and `feature_occupies_surface`), 0.30.0.\n *\n * A single `active_when` key qualifies the relationship by a configuration\n * axis: the edge holds only under the named values, and is absent from every\n * other projection.\n *\n * SCOPE IS THE POINT, NOT AN OVERSIGHT. These two edges are the whole legal\n * surface for the qualifier, and `validate_graph` rejects `active_when` on any\n * other edge type. UPG is not adding a general modality system on one field\n * report; it is answering the composition question that report actually asked.\n * Any further edge earns the qualifier on field evidence, one at a time.\n *\n * A QUALIFIER CANNOT EXPRESS NON-EXISTENCE. If the surface itself is absent\n * under a value, say so on the node with `surface_varies_by_configuration_axis`;\n * the projection then drops this edge as dangling and the qualifier is\n * redundant. Reach for `active_when` only when BOTH endpoints exist and the\n * RELATIONSHIP is what changes: the occupant that moves to a different row, the\n * feature that occupies a different place under the flag.\n *\n * ONE AXIS PER QUALIFIER. An edge conditional on two axes at once is a stated\n * non-goal; where it is genuinely needed, the honest model is one axis whose\n * values are the combinations that actually occur, which is the same discipline\n * as \"one axis per semantic lever\".\n */\nexport const CONFIGURATION_QUALIFIER_EDGE_PROPERTY_SCHEMA: PropertySchema = {\n  active_when: {\n    type: 'object',\n    description:\n      'Configuration condition under which this relationship holds. The edge is present in a projection that sets `axis` to one of `values`, and absent otherwise. Omit the key entirely for an invariant relationship: absence means \"always\", never \"unknown\".',\n    properties: {\n      axis: {\n        type: 'string',\n        description: 'Node id of the `configuration_axis` this condition reads.',\n      },\n      values: {\n        type: 'string[]',\n        description:\n          'Values of that axis under which the relationship holds. Every entry must be a member of the axis\\'s closed `values` list.',\n      },\n    },\n    required: ['axis', 'values'],\n  },\n}\n\n/**\n * Property schema carried by `workspace_arranges_node`: where a node sits on a\n * canvas, and how its card is presented there.\n *\n * A PLACEMENT IS A FACT ABOUT THE RELATIONSHIP, not about either endpoint. The\n * same persona can sit at different coordinates on five different canvases, and\n * none of those coordinates is a property of the persona. This is the same\n * principle `framework_exercise_includes_node` applies to per-entity results.\n *\n * `selected` IS DELIBERATELY ABSENT. Selection is ephemeral UI state, and\n * persisting it means reloading a canvas restores someone's month-old\n * selection and every click dirties the file. The spec does not bless it.\n *\n * AT MOST ONE ARRANGEMENT PER (WORKSPACE, NODE) PAIR: a card appears once on a\n * canvas. The write amplification is real and named rather than hidden:\n * dragging a card rewrites edge properties and so changes the body checksum,\n * which is diff noise on a shared graph. It is bounded by the tool writing only\n * the canvases a user explicitly keeps, and by viewport panning touching the\n * opaque `canvas` bag rather than any edge.\n *\n * `x` and `y` are expected on every instance. Requiredness here is convention\n * rather than enforcement: `PropertyDefinition.required` names required keys\n * WITHIN a nested object, and the edge-property validator has no top-level\n * required-key concept, so the contract is stated in each description.\n */\nexport const WORKSPACE_ARRANGEMENT_EDGE_PROPERTY_SCHEMA: PropertySchema = {\n  x: {\n    type: 'number',\n    description: 'Horizontal canvas coordinate of the card, in the canvas\\'s own units. Expected on every arrangement: a placement without coordinates is not a placement.',\n  },\n  y: {\n    type: 'number',\n    description: 'Vertical canvas coordinate of the card, in the canvas\\'s own units. Expected on every arrangement: a placement without coordinates is not a placement.',\n  },\n  expanded: {\n    type: 'boolean',\n    description: 'Whether the card is drawn expanded rather than collapsed. Presentation state that survives a reload, unlike selection.',\n  },\n  frame_id: {\n    type: 'string',\n    description: 'Id of the canvas frame this card sits inside. The frame itself is opaque furniture and lives in `workspace.properties.canvas.frames`, so this names a bag member rather than a graph node.',\n  },\n}\n\n// ─── Registry ─────────────────────────────────────────────────────────────────\n\n// `satisfies` preserves literal key types for downstream\n// `UPGEdgeType = keyof typeof UPG_EDGE_CATALOG` while still enforcing shape.\nexport const UPG_EDGE_CATALOG = {\n\n  // ── Part 1: Core Narrative Spine (Ring 1) ──────────────────────────────────\n\n  // 1.1 User Domain\n  // product → persona is the most fundamental relationship in the\n  // user domain (\"who is this product for?\") and was the only way to\n  // anchor a fresh persona to its product before this edge existed. Without\n  // it, the natural agent path through `/upg-new-persona` produced an orphan\n  // persona only attached laterally via `ideal_customer_profile_maps_to_persona`\n  // or `positioning_resonates_with_persona`. Semantic, not hierarchy: a\n  // product doesn't \"contain\" personas; it targets them.\n  product_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'semantic', source_type: 'product', target_type: 'persona' },\n  persona_pursues_job: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'semantic', source_type: 'persona', target_type: 'job' },\n  persona_experiences_need: { forward_verb: 'experiences', reverse_verb: 'experienced_by', classification: 'semantic', source_type: 'persona', target_type: 'need' },\n  persona_aspires_to_desired_outcome: { forward_verb: 'aspires_to', reverse_verb: 'aspirational_for', classification: 'hierarchy', source_type: 'persona', target_type: 'desired_outcome' },\n  // Delegation (0.11.6): a persona delegates work to another. The common case is human -> agent\n  // (Content Ops Lead -> Content Agent), but it also expresses human -> human (editor -> reviewer).\n  persona_delegates_to_persona: { forward_verb: 'delegates_to', reverse_verb: 'delegated_by', classification: 'semantic', source_type: 'persona', target_type: 'persona', cross_product_eligible: true },\n  persona_incurs_switching_cost: { forward_verb: 'incurs', reverse_verb: 'incurred_by', classification: 'hierarchy', source_type: 'persona', target_type: 'switching_cost' },\n  job_surfaces_need: { forward_verb: 'surfaces', reverse_verb: 'surfaces_from', classification: 'causal', source_type: 'job', target_type: 'need' },\n  job_motivates_desired_outcome: { forward_verb: 'motivates', reverse_verb: 'motivated_by', classification: 'causal', source_type: 'job', target_type: 'desired_outcome' },\n  job_decomposes_into_job_step: { forward_verb: 'decomposes_into', reverse_verb: 'step_of', classification: 'hierarchy', source_type: 'job', target_type: 'job_step' },\n\n  // 1.2 Discovery Domain\n  outcome_reveals_opportunity: { forward_verb: 'reveals', reverse_verb: 'grounded_in', classification: 'causal', source_type: 'outcome', target_type: 'opportunity' },\n  opportunity_drives_solution: { forward_verb: 'drives', reverse_verb: 'addresses', classification: 'causal', source_type: 'opportunity', target_type: 'solution' },\n  opportunity_explores_via_design_concept: { forward_verb: 'explores_via', reverse_verb: 'explores', classification: 'hierarchy', source_type: 'opportunity', target_type: 'design_concept' },\n  opportunity_assessed_by_feasibility_study: { forward_verb: 'assessed_by', reverse_verb: 'assesses', classification: 'hierarchy', source_type: 'opportunity', target_type: 'feasibility_study' },\n  metric_assessed_by_metric_quality_assessment: { forward_verb: 'assessed_by', reverse_verb: 'assesses', classification: 'hierarchy', source_type: 'metric', target_type: 'metric_quality_assessment' },\n  opportunity_investigated_via_design_sprint: { forward_verb: 'investigated_via', reverse_verb: 'investigates', classification: 'hierarchy', source_type: 'opportunity', target_type: 'design_sprint' },\n  opportunity_addresses_need: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'opportunity', target_type: 'need' },\n  opportunity_pursues_outcome: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'cross-domain', source_type: 'opportunity', target_type: 'outcome' },\n  opportunity_contextualises_job: { forward_verb: 'contextualises', reverse_verb: 'contextualised_by', classification: 'cross-domain', source_type: 'opportunity', target_type: 'job' },\n\n  // 1.3 Validation Domain\n  solution_proposes_hypothesis: { forward_verb: 'proposes', reverse_verb: 'tests', classification: 'causal', source_type: 'solution', target_type: 'hypothesis' },\n  solution_materialises_as_prototype: { forward_verb: 'materialises_as', reverse_verb: 'materialises', classification: 'hierarchy', source_type: 'solution', target_type: 'prototype' },\n  // v0.5.4 (UPG-513): the explicit graduation moment in Teresa Torres' Solution\n  // Tree: a solution that has been validated and committed to delivery becomes\n  // a feature. UPG already has `opportunity_drives_solution` and\n  // `solution_proposes_hypothesis`; this edge closes the chain to the feature.\n  // `becomes` captures the state transition (exploration → delivery commitment),\n  // distinct from the structural `capability_implemented_by_feature` (which\n  // records how a capability is realised, not when a solution graduates).\n  // `evolved_from` in the reverse lets a feature trace its solution ancestry.\n  solution_becomes_feature: { forward_verb: 'becomes', reverse_verb: 'evolved_from', classification: 'causal', source_type: 'solution', target_type: 'feature' },\n  hypothesis_requires_experiment_plan: { forward_verb: 'requires', reverse_verb: 'planned_for', classification: 'causal', source_type: 'hypothesis', target_type: 'experiment_plan' },\n  // (UPG-664) V4: close the stable canonical loop directly on `experiment`.\n  // Before this, resolve_edge_for_pair(hypothesis, experiment) and the reverse\n  // were both null — the stable experiment could not attach to the hypothesis\n  // it tests without adopting the proposed run type.\n  hypothesis_tested_by_experiment: { forward_verb: 'tested_by', reverse_verb: 'tests', classification: 'causal', source_type: 'hypothesis', target_type: 'experiment' },\n  experiment_validates_hypothesis: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'causal', source_type: 'experiment', target_type: 'hypothesis' },\n  hypothesis_investigated_via_research_plan: { forward_verb: 'investigated_via', reverse_verb: 'investigates', classification: 'hierarchy', source_type: 'hypothesis', target_type: 'research_plan' },\n  // (UPG-678) V8: a research insight can seed a hypothesis directly. The region\n  // says validation consumes `insight` from user_research, but the only paths\n  // in were via solution/learning/assumption.\n  insight_generates_hypothesis: { forward_verb: 'generates', reverse_verb: 'generated_from', classification: 'cross-domain', source_type: 'insight', target_type: 'hypothesis' },\n  // (UPG-678) V7: the validation-side research plan is conducted as the\n  // user_research-side research study. Both sit in the\n  // discovery_research_validation region but had no connecting edge; the plan\n  // jumped straight to `participant`, bypassing the study container.\n  research_plan_conducted_as_research_study: { forward_verb: 'conducted_as', reverse_verb: 'conducts', classification: 'cross-domain', source_type: 'research_plan', target_type: 'research_study' },\n  experiment_run_produces_learning: { forward_verb: 'produces', reverse_verb: 'learned_from', classification: 'causal', source_type: 'experiment_run', target_type: 'learning' },\n  experiment_run_yields_evidence: { forward_verb: 'yields', reverse_verb: 'supports', classification: 'causal', source_type: 'experiment_run', target_type: 'evidence' },\n  // (v0.2.7 closure) the legacy duplicate pair\n  // `experiment_tested_via_experiment` (line 116) + `experiment_tests_experiment`\n  // (line 862) is consolidated into a single canonical run-to-run edge.\n  // Multi-armed iterations and replications now express as `tested_via` from\n  // one experiment_run to another, preserving the semantic without the\n  // ambiguity of two near-identical edges.\n  experiment_run_tested_via_experiment_run: { forward_verb: 'tested_via', reverse_verb: 'tests_within', classification: 'hierarchy', source_type: 'experiment_run', target_type: 'experiment_run' },\n  learning_updates_hypothesis: { forward_verb: 'updates', reverse_verb: 'updated_by', classification: 'causal', source_type: 'learning', target_type: 'hypothesis' },\n  assumption_becomes_hypothesis: { forward_verb: 'becomes', reverse_verb: 'originated_as', classification: 'causal', source_type: 'assumption', target_type: 'hypothesis' },\n  // experiment → experiment_plan + experiment_run.\n  // Plan owns runs (`ran_as`); runs carry the validation/insight/decision\n  // outcomes. v0.2.7 closes the split by retargeting the 18 legacy\n  // experiment-edges to plan or run, dropping the `experiment_tests_hypothesis`\n  // duplicate (superseded by `experiment_run_validates_hypothesis`), and\n  // consolidating the self-edge pair. `validates` retargets from\n  // `hypothesis` to `hypothesis_claim` in v0.2.8.\n  experiment_plan_ran_as_experiment_run: { forward_verb: 'ran_as', reverse_verb: 'ran_for', classification: 'hierarchy', source_type: 'experiment_plan', target_type: 'experiment_run' },\n  experiment_run_validates_hypothesis: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'causal', source_type: 'experiment_run', target_type: 'hypothesis' },\n  // (v0.4.0) canonical evidence edge. Neutral direction; polarity\n  // (supports/refutes/neutral) lives on evidence.direction. Replaces the\n  // deprecated hypothesis_evidence_supports/refutes pair.\n  hypothesis_has_evidence: { forward_verb: 'has_evidence', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'hypothesis', target_type: 'evidence' },\n  // hypothesis_evidence_supports/refutes/derived_from edges removed at v0.4.0.\n  // UPG_EDGE_MIGRATIONS['0.4.0'] carries 'drop' rules for old graphs.\n  // New pattern: hypothesis_has_evidence + evidence.direction ('supports'|'refutes'|'neutral').\n  experiment_run_produced_insight_insight: { forward_verb: 'produced_insight', reverse_verb: 'produced_from_run', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'insight' },\n  experiment_run_informed_decision_decision: { forward_verb: 'informed_decision', reverse_verb: 'informed_by_run', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'decision' },\n  // (v0.2.7) P14 fix: plan declares its target metric via a\n  // canonical edge, not a foreign-key property (the v0.2.6 ExperimentPlan\n  // interface left this slot pending in line with the principle).\n  experiment_plan_targets_metric: { forward_verb: 'targets', reverse_verb: 'targeted_by_plan', classification: 'cross-domain', source_type: 'experiment_plan', target_type: 'metric' },\n  // (UPG-664) The validation plan designs the experiment it produces. This\n  // replaces the backwards `experiment_has_plan` (experiment → experiment_plan):\n  // the chain now reads hypothesis → experiment_plan → experiment → experiment_run,\n  // with experiment_plan the owning parent of experiment.\n  experiment_plan_designs_experiment:     { forward_verb: 'designs',           reverse_verb: 'designed_by',      classification: 'hierarchy',  source_type: 'experiment_plan',   target_type: 'experiment' },\n  experiment_executed_as_experiment_run:  { forward_verb: 'executed_as',       reverse_verb: 'execution_of',     classification: 'hierarchy',  source_type: 'experiment',        target_type: 'experiment_run' },\n  experiment_produces_learning:           { forward_verb: 'produces',          reverse_verb: 'produced_by',      classification: 'causal',     source_type: 'experiment',        target_type: 'learning' },\n  experiment_produces_evidence:           { forward_verb: 'produces',          reverse_verb: 'produced_by',      classification: 'causal',     source_type: 'experiment',        target_type: 'evidence' },\n\n  // 1.4 User Research Domain\n  product_contains_research_study: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product', target_type: 'research_study' },\n  research_study_enrolls_participant: { forward_verb: 'enrolls', reverse_verb: 'enrolled_in', classification: 'hierarchy', source_type: 'research_study', target_type: 'participant' },\n  research_study_captures_observation: { forward_verb: 'captures', reverse_verb: 'captured_in', classification: 'hierarchy', source_type: 'research_study', target_type: 'observation' },\n  // (0.35.0) Provenance for a verbatim quote: which study produced it. The\n  // quote card wanted an outbound `quote_from_research_study`; canon answers it\n  // study-first, matching the whole `research_study_*` family (enrolls ·\n  // captures · clusters_into · produces · investigates · follows · collects),\n  // so the quote renders it INBOUND on its connections rail. The `captures`\n  // verb is deliberately reused from the observation twin above: the F3\n  // duplicate gate is on the (source, target) pair, which is new, and a study\n  // captures raw material by one verb regardless of which raw shape it is.\n  // Companion: `UPG_VALID_CHILDREN.research_study` gains 'quote'. A quote may\n  // now hang from observation (raw-capture parent), insight (synthesis parent)\n  // or research_study (provenance parent) — multi-parent grammar is explicitly\n  // sanctioned, and per-INSTANCE parentage stays single via `parent_id`.\n  research_study_captures_quote: { forward_verb: 'captures', reverse_verb: 'captured_in', classification: 'hierarchy', source_type: 'research_study', target_type: 'quote' },\n  research_study_clusters_into_affinity_cluster: { forward_verb: 'clusters_into', reverse_verb: 'clustered_from', classification: 'hierarchy', source_type: 'research_study', target_type: 'affinity_cluster' },\n  research_study_produces_insight: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'research_study', target_type: 'insight' },\n  research_study_investigates_research_question: { forward_verb: 'investigates', reverse_verb: 'investigated_by', classification: 'hierarchy', source_type: 'research_study', target_type: 'research_question' },\n  research_study_follows_interview_guide: { forward_verb: 'follows', reverse_verb: 'guides', classification: 'hierarchy', source_type: 'research_study', target_type: 'interview_guide' },\n  research_study_collects_survey_response: { forward_verb: 'collects', reverse_verb: 'collected_in', classification: 'hierarchy', source_type: 'research_study', target_type: 'survey_response' },\n  observation_evidenced_by_quote: { forward_verb: 'evidenced_by', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'observation', target_type: 'quote' },\n  affinity_cluster_synthesises_insight: { forward_verb: 'synthesises', reverse_verb: 'synthesised_from', classification: 'hierarchy', source_type: 'affinity_cluster', target_type: 'insight' },\n  // deliberate_only (0.17.6): \"this insight informs that opportunity\" is a\n  // PM-judgment link — which of many opportunities a finding actually feeds is\n  // authored, never inferred from a source's hierarchy. Auto-nest / adapter\n  // parentage resolvers decline to materialise it (fall through to a\n  // node_informs_node link or a decline+warn); explicit create_edge /\n  // resolve_edge_for_pair still return it. Fixes the latent auto-emission.\n  insight_informs_opportunity: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'insight', target_type: 'opportunity', deliberate_only: true },\n\n  // 1.5 Market Intelligence Domain\n  // product → competitive_analysis closes the parallel gap to\n  // product → persona. competitive_analysis is the anchor of the\n  // market_intelligence domain (per DomainUsageGuide), and a fresh analysis\n  // had no canonical edge home; it was reachable only laterally via\n  // `competitor_competes_for_persona` + `positioning_differentiates_from_competitor`.\n  // Hierarchy: a competitive_analysis is owned by / contained in one product,\n  // mirroring `product_contains_research_study` for the research_study anchor.\n  // Verb choice: `contains` reads as plain English; `scopes` reads like a\n  // programming concern.\n  product_contains_competitive_analysis: { forward_verb: 'contains', reverse_verb: 'contained_by', classification: 'hierarchy', source_type: 'product', target_type: 'competitive_analysis' },\n  competitor_offers_competitor_feature: { forward_verb: 'offers', reverse_verb: 'offered_by', classification: 'hierarchy', source_type: 'competitor', target_type: 'competitor_feature' },\n  // 0.10.0 (spec issue #38): parity / rivalry edge. Our `feature` rivals a\n  // `competitor_feature`, carrying the parity assessment as EDGE metadata\n  // (parity_status / quality / is_gap / assessed_on / evidence / confidence) so\n  // \"where are we behind, by area?\" is one traversal, not a scan over the\n  // free-text `our_equivalent`. `carries_properties` puts the assessment on the\n  // edge; the node `parity_status` stays as a denormalised single-rival cache.\n  // Dual-registered as a cross-edge (UPG_CROSS_EDGE_TYPES) so it also spans our\n  // product graph and a watched competitor-intelligence graph. Distinct from\n  // `competitor_feature_inspires_feature` (ideation lineage, not parity).\n  feature_rivals_competitor_feature: { forward_verb: 'rivals', reverse_verb: 'is_rivalled_by', classification: 'cross-domain', source_type: 'feature', target_type: 'competitor_feature', carries_properties: true, cross_product_eligible: true },\n  // 0.10.0 (spec issue #41): competitor_signal is a dated competitor move (feature\n  // launch / pricing change / acquisition / partnership / market entry) emitted by a\n  // competitor and mapped onto our portfolio. `emits` is within the watched graph;\n  // `maps_to_feature` / `surfaces_opportunity` cross from the watched signal into our\n  // product graph (dual-registered as cross-edges in UPG_CROSS_EDGE_TYPES).\n  competitor_emits_competitor_signal: { forward_verb: 'emits', reverse_verb: 'emitted_by', classification: 'hierarchy', source_type: 'competitor', target_type: 'competitor_signal' },\n  competitor_signal_maps_to_feature: { forward_verb: 'maps_to', reverse_verb: 'targeted_by_signal', classification: 'cross-domain', source_type: 'competitor_signal', target_type: 'feature', cross_product_eligible: true },\n  competitor_signal_surfaces_opportunity: { forward_verb: 'surfaces', reverse_verb: 'prompted_by_signal', classification: 'cross-domain', source_type: 'competitor_signal', target_type: 'opportunity', cross_product_eligible: true },\n  competitive_analysis_analyses_competitor: { forward_verb: 'analyses', reverse_verb: 'analysed_in', classification: 'hierarchy', source_type: 'competitive_analysis', target_type: 'competitor' },\n  competitive_analysis_identifies_market_trend: { forward_verb: 'identifies', reverse_verb: 'identified_in', classification: 'hierarchy', source_type: 'competitive_analysis', target_type: 'market_trend' },\n  competitive_analysis_scopes_market_segment: { forward_verb: 'scopes', reverse_verb: 'scoped_in', classification: 'hierarchy', source_type: 'competitive_analysis', target_type: 'market_segment' },\n  market_trend_influences_outcome: { forward_verb: 'influences', reverse_verb: 'influenced_by', classification: 'cross-domain', source_type: 'market_trend', target_type: 'outcome' },\n  market_trend_creates_opportunity: { forward_verb: 'creates', reverse_verb: 'created_by', classification: 'cross-domain', source_type: 'market_trend', target_type: 'opportunity' },\n  competitor_feature_inspires_solution: { forward_verb: 'inspires', reverse_verb: 'inspired_by', classification: 'cross-domain', source_type: 'competitor_feature', target_type: 'solution' },\n  competitor_competes_for_persona: { forward_verb: 'competes_for', reverse_verb: 'contested_by', classification: 'cross-domain', source_type: 'competitor', target_type: 'persona' },\n  // v0.7.2 (UPG-571 §1): competitors hold geographic/market territory; connects the isolated `territory` member to the region anchor.\n  competitor_competes_in_territory: { forward_verb: 'competes_in', reverse_verb: 'contested_by', classification: 'cross-domain', source_type: 'competitor', target_type: 'territory' },\n  // direct competitor → learning edge (insight surfaced without a formal research study)\n  competitor_yields_learning: { forward_verb: 'yields', reverse_verb: 'yielded_by', classification: 'cross-domain', source_type: 'competitor', target_type: 'learning' },\n  // v0.5.2 (UPG-528): competitors offer capabilities, not just packaged\n  // competitor_features. Wardley analysis tracks competitor positions across\n  // the same value-chain spine the home team maps: same `capability` nodes,\n  // different offerings. Cross-domain (market_intelligence → strategy) so the\n  // competitor side of a Wardley map shares one structural vocabulary with\n  // the team's own capability decomposition.\n  competitor_offers_capability: { forward_verb: 'offers', reverse_verb: 'offered_by', classification: 'cross-domain', source_type: 'competitor', target_type: 'capability' },\n\n  // Classification taxonomy\n  //\n  // classification_axis hosts classification_value (hierarchy lives in\n  // UPG_VALID_CHILDREN). The semantically interesting edges are *occupancy*\n  // (a competitor sits on a value) and *anti-fit* (a persona should NOT\n  // pick a value / product / competitor). Three anti_fit_for entries match\n  // the catalog's singular-source/target grammar (polymorphic targets\n  // would be a separate catalog-mechanic change).\n  competitive_analysis_dimensioned_by_classification_axis: { forward_verb: 'dimensioned_by', reverse_verb: 'dimensions', classification: 'hierarchy', source_type: 'competitive_analysis', target_type: 'classification_axis' },\n  // A product's own classification axes (0.32.0). Before this the only parent a\n  // classification_axis could have was a competitive_analysis, so a taxonomy the\n  // product uses on its OWN entities — the grouped-label case, one named group\n  // over a set of values — had to hang off a competitive analysis it has nothing\n  // to do with, or float parentless.\n  //\n  // Hierarchy, so the axis has a home in get_tree, on the same honest verb the\n  // competitive_analysis edge already uses; and it earns its\n  // UPG_VALID_CHILDREN.product pair the same way product_defines_configuration_axis\n  // did at 0.30.0 — axes are few per product, and visibility of a mechanism\n  // matters more than the tree cost.\n  //\n  // This is what makes one level of label grouping expressible with NO new label\n  // surface: the group is the axis, the labels are its values, and carrying one\n  // is node_classified_as_classification_value, all of it stable since 0.4.0.\n  // Ungrouped freeform labels stay in `tags`. The line between them: if the\n  // group has a name a person would filter by, it is an axis; otherwise a tag.\n  product_dimensioned_by_classification_axis: { forward_verb: 'dimensioned_by', reverse_verb: 'dimensions', classification: 'hierarchy', source_type: 'product', target_type: 'classification_axis' },\n  classification_axis_includes_classification_value: { forward_verb: 'includes', reverse_verb: 'value_of', classification: 'hierarchy', source_type: 'classification_axis', target_type: 'classification_value' },\n  // 0.10.2: also dual-registered as a cross-edge (UPG_CROSS_EDGE_TYPES) so a\n  // competitor can be classified directly against a `registry/{classification_value}`\n  // canonical, eliminating the per-graph taxonomy node. Within-graph (the catalogue\n  // case) here; cross-product against the registry canonical via create_cross_product_edge.\n  competitor_classified_as_classification_value: { forward_verb: 'classified_as', reverse_verb: 'classification_of', classification: 'semantic', source_type: 'competitor', target_type: 'classification_value', carries_properties: true, property_schema: CLASSIFICATION_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true },\n  // 0.10.3: the polymorphic, type-agnostic sibling. ANY node (a feature, a\n  // product, a market_segment) classified against a classification_value, so\n  // classification is not welded to the competitor type. Also dual-registered as\n  // a cross-edge for the registry-canonical case. source_type:'node' (wildcard);\n  // listed in UPG_POLYMORPHIC_EDGE_KEYS.\n  node_classified_as_classification_value: { forward_verb: 'classified_as', reverse_verb: 'classification_of', classification: 'semantic', source_type: 'node', target_type: 'classification_value', carries_properties: true, property_schema: CLASSIFICATION_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true },\n  persona_anti_fit_for_classification_value: { forward_verb: 'is_anti_fit_for', reverse_verb: 'should_not_be_picked_by', classification: 'semantic', source_type: 'persona', target_type: 'classification_value' },\n  persona_anti_fit_for_product: { forward_verb: 'is_anti_fit_for', reverse_verb: 'should_not_be_picked_by', classification: 'semantic', source_type: 'persona', target_type: 'product' },\n  persona_anti_fit_for_competitor: { forward_verb: 'is_anti_fit_for', reverse_verb: 'should_not_be_picked_by', classification: 'semantic', source_type: 'persona', target_type: 'competitor' },\n\n  // Classification value genealogy\n  //\n  // Six typed edges between classification_value nodes for taxonomy-internal\n  // genealogy. Rescoped from the original \"relationship_kind enum on\n  // relates_to\" because the UPG edge model is verb-only (no instance\n  // properties). Six typed verbs match how UPG models semantic\n  // relationships elsewhere.\n  //\n  // Directional (causal): evolves_from, derives_from.\n  // Symmetric (semantic): opposite_of, sibling_of, compatible_with,\n  // incompatible_with: forward_verb == reverse_verb per the catalog's\n  // symmetric convention (see `product_shares_persona_with_product`,\n  // `root_cause_shares_cause_with_root_cause`).\n  classification_value_evolves_from_classification_value: { forward_verb: 'evolves_from', reverse_verb: 'predecessor_of', classification: 'causal', source_type: 'classification_value', target_type: 'classification_value' },\n  classification_value_opposite_of_classification_value: { forward_verb: 'opposite_of', reverse_verb: 'opposite_of', classification: 'semantic', source_type: 'classification_value', target_type: 'classification_value' },\n  classification_value_sibling_of_classification_value: { forward_verb: 'sibling_of', reverse_verb: 'sibling_of', classification: 'semantic', source_type: 'classification_value', target_type: 'classification_value' },\n  classification_value_derives_from_classification_value: { forward_verb: 'derives_from', reverse_verb: 'parent_of', classification: 'causal', source_type: 'classification_value', target_type: 'classification_value' },\n  classification_value_compatible_with_classification_value: { forward_verb: 'compatible_with', reverse_verb: 'compatible_with', classification: 'semantic', source_type: 'classification_value', target_type: 'classification_value' },\n  classification_value_incompatible_with_classification_value: { forward_verb: 'incompatible_with', reverse_verb: 'incompatible_with', classification: 'semantic', source_type: 'classification_value', target_type: 'classification_value' },\n\n  // Persona pursues classification_value\n  //\n  // Persona pursues a paradigm/classification; e.g. \"Modern web dev\n  // persona pursues Composable Structured-Content Platform paradigm\".\n  // Mirrors `persona_pursues_job` (same source, same verb pair).\n  //\n  // NOTE: The brief proposed extending a `pursued_by_persona` edge\n  // family but no such family exists in the catalog. The catalog's\n  // canonical persona-pursuit pattern is `persona_pursues_X` (persona\n  // as source). Following the catalog rather than the brief.\n  persona_pursues_classification_value: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'semantic', source_type: 'persona', target_type: 'classification_value' },\n\n  // 1.6 Feedback & Voice of Customer Domain\n  product_tracks_market_trend:            { forward_verb: 'tracks',           reverse_verb: 'tracked_by',       classification: 'semantic',   source_type: 'product',           target_type: 'market_trend' },\n  product_has_feedback_program:           { forward_verb: 'has',               reverse_verb: 'owned_by',         classification: 'hierarchy',  source_type: 'product',           target_type: 'feedback_program' },\n  product_has_user_advisory_board:        { forward_verb: 'has',               reverse_verb: 'advises',          classification: 'hierarchy',  source_type: 'product',           target_type: 'user_advisory_board' },\n  product_runs_beta_program:              { forward_verb: 'runs',              reverse_verb: 'run_by',           classification: 'hierarchy',  source_type: 'product',           target_type: 'beta_program' },\n  feedback_program_collects_feature_request: { forward_verb: 'collects', reverse_verb: 'collected_in', classification: 'hierarchy', source_type: 'feedback_program', target_type: 'feature_request' },\n  feature_request_voted_on_by_feedback_vote: { forward_verb: 'voted_on_by', reverse_verb: 'votes_for', classification: 'hierarchy', source_type: 'feature_request', target_type: 'feedback_vote' },\n  feedback_program_runs_nps_campaign: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'feedback_program', target_type: 'nps_campaign' },\n  feedback_program_identifies_feedback_theme: { forward_verb: 'identifies', reverse_verb: 'identified_in', classification: 'hierarchy', source_type: 'feedback_program', target_type: 'feedback_theme' },\n  feature_request_creates_opportunity: { forward_verb: 'creates', reverse_verb: 'created_from_request', classification: 'cross-domain', source_type: 'feature_request', target_type: 'opportunity' },\n  feedback_theme_validates_need: { forward_verb: 'validates', reverse_verb: 'validated_by_theme', classification: 'cross-domain', source_type: 'feedback_theme', target_type: 'need' },\n  nps_campaign_tracks_metric: { forward_verb: 'tracks', reverse_verb: 'tracked_by_campaign', classification: 'cross-domain', source_type: 'nps_campaign', target_type: 'metric' },\n  beta_program_runs_experiment_run: { forward_verb: 'runs', reverse_verb: 'run_in_beta', classification: 'cross-domain', source_type: 'beta_program', target_type: 'experiment_run' },\n  user_advisory_board_includes_persona: { forward_verb: 'includes', reverse_verb: 'included_in_board', classification: 'cross-domain', source_type: 'user_advisory_board', target_type: 'persona' },\n  feedback_vote_prioritises_roadmap_item: { forward_verb: 'prioritises', reverse_verb: 'prioritised_by_vote', classification: 'cross-domain', source_type: 'feedback_vote', target_type: 'roadmap_item' },\n  feedback_program_hosts_user_advisory_board: { forward_verb: 'hosts',         reverse_verb: 'part_of',          classification: 'hierarchy',  source_type: 'feedback_program',  target_type: 'user_advisory_board' },\n  feedback_program_has_beta_program:      { forward_verb: 'has',               reverse_verb: 'part_of',          classification: 'hierarchy',  source_type: 'feedback_program',  target_type: 'beta_program' },\n\n  // ── Part 2: Strategic & Execution Spine (Ring 2) ───────────────────────────\n\n  // 2.1 Strategic Domain\n  product_pursues_outcome: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'hierarchy', source_type: 'product', target_type: 'outcome', cross_product_eligible: true },\n  product_targets_objective: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'product', target_type: 'objective', cross_product_eligible: true },\n  product_guided_by_vision: { forward_verb: 'guided_by', reverse_verb: 'guides', classification: 'hierarchy', source_type: 'product', target_type: 'vision', cross_product_eligible: true },\n  // product→{mission,strategic_theme,strategic_pillar,initiative,capability,value_stream,assumption}\n  // are semantic \"how the product relates to the strategic cascade\", not containment.\n  // The containment chain is product → vision → mission → strategic_pillar → … so these\n  // targets are reachable via the vision/mission hierarchy already.\n  product_fulfils_mission: { forward_verb: 'fulfils', reverse_verb: 'fulfilled_by', classification: 'semantic', source_type: 'product', target_type: 'mission', cross_product_eligible: true },\n  product_organises_around_strategic_theme: { forward_verb: 'organises_around', reverse_verb: 'organises', classification: 'semantic', source_type: 'product', target_type: 'strategic_theme', cross_product_eligible: true },\n  product_stands_on_strategic_pillar: { forward_verb: 'stands_on', reverse_verb: 'supports', classification: 'semantic', source_type: 'product', target_type: 'strategic_pillar', cross_product_eligible: true },\n  product_invests_in_initiative: { forward_verb: 'invests_in', reverse_verb: 'investment_of', classification: 'semantic', source_type: 'product', target_type: 'initiative', cross_product_eligible: true },\n  product_develops_capability: { forward_verb: 'develops', reverse_verb: 'developed_by', classification: 'semantic', source_type: 'product', target_type: 'capability' },\n  product_delivers_through_value_stream: { forward_verb: 'delivers_through', reverse_verb: 'delivers_for', classification: 'semantic', source_type: 'product', target_type: 'value_stream' },\n  product_holds_assumption: { forward_verb: 'holds', reverse_verb: 'held_by', classification: 'semantic', source_type: 'product', target_type: 'assumption' },\n  product_measures_with_metric: { forward_verb: 'measures_with', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'product', target_type: 'metric', cross_product_eligible: true },\n  outcome_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'outcome', target_type: 'metric', cross_product_eligible: true },\n  // (UPG-677) outcome_tracked_by_metric retired — near-synonym of\n  // outcome_measured_by_metric (the kept canonical key). Captain's lean =\n  // collapse. See UPG_EDGE_MIGRATIONS['0.9.9'].\n  objective_achieved_through_key_result: { forward_verb: 'achieved_through', reverse_verb: 'achieves', classification: 'hierarchy', source_type: 'objective', target_type: 'key_result', cross_product_eligible: true },\n  objective_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'objective', target_type: 'metric', cross_product_eligible: true },\n  key_result_quantified_by_metric: { forward_verb: 'quantified_by', reverse_verb: 'quantifies', classification: 'hierarchy', source_type: 'key_result', target_type: 'metric', cross_product_eligible: true },\n  // (UPG-677) key_result_tracked_by_metric retired — near-synonym of\n  // key_result_quantified_by_metric (the kept canonical key). Captain's lean =\n  // collapse. See UPG_EDGE_MIGRATIONS['0.9.9'].\n  vision_realised_through_mission: { forward_verb: 'realised_through', reverse_verb: 'realises', classification: 'hierarchy', source_type: 'vision', target_type: 'mission' },\n  mission_supported_by_strategic_pillar: { forward_verb: 'supported_by', reverse_verb: 'supports', classification: 'hierarchy', source_type: 'mission', target_type: 'strategic_pillar' },\n  strategic_pillar_organises_strategic_theme: { forward_verb: 'organises', reverse_verb: 'organised_by', classification: 'hierarchy', source_type: 'strategic_pillar', target_type: 'strategic_theme' },\n  strategic_pillar_enables_capability: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'hierarchy', source_type: 'strategic_pillar', target_type: 'capability' },\n  strategic_pillar_delivers_value_stream: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'hierarchy', source_type: 'strategic_pillar', target_type: 'value_stream' },\n  strategic_pillar_decided_via_decision: { forward_verb: 'decided_via', reverse_verb: 'decided_for', classification: 'hierarchy', source_type: 'strategic_pillar', target_type: 'decision' },\n  // 0.20.1: the durable pillar's own north-star, mirroring objective_measured_by_metric\n  // one level up the cascade. A strategic_pillar is multi-year and org-wide, so its\n  // measuring metric is portfolio-shared just like the pillar itself.\n  strategic_pillar_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'strategic_pillar', target_type: 'metric', cross_product_eligible: true },\n  strategic_theme_pursues_initiative: { forward_verb: 'pursues', reverse_verb: 'pursued_under', classification: 'hierarchy', source_type: 'strategic_theme', target_type: 'initiative', cross_product_eligible: true },\n  // v0.9.0 (UPG-660): the soft bridge from the annual strategy focus area to the\n  // roadmap grouping that realises it. Semantic, NOT hierarchy: strategic_theme and\n  // roadmap_theme sit on different spines (strategy cascade vs roadmap cascade), so\n  // this is a cross-reference, not containment. Pairs with the theme → roadmap_theme\n  // rename that removed the bare-'theme' collision (N6/UPG-652 lineage).\n  strategic_theme_realised_by_roadmap_theme: { forward_verb: 'realised_by', reverse_verb: 'realises', classification: 'semantic', source_type: 'strategic_theme', target_type: 'roadmap_theme' },\n  // v0.5.4 (UPG-511): three edges that lift strategic_theme from structural\n  // isolation to a conceptually central strategy node.\n  //\n  // `strategic_theme_delivers_outcome`: the causal link from a multi-quarter\n  // focus area to the business result it aims to produce.\n  //\n  // `strategic_theme_measured_by_key_result`: themes are broad; key results\n  // make them measurable. Direct link means a dashboard can surface KRs next\n  // to the theme without traversing objective.\n  //\n  // `strategic_theme_contains_objective`: the OKR containment edge (UPG-676,\n  // renamed from the malformed `objective_rolls_up_to_strategic_theme`).\n  // an objective is the specific quarterly bet *within* a theme. strategic_theme\n  // is the broader multi-quarter focus area; objective is subordinate.\n  // Direction: strategic_theme → objective (parent → child, per UPG hierarchy\n  // convention where source is the parent). The key now reads source-first\n  // (strategic_theme), the forward verb is the clean `contains` (was the\n  // malformed `contains_objective`), and the reverse verb `rolls_up_to`\n  // surfaces the upward-rollup read. Mirrors `strategic_pillar_organises_\n  // strategic_theme` (pillar → theme), completing the strategic cascade:\n  // strategic_pillar → strategic_theme → objective → key_result.\n  strategic_theme_delivers_outcome: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'causal', source_type: 'strategic_theme', target_type: 'outcome', cross_product_eligible: true },\n  strategic_theme_measured_by_key_result: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'causal', source_type: 'strategic_theme', target_type: 'key_result', cross_product_eligible: true },\n  strategic_theme_contains_objective: { forward_verb: 'contains', reverse_verb: 'rolls_up_to', classification: 'hierarchy', source_type: 'strategic_theme', target_type: 'objective', cross_product_eligible: true },\n  initiative_assumes_assumption: { forward_verb: 'assumes', reverse_verb: 'assumed_by', classification: 'hierarchy', source_type: 'initiative', target_type: 'assumption' },\n  // 0.20.1: the G6 alignment-sheet bridge edges — an initiative reaches directly\n  // into the OKR ladder and the roadmap, rather than only via its parent\n  // strategic_theme. `advances_key_result` is intra-strategy execution (both\n  // ends sit in the strategy domain), so causal not cross-domain; the KR is\n  // portfolio-shared like the initiative, so the pair is cross-product-eligible.\n  initiative_advances_key_result: { forward_verb: 'advances', reverse_verb: 'advanced_by', classification: 'causal', source_type: 'initiative', target_type: 'key_result', cross_product_eligible: true },\n  // `delivered_via_roadmap_theme` mirrors strategic_theme_realised_by_roadmap_theme:\n  // a semantic cross-reference between the strategy spine and the roadmap spine,\n  // not containment. roadmap_theme is not portfolio-shared, so this stays\n  // within-graph (no cross_product_eligible flag).\n  initiative_delivered_via_roadmap_theme: { forward_verb: 'delivered_via', reverse_verb: 'delivers', classification: 'semantic', source_type: 'initiative', target_type: 'roadmap_theme' },\n  initiative_drives_outcome: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'initiative', target_type: 'outcome', cross_product_eligible: true },\n  capability_enables_value_stream: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'cross-domain', source_type: 'capability', target_type: 'value_stream' },\n  // v0.5.2 (UPG-528): three capability-anchored edges that complete the\n  // Wardley-style value chain: need → capability → capability → feature.\n  // The catalog already had `strategic_pillar_enables_capability` (downward\n  // from strategy) and `capability_enables_value_stream` (outward toward\n  // delivery). What was missing was the inbound anchor (need fulfils chain\n  // start), the intra-capability dependency (value-chain spine), and the\n  // implementation hop (capability realised by user-facing feature).\n  //\n  // Hierarchy classification for all three: capabilities structurally\n  // decompose into sub-capabilities, fulfil specific needs, and are\n  // realised by concrete features; these are containment relationships,\n  // not lateral associations.\n  //\n  // `capability_depends_on_capability` is a same-type edge. The v0.5.0\n  // self-loop guard (UPG-520) refuses A → A; A → B between distinct\n  // capabilities is the supported shape. A value chain by definition has\n  // no node depending on itself, so this is correct.\n  need_fulfilled_by_capability: { forward_verb: 'fulfilled_by', reverse_verb: 'fulfils', classification: 'hierarchy', source_type: 'need', target_type: 'capability' },\n  capability_depends_on_capability: { forward_verb: 'depends_on', reverse_verb: 'depended_on_by', classification: 'hierarchy', source_type: 'capability', target_type: 'capability' },\n  capability_implemented_by_feature: { forward_verb: 'implemented_by', reverse_verb: 'implements', classification: 'hierarchy', source_type: 'capability', target_type: 'feature' },\n  vision_guides_objective: { forward_verb: 'guides', reverse_verb: 'guided_by', classification: 'cross-domain', source_type: 'vision', target_type: 'objective' },\n  metric_decomposes_into_metric: { forward_verb: 'decomposes_into', reverse_verb: 'rolls_up_to', classification: 'hierarchy', source_type: 'metric', target_type: 'metric' },\n  // (since v0.4.0) canonical replacement for the removed\n  // `MetricProperties.guardrail_for` string property. Use this edge to\n  // link a guard metric structurally to the primary metric it protects.\n  metric_guards_metric: { forward_verb: 'guards', reverse_verb: 'guarded_by', classification: 'semantic', source_type: 'metric', target_type: 'metric' },\n  metric_segmented_by_persona: { forward_verb: 'segmented_by', reverse_verb: 'segments', classification: 'cross-domain', source_type: 'metric', target_type: 'persona' },\n  metric_drives_outcome:                  { forward_verb: 'drives',            reverse_verb: 'driven_by',        classification: 'causal',     source_type: 'metric',            target_type: 'outcome' },\n\n  // 2.2 Product Specification Domain\n  product_organises_into_feature_area: { forward_verb: 'organises_into', reverse_verb: 'organises', classification: 'hierarchy', source_type: 'product', target_type: 'feature_area' },\n  product_builds_feature: { forward_verb: 'builds', reverse_verb: 'built_by', classification: 'hierarchy', source_type: 'product', target_type: 'feature' },\n  product_ships_via_release: { forward_verb: 'ships_via', reverse_verb: 'ships', classification: 'hierarchy', source_type: 'product', target_type: 'release' },\n  product_plans_via_roadmap: { forward_verb: 'plans_via', reverse_verb: 'plans_for', classification: 'hierarchy', source_type: 'product', target_type: 'roadmap' },\n  // (0.20.0) top-level attach for the cadence axis, mirroring product_plans_via_roadmap.\n  product_runs_planning_cycle: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'product', target_type: 'planning_cycle' },\n  product_categorises_by_roadmap_theme: { forward_verb: 'categorises_by', reverse_verb: 'categorises', classification: 'hierarchy', source_type: 'product', target_type: 'roadmap_theme' },\n  feature_area_contains_feature: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'feature_area', target_type: 'feature' },\n  feature_area_contains_feature_area: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'feature_area', target_type: 'feature_area' },\n  // (0.39.0, B4) Component catalogs group by area -- a storybook sidebar that\n  // follows the source tree, a visual-coverage report -- and the graph had no\n  // edge for it, so a measured estate tagged 133 components `area:<group>`\n  // instead. `groups`, not `contains`: the area does not OWN the component\n  // (a design_system or product does); it is a grouping view over components\n  // owned elsewhere, the same non-owning relationship `journey_phase_spans_journey_step`\n  // records. Multi-parent GRAMMAR with single per-instance parentage, the\n  // `quote` precedent.\n  feature_area_groups_design_component: { forward_verb: 'groups', reverse_verb: 'grouped_in', classification: 'hierarchy', source_type: 'feature_area', target_type: 'design_component' },\n  outcome_delivered_by_feature: { forward_verb: 'delivered_by', reverse_verb: 'delivers', classification: 'cross-domain', source_type: 'outcome', target_type: 'feature' },\n  outcome_delivered_via_feature_area: { forward_verb: 'delivered_via', reverse_verb: 'delivers_for', classification: 'cross-domain', source_type: 'outcome', target_type: 'feature_area' },\n  feature_decomposed_into_epic: { forward_verb: 'decomposed_into', reverse_verb: 'implements', classification: 'hierarchy', source_type: 'feature', target_type: 'epic' },\n  // user_story (P5 templated-statement, the \"As X, I want Y so Z\" lifecycle-free\n  // promise) verifies through acceptance criteria, is covered by test cases, and\n  // is specified by epics; the paired `task` carries the lifecycle and the\n  // implementation work, and implements the statement. (v0.2.7 split extracted\n  // the work into `task`; v0.7.0/UPG-571 re-canonicalised the statement\n  // story_statement → user_story; see UPG_EDGE_MIGRATIONS['0.7.0'].)\n  epic_specified_by_user_story: { forward_verb: 'specified_by', reverse_verb: 'specifies', classification: 'hierarchy', source_type: 'epic', target_type: 'user_story' },\n  // (0.35.0) The feature-level rung of the same ladder. `epic` is OPTIONAL in\n  // UPG — `feature_decomposed_into_epic` is not mandatory — so a feature that\n  // skips the epic level had no way to reach the stories that specify it, and\n  // `user_story` had exactly one declared parent. Verb pair is cloned verbatim\n  // from the epic rung above so the two rungs read identically; it is NOT\n  // `groups`, which would invent a second verb for one relationship.\n  //\n  // This is also the reason `feature_contains_acceptance_criterion` is NOT\n  // here: with this rung the path is feature → user_story → acceptance_\n  // criterion, and a direct containment edge would be the \"X_contains_Y verb\n  // that duplicates the parent link\" ARCHITECTURE.md forbids.\n  //\n  // Companion: `UPG_VALID_CHILDREN.feature` gains 'user_story'. Per-instance\n  // parentage stays single (`parent_id`), so the dual declared parent is a\n  // grammar widening, not a dual-parent instance.\n  feature_specified_by_user_story: { forward_verb: 'specified_by', reverse_verb: 'specifies', classification: 'hierarchy', source_type: 'feature', target_type: 'user_story' },\n  user_story_verified_by_acceptance_criterion: { forward_verb: 'verified_by', reverse_verb: 'verifies', classification: 'hierarchy', source_type: 'user_story', target_type: 'acceptance_criterion' },\n  task_implements_user_story: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'task', target_type: 'user_story' },\n  feature_affected_by_bug: { forward_verb: 'affected_by', reverse_verb: 'affects', classification: 'hierarchy', source_type: 'feature', target_type: 'bug' },\n  // release containment edges, used by the GitHub adapter when\n  // importing milestone→issue relationships. resolveContainmentEdge('release',\n  // 'feature') / ('release', 'bug') now return canonical keys instead of\n  // falling back to node_informs_node with mapping_confidence: 'low'.\n  release_contains_feature: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'release', target_type: 'feature' },\n  release_contains_bug: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'release', target_type: 'bug' },\n  release_documented_in_changelog: { forward_verb: 'documented_in', reverse_verb: 'documents', classification: 'hierarchy', source_type: 'release', target_type: 'changelog' },\n  roadmap_contains_roadmap_item: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'roadmap', target_type: 'roadmap_item' },\n  roadmap_categorised_by_roadmap_theme: { forward_verb: 'categorised_by', reverse_verb: 'categorises', classification: 'hierarchy', source_type: 'roadmap', target_type: 'roadmap_theme' },\n  roadmap_schedules_release: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'roadmap', target_type: 'release' },\n  roadmap_theme_groups_feature: { forward_verb: 'groups', reverse_verb: 'grouped_in', classification: 'hierarchy', source_type: 'roadmap_theme', target_type: 'feature' },\n  // feature_area is not contained by roadmap_theme; roadmap themes span multiple\n  // areas cross-cuttingly. Containment path: product → feature_area.\n  roadmap_theme_spans_feature_area: { forward_verb: 'spans', reverse_verb: 'spanned_by', classification: 'semantic', source_type: 'roadmap_theme', target_type: 'feature_area' },\n  // The legacy `story_task` collapsed into `task` (v0.4.0), so the implements\n  // relationship is the canonical `task_implements_user_story` above; there is\n  // no separate story_task edge. (v0.2.7 introduced the Statement/Implementation\n  // split; v0.7.0/UPG-571 re-canonicalised the statement to user_story.)\n  bug_affects_feature: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'bug', target_type: 'feature' },\n  roadmap_item_references_feature: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'roadmap_item', target_type: 'feature' },\n  feature_decomposes_into_task:           { forward_verb: 'decomposes_into',   reverse_verb: 'implements',       classification: 'hierarchy',  source_type: 'feature',           target_type: 'task' },\n  // Epic-level mirrors of the feature→task / feature→bug hierarchy (feedback\n  // df99026a). A `feature` is the flat planning root, but an `epic` is a body of\n  // work under it, and real imported ticket sets (Linear/Jira) carry bugs and\n  // pure engineering tasks that belong to ONE epic, not the feature as a whole.\n  // Without these, such tickets had to be mislabelled `user_story` (the only\n  // epic child) to keep the epic grouping. These are additive twins of the\n  // feature-level edges (same verbs/classification), so `pickCanonicalEdge` /\n  // `resolveContainmentEdge('epic', 'task'|'bug')` and the adapter import path\n  // resolve them with no further wiring.\n  // cross_product_eligible (feedback 9a10be30): an epic is a cross-team planning\n  // unit — its implementing task or affecting bug may live in a different\n  // product's engineering substrate (e.g. a consumer product's epic whose\n  // backend work is tracked in a separate platform/infra graph). Dual-registered\n  // like the objective↔dependency edges: valid within a product AND across\n  // products (endpoints referenced by qualified id).\n  epic_decomposes_into_task:              { forward_verb: 'decomposes_into',   reverse_verb: 'implements',       classification: 'hierarchy',  source_type: 'epic',              target_type: 'task', cross_product_eligible: true },\n  epic_affected_by_bug:                   { forward_verb: 'affected_by',       reverse_verb: 'affects',          classification: 'hierarchy',  source_type: 'epic',              target_type: 'bug', cross_product_eligible: true },\n  task_has_subtask:                       { forward_verb: 'has_subtask',       reverse_verb: 'is_subtask_of',    classification: 'hierarchy',  source_type: 'task',              target_type: 'task' },\n\n  // ── Planning cadence (0.20.0) ────────────────────────────────────────────────\n  // The cadence axis. E1 self-nests the interval (a program-increment contains\n  // iterations; a cycle contains its cooldown), mirroring team_contains_team.\n  planning_cycle_contains_planning_cycle: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'planning_cycle', target_type: 'planning_cycle' },\n  // E3: scheduling work into a cycle is a deliberate authoring act, not a\n  // containment nesting — the work item keeps its feature/epic parent and is\n  // merely referenced by the cycle. deliberate_only so the generic-inference\n  // chokepoints never auto-materialise it.\n  //\n  // WIDENED AT 0.32.0, renamed from planning_cycle_schedules_user_story. The\n  // story-only endpoint could not hold a real tracker import: the adapters\n  // default an unrecognised issue to `task`, so the type a cycle most needed to\n  // schedule was the one type it could not reach. Endpoint-polymorphic over the\n  // work-item set {feature, epic, user_story, task, bug} by the same\n  // construction as work_item_blocks_work_item in the same 0.20.0 batch — the\n  // `work_item` token names the intended semantic domain, the endpoint is the\n  // `node` wildcard. Three typed edges were the alternative and would have\n  // re-opened a decision this vocabulary already took for the same entity set.\n  planning_cycle_schedules_work_item: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'semantic', source_type: 'planning_cycle', target_type: 'node', deliberate_only: true },\n  // E2: the OKR cycle-scoping anchor. objective -> planning_cycle. planning_cycle\n  // is portfolio_shared, so this passes the cross-scope gate and ships as\n  // PROVISIONAL (allowed cross-product with a write-time warning, self-maintaining,\n  // never added to the curated set) rather than carrying a cross_product_eligible\n  // flag, which would make it curated. Eligibility is permission, not obligation.\n  objective_scoped_to_planning_cycle: { forward_verb: 'scoped_to', reverse_verb: 'scopes', classification: 'semantic', source_type: 'objective', target_type: 'planning_cycle' },\n  // F: the promoted `strategic_theme.time_horizon`. Same shape as E2 — a theme's\n  // bounded period becomes a scoping edge onto a shared, dated, nestable interval.\n  // Provisional (planning_cycle portfolio_shared). The property stays @deprecated.\n  strategic_theme_scoped_to_planning_cycle: { forward_verb: 'scoped_to', reverse_verb: 'scopes', classification: 'semantic', source_type: 'strategic_theme', target_type: 'planning_cycle' },\n  // Gap 2 — polymorphic issue links over the work-item set {feature, epic,\n  // user_story, task, bug}. Endpoint-polymorphic (node -> node, registered in\n  // UPG_POLYMORPHIC_EDGE_KEYS) so one edge covers every level teams link at; the\n  // `work_item_` key names the intended semantic domain. All deliberate_only: an\n  // issue link is authored, never inferred from hierarchy.\n  work_item_blocks_work_item: { forward_verb: 'blocks', reverse_verb: 'blocked_by', classification: 'causal', source_type: 'node', target_type: 'node', deliberate_only: true },\n  work_item_relates_to_work_item: { forward_verb: 'relates_to', reverse_verb: 'relates_to', classification: 'semantic', source_type: 'node', target_type: 'node', deliberate_only: true },\n  work_item_duplicates_work_item: { forward_verb: 'duplicates', reverse_verb: 'duplicated_by', classification: 'semantic', source_type: 'node', target_type: 'node', deliberate_only: true },\n\n  // 2.3 Legal Domain\n  product_owned_by_legal_entity: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'hierarchy', source_type: 'product', target_type: 'legal_entity' },\n  legal_entity_protects_ip_asset: { forward_verb: 'protects', reverse_verb: 'protected_by', classification: 'hierarchy', source_type: 'legal_entity', target_type: 'ip_asset' },\n  legal_entity_bound_by_contract: { forward_verb: 'bound_by', reverse_verb: 'binds', classification: 'hierarchy', source_type: 'legal_entity', target_type: 'contract' },\n  contract_contains_contract_clause: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'contract', target_type: 'contract_clause' },\n  product_governed_by_privacy_policy: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'hierarchy', source_type: 'product', target_type: 'privacy_policy' },\n  contract_governs_partnership: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'cross-domain', source_type: 'contract', target_type: 'partnership' },\n\n  // 2.4 UX Design Domain\n  product_maps_experience_via_user_journey: { forward_verb: 'maps_experience_via', reverse_verb: 'maps_for', classification: 'hierarchy', source_type: 'product', target_type: 'user_journey' },\n  product_navigated_via_user_flow: { forward_verb: 'navigated_via', reverse_verb: 'navigates', classification: 'hierarchy', source_type: 'product', target_type: 'user_flow' },\n  product_sketched_in_wireframe: { forward_verb: 'sketched_in', reverse_verb: 'sketches', classification: 'hierarchy', source_type: 'product', target_type: 'wireframe' },\n  product_contains_screen: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product', target_type: 'screen' },\n  user_journey_contains_journey_step: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'user_journey', target_type: 'journey_step' },\n  // peer-to-peer ordering between sibling journey_steps. Classification\n  // is `semantic` rather than introducing a new `temporal` value; precedence is\n  // a relational pattern, not containment, and existing order helpers\n  // (graph traversal) treat 'semantic' as the catch-all for non-causal,\n  // non-hierarchical relationships.\n  journey_step_precedes_journey_step: { forward_verb: 'precedes', reverse_verb: 'follows', classification: 'semantic', source_type: 'journey_step', target_type: 'journey_step' },\n  // (0.36.0, UPG feedback 510c4bfa) A user_flow states which user_journey it\n  // maps onto (`user_flow_maps_user_journey`) but not which of that journey's\n  // steps, in what order, it actually walks — the only recovery without this\n  // edge is inferring scope from shared screens, which both over-matches\n  // (co-located read-only steps) and under-matches (steps rendered off-screen).\n  // `journey_step` stays owned by its journey via `user_journey_contains_journey_step`;\n  // this is a reference into that ownership, not a second containment.\n  // `semantic`, not `cross-domain`: both `user_flow` and `journey_step` are in\n  // the ux_design domain, and T1.7's guardrail treats same-domain\n  // `cross-domain` edges as reclassification debt to pay down, not a pattern\n  // to extend — `journey_phase_spans_journey_step` carries that debt already;\n  // this edge does not repeat it. Same reasoning as `journey_step_precedes_journey_step`:\n  // 'semantic' is the catch-all for a non-causal, non-hierarchical, in-domain\n  // relationship. No `carries_properties`: the walked steps' own `step_order`\n  // is already the source of truth for sequence, so ordering is read off the\n  // target, not a second order system that could drift from the journey's. A\n  // flow walking steps out of journey order is a future `carries_properties`\n  // widening, not this one.\n  user_flow_walks_journey_step: { forward_verb: 'walks', reverse_verb: 'walked_by', classification: 'semantic', source_type: 'user_flow', target_type: 'journey_step' },\n  user_flow_routes_through_screen: { forward_verb: 'routes_through', reverse_verb: 'routed_in', classification: 'hierarchy', source_type: 'user_flow', target_type: 'screen' },\n  screen_renders_as_screen_state: { forward_verb: 'renders_as', reverse_verb: 'rendered_by', classification: 'hierarchy', source_type: 'screen', target_type: 'screen_state' },\n  need_reframed_as_design_question: { forward_verb: 'reframed_as', reverse_verb: 'reframes', classification: 'causal', source_type: 'need', target_type: 'design_question' },\n  design_question_answered_by_design_concept: { forward_verb: 'answered_by', reverse_verb: 'answers', classification: 'causal', source_type: 'design_question', target_type: 'design_concept' },\n  design_concept_realised_as_prototype: { forward_verb: 'realised_as', reverse_verb: 'realises', classification: 'causal', source_type: 'design_concept', target_type: 'prototype' },\n  design_concept_sketched_in_wireframe: { forward_verb: 'sketched_in', reverse_verb: 'sketches', classification: 'hierarchy', source_type: 'design_concept', target_type: 'wireframe' },\n  persona_experiences_user_journey: { forward_verb: 'experiences', reverse_verb: 'experienced_by', classification: 'cross-domain', source_type: 'persona', target_type: 'user_journey' },\n  user_journey_maps_persona: { forward_verb: 'maps', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'user_journey', target_type: 'persona' },\n  user_journey_addresses_job: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'user_journey', target_type: 'job' },\n  user_flow_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'user_flow', target_type: 'persona' },\n  journey_step_reveals_need: { forward_verb: 'reveals', reverse_verb: 'revealed_in', classification: 'cross-domain', source_type: 'journey_step', target_type: 'need' },\n  need_occurs_in_journey_step: { forward_verb: 'occurs_in', reverse_verb: 'reveals', classification: 'cross-domain', source_type: 'need', target_type: 'journey_step' },\n  // a journey_step can declare its primary feature before being\n  // decomposed into user_flows. Cross-domain (UX Design → Product Spec).\n  journey_step_realised_by_feature: { forward_verb: 'realised_by', reverse_verb: 'realises', classification: 'cross-domain', source_type: 'journey_step', target_type: 'feature' },\n  opportunity_improves_user_journey: { forward_verb: 'improves', reverse_verb: 'improved_by', classification: 'cross-domain', source_type: 'opportunity', target_type: 'user_journey' },\n  user_journey_passes_through_journey_phase: { forward_verb: 'passes_through', reverse_verb: 'is_phase_of', classification: 'hierarchy', source_type: 'user_journey', target_type: 'journey_phase' },\n  // (since v0.9.2, UPG-663) A journey_phase is a temporal BAND over the\n  // journey's single step timeline, not a container that owns steps. Steps\n  // belong to the journey via `user_journey_contains_journey_step` (the stable\n  // 0.1.0 spine); a phase merely SPANS a range of them. Mirrors the marketing\n  // precedent `customer_journey_stage_spans_journey_step`. Renamed from the\n  // owning `journey_phase_has_step` (hierarchy) so a step has exactly one\n  // containment parent. See UPG_EDGE_MIGRATIONS['0.9.2'].\n  journey_phase_spans_journey_step: { forward_verb: 'spans', reverse_verb: 'spanned_by', classification: 'cross-domain', source_type: 'journey_phase', target_type: 'journey_step' },\n  journey_step_has_action: { forward_verb: 'has_action', reverse_verb: 'is_action_in', classification: 'hierarchy', source_type: 'journey_step', target_type: 'journey_action' },\n  // (since v0.9.2, UPG-663) journey_action outbound edges. Fixes the\n  // discovery dead-end (D2). The finest blueprint layer carries pain_score /\n  // opportunity_score \"to drive opportunity discovery\" but previously had zero\n  // outbound edges. Opportunity discovery routes through `need` (mirroring\n  // `journey_step_reveals_need`), which already reaches `opportunity` via the\n  // user chain; the action does not link an opportunity directly. The feature\n  // edge mirrors `journey_step_realised_by_feature` one level deeper.\n  journey_action_surfaces_need: { forward_verb: 'surfaces', reverse_verb: 'surfaced_in', classification: 'cross-domain', source_type: 'journey_action', target_type: 'need' },\n  journey_action_realised_by_feature: { forward_verb: 'realised_by', reverse_verb: 'realises', classification: 'cross-domain', source_type: 'journey_action', target_type: 'feature' },\n\n  // ── surface (0.27.0): the place inside a screen ─────────────────────────\n  // `screen` is route-level; `surface` is the contested place within it. The\n  // eleven edges below give a surface its spine (nesting), its guest list, its\n  // purpose, its governing rule, its rendering vocabulary, its measurement,\n  // its replacement path, and (0.28.0) the gap between what it intends and\n  // what it actually does.\n  //\n  // Classification adjudications, each anchored on the nearest precedent:\n  //   contains        → hierarchy   (feature_area_contains_feature_area, planning_cycle_contains_planning_cycle)\n  //   serves job      → cross-domain (ux_design → users_needs; cf. user_journey_addresses_job).\n  //                     Verb is `serves`, not `addresses`: a feature ADDRESSES a job\n  //                     (it satisfies the struggle); a surface SERVES it (it is the\n  //                     place where the job gets done). `serves`/`served_by` is an\n  //                     established house pair (service_serves_api_endpoint,\n  //                     api_endpoint_serves_feature, product_serves_account).\n  //   governed_by     → cross-domain (ux_design → design_system). The verb precedent\n  //                     design_component_governed_by_design_guideline is `hierarchy`,\n  //                     but both of its endpoints sit inside design_system; once the\n  //                     seam is crossed the catalog uses cross-domain\n  //                     (insight_informs_design_guideline). cross_product_eligible:\n  //                     the guideline usually lives in the shared design-system graph.\n  //   renders comp.   → hierarchy + cross_product_eligible, matching its direct\n  //                     sibling screen_renders_design_component verbatim.\n  //   measured_by     → semantic + cross_product_eligible. The enumerated\n  //                     *_measured_by_metric convention splits on OWNERSHIP, not on the\n  //                     verb: outcome / objective / strategic_pillar are `hierarchy`\n  //                     because those entities own their metrics as children (each has a\n  //                     UPG_VALID_CHILDREN entry to match, which the hierarchy-integrity\n  //                     guardrail enforces). A surface does not own a metric any more\n  //                     than a revenue_stream does, so it takes the `semantic` half of\n  //                     the convention (revenue_stream / cost_structure). It stays\n  //                     cross_product_eligible with the rest: a metric DEFINITION is\n  //                     portfolio_shared, so the reading it names commonly lives in the\n  //                     registry rather than in the product graph.\n  //   supersedes      → semantic (prompt_version_supersedes_prompt_version).\n  surface_contains_surface: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'surface', target_type: 'surface', carries_properties: true, property_schema: CONFIGURATION_QUALIFIER_EDGE_PROPERTY_SCHEMA },\n  surface_serves_job: { forward_verb: 'serves', reverse_verb: 'served_by', classification: 'cross-domain', source_type: 'surface', target_type: 'job' },\n  surface_governed_by_design_guideline: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'cross-domain', source_type: 'surface', target_type: 'design_guideline', cross_product_eligible: true },\n  surface_renders_design_component: { forward_verb: 'renders', reverse_verb: 'rendered_on', classification: 'hierarchy', source_type: 'surface', target_type: 'design_component', cross_product_eligible: true },\n  surface_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'semantic', source_type: 'surface', target_type: 'metric', cross_product_eligible: true },\n  surface_supersedes_surface: { forward_verb: 'supersedes', reverse_verb: 'superseded_by', classification: 'semantic', source_type: 'surface', target_type: 'surface' },\n  // ── surface, 0.28.0 addition: intent versus reality ─────────────────────────\n  // Every surface property records what the design INTENDS. `capacity: 1` on a\n  // banner region is an assertion, and a real product will eventually be found\n  // rendering four. Without somewhere to put that fact, the only ways to record\n  // it are to edit `capacity` up to 4 (which destroys the intent, and with it\n  // any evidence that a gap exists) or to leave the graph quietly wrong.\n  //\n  // This edge is the third option, and it is what lets `capacity` mean intent\n  // unconditionally: the deviation hangs off a `technical_debt_item`, which is\n  // already a trackable, assignable, prioritisable entity with an owner and a\n  // remediation cost. The gap becomes work rather than a discrepancy.\n  //\n  //   classification → cross-domain (ux_design → technical_debt). Crossing INTO\n  //     the debt domain from another ring is the established shape:\n  //     risk_manifests_as_technical_debt_item is cross-domain on exactly that\n  //     reasoning. NOT `causal`: `decision_incurs_technical_debt_item` is causal\n  //     because a decision BRINGS the debt into existence, whereas a surface\n  //     does not cause its own drift, it exhibits it. NOT `hierarchy`: that\n  //     would oblige a surface → technical_debt_item containment pair in\n  //     UPG_VALID_CHILDREN (guardrail G2b), and a surface does not own the debt\n  //     that afflicts it — service_carries_technical_debt_item can be hierarchy\n  //     because a service genuinely owns its backlog.\n  //   verbs → `deviates_via` / `causes_deviation_in`. The forward verb names\n  //     what the SOURCE does (the surface deviates), qualified by the debt that\n  //     accounts for it, so the edge key reads as the sentence it asserts. The\n  //     reverse says what the debt does to the place.\n  //   not cross_product_eligible → a deviation is a fact about one product's\n  //     code, and `surface` is not portfolio_shared in the first place.\n  surface_deviates_via_technical_debt_item: { forward_verb: 'deviates_via', reverse_verb: 'causes_deviation_in', classification: 'cross-domain', source_type: 'surface', target_type: 'technical_debt_item' },\n  // ── surface, 0.30.0: composition that varies by configuration ───────────────\n  // A product's surface tree is not one tree; it is a family of trees selected\n  // by a configuration lever. The stored graph is the UNION of that family and\n  // a single configuration is a PROJECTION of it, so these two edges are how a\n  // graph says which member a fact belongs to. Silence still means \"every\n  // member\", which is why a graph written before 0.30.0 needs no migration.\n  //\n  //   varies_by   — CONDITIONAL EXISTENCE. The surface exists only under the\n  //                 values in `present_under`. An edge qualifier cannot say\n  //                 this: the reported case was a set of named chips REPLACED\n  //                 by one generic badge, where which surface EXISTS changes,\n  //                 and the two carry different capacities and occupants.\n  //   alternates  — \"one of these, depending\" as distinct from \"both,\n  //                 together\". Semantic, matching its sibling\n  //                 `surface_supersedes_surface`: neither surface owns the\n  //                 other, and a hierarchy classification would demand a\n  //                 UPG_VALID_CHILDREN pair that would be false. Explicit and\n  //                 validator-checked (same axis, disjoint present_under);\n  //                 never auto-derived, because disjointness is necessary for\n  //                 alternation and nowhere near sufficient.\n  //\n  // Direction on `alternates_with` is a CONVENTION, not an enforcement: declare\n  // it once, sourced from the surface present under the axis's `default_value`.\n  // An axis with no default is legal modelling, so a check keyed on the\n  // convention would fire on a correct graph, which is the one thing a check\n  // must never do.\n  // ── configuration_axis, 0.30.0: the lever itself ───────────────────────────\n  // Three layers, three owners, and keeping them apart is what makes the model\n  // honest: `engineering` owns the MECHANISM (`feature_flag`, with its key and\n  // rollout percentage), `product_spec` owns the LEVER (the named dimension\n  // along which what-you-ship differs), `ux_design` owns the PLACE (`surface`).\n  // Two code flags that move together are ONE lever with two values.\n  //\n  // `defines` is hierarchy so the axis has a home in `get_tree`. It earns the\n  // UPG_VALID_CHILDREN.product pair (guardrail G2b) on an honest verb: an axis\n  // exists only within the product whose composition it varies. The rejected\n  // alternative mirrors `classification_axis_owned_by_product`, a cross-domain\n  // ownership edge that leaves the node unparented and invisible in every tree.\n  product_defines_configuration_axis: { forward_verb: 'defines', reverse_verb: 'defined_by', classification: 'hierarchy', source_type: 'product', target_type: 'configuration_axis' },\n  feature_flag_drives_configuration_axis: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'feature_flag', target_type: 'configuration_axis' },\n  surface_varies_by_configuration_axis: { forward_verb: 'varies_by', reverse_verb: 'varies', classification: 'cross-domain', source_type: 'surface', target_type: 'configuration_axis', carries_properties: true, property_schema: CONFIGURATION_VARIANCE_EDGE_PROPERTY_SCHEMA },\n  surface_alternates_with_surface: { forward_verb: 'alternates_with', reverse_verb: 'alternates_with', classification: 'semantic', source_type: 'surface', target_type: 'surface' },\n  // Inbound. `feature_occupies_surface` is the guest list: the edge that makes\n  // \"what else lives here?\" answerable, and the one the contention anti-pattern\n  // counts. cross-domain (product_spec → ux_design), like screen_surfaces_feature\n  // running the other way.\n  feature_occupies_surface: { forward_verb: 'occupies', reverse_verb: 'occupied_by', classification: 'cross-domain', source_type: 'feature', target_type: 'surface', carries_properties: true, property_schema: CONFIGURATION_QUALIFIER_EDGE_PROPERTY_SCHEMA },\n  screen_renders_surface: { forward_verb: 'renders', reverse_verb: 'rendered_by', classification: 'hierarchy', source_type: 'screen', target_type: 'surface' },\n  decision_affects_surface: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'decision', target_type: 'surface' },\n  // The finer-grained sibling of journey_step_shown_on_screen: a step happens on\n  // a PLACE, not just a route. Same semantic classification as that edge (a step\n  // is not contained by the surface; it references where it happens).\n  journey_step_occurs_on_surface: { forward_verb: 'occurs_on', reverse_verb: 'hosts', classification: 'semantic', source_type: 'journey_step', target_type: 'surface' },\n\n  // 2.5 UI System Domain\n  product_systematised_in_design_system: { forward_verb: 'systematised_in', reverse_verb: 'systematises', classification: 'hierarchy', source_type: 'product', target_type: 'design_system' },\n  product_built_with_design_component: { forward_verb: 'built_with', reverse_verb: 'built_for', classification: 'hierarchy', source_type: 'product', target_type: 'design_component' },\n  design_system_contains_design_component: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'design_system', target_type: 'design_component' },\n  design_system_defines_design_token: { forward_verb: 'defines', reverse_verb: 'defined_in', classification: 'hierarchy', source_type: 'design_system', target_type: 'design_token' },\n  design_system_codified_in_design_guideline: { forward_verb: 'codified_in', reverse_verb: 'codifies', classification: 'hierarchy', source_type: 'design_system', target_type: 'design_guideline' },\n  design_system_expresses_brand_identity: { forward_verb: 'expresses', reverse_verb: 'expressed_in', classification: 'hierarchy', source_type: 'design_system', target_type: 'brand_identity' },\n  // Product expresses the brand (0.12.7, UPG-698). A product references the shared\n  // brand_identity. Dual-registered: also a cross-edge for the common case where the\n  // brand is a registry singleton in another graph (the ratified pattern: brand is a\n  // singleton expressed, not instance_of-d); this catalog entry is the within-graph case.\n  product_expresses_brand_identity: { forward_verb: 'expresses', reverse_verb: 'expressed_by', classification: 'semantic', source_type: 'product', target_type: 'brand_identity', cross_product_eligible: true },\n  design_system_encompasses_user_journey: { forward_verb: 'encompasses', reverse_verb: 'encompassed_in', classification: 'hierarchy', source_type: 'design_system', target_type: 'user_journey' },\n  design_system_encompasses_user_flow: { forward_verb: 'encompasses', reverse_verb: 'encompassed_in', classification: 'hierarchy', source_type: 'design_system', target_type: 'user_flow' },\n  design_system_informed_by_insight: { forward_verb: 'informed_by', reverse_verb: 'informs', classification: 'hierarchy', source_type: 'design_system', target_type: 'insight' },\n  // decision records design choices about the system; not contained by it.\n  design_system_decided_via_decision: { forward_verb: 'decided_via', reverse_verb: 'decided_for', classification: 'semantic', source_type: 'design_system', target_type: 'decision' },\n  design_component_styled_by_design_token: { forward_verb: 'styled_by', reverse_verb: 'styles', classification: 'hierarchy', source_type: 'design_component', target_type: 'design_token' },\n  // (0.39.0, B2) The alias tier. A modern token system is two or three tiers --\n  // primitives (`--gray-100`) that semantic tokens alias\n  // (`--background-high: light-dark(var(--gray-100), var(--gray-900))`) that\n  // components consume -- and the spec could hold the ends but not the middle,\n  // so a measured estate (163 DTCG primitives, 45 semantic aliases) kept its\n  // alias chain in descriptions. `causal`, not `semantic`: the alias's VALUE is\n  // computed from the primitive's, so the dependency is real and directional.\n  // `cross_product_eligible` because the primitive tier is routinely its own\n  // published package (its own graph) while the semantic tier lives with the\n  // component library. Makes \"which primitives does this component ultimately\n  // depend on\" and \"which primitives are dead\" traversals rather than scripts.\n  design_token_derives_from_design_token: { forward_verb: 'derives_from', reverse_verb: 'derived_into', classification: 'causal', source_type: 'design_token', target_type: 'design_token', cross_product_eligible: true },\n  design_component_follows_design_pattern: { forward_verb: 'follows', reverse_verb: 'followed_by', classification: 'hierarchy', source_type: 'design_component', target_type: 'design_pattern' },\n  design_component_governed_by_design_guideline: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'hierarchy', source_type: 'design_component', target_type: 'design_guideline' },\n  design_component_specified_by_interaction_spec: { forward_verb: 'specified_by', reverse_verb: 'specifies', classification: 'hierarchy', source_type: 'design_component', target_type: 'interaction_spec' },\n  // (0.39.0, B1) `cross_product_eligible` because a design system and the\n  // product that consumes it are two graphs: a Studio shadow component wrapping\n  // the @sanity/ui primitive it is built on could not be stated, and 11 such\n  // wrappers recorded the relationship in prose instead. Widened rather than\n  // minting `design_component_wraps_design_component`: a wrap IS composition\n  // read across a graph boundary, and a second verb for one relationship is the\n  // shadow-pair shape Pattern D collapses. `design_component` is already\n  // portfolio_shared, and the three sibling component edges\n  // (surface_renders_, screen_renders_, feature_uses_) are already eligible;\n  // this closes the last link between a product graph and its design system.\n  design_component_composes_design_component: { forward_verb: 'composes', reverse_verb: 'composed_in', classification: 'hierarchy', source_type: 'design_component', target_type: 'design_component', cross_product_eligible: true },\n  prototype_annotated_with_annotation: { forward_verb: 'annotated_with', reverse_verb: 'annotates', classification: 'hierarchy', source_type: 'prototype', target_type: 'annotation' },\n  screen_renders_design_component: { forward_verb: 'renders', reverse_verb: 'rendered_on', classification: 'hierarchy', source_type: 'screen', target_type: 'design_component', cross_product_eligible: true },\n  // Marketing surface to product (0.12.7, UPG-696/698). A marketing/landing screen\n  // markets a product. Dual-registered: also a cross-edge (UPG_CROSS_EDGE_TYPES) for\n  // the common case where the product lives in another graph; this catalog entry is\n  // the within-graph degenerate case (a product's own landing page).\n  screen_markets_product: { forward_verb: 'markets', reverse_verb: 'marketed_by', classification: 'semantic', source_type: 'screen', target_type: 'product', cross_product_eligible: true },\n  // Connective cross-product references (0.13.1, Data's connective-layer brief).\n  // Dual-registered (also in UPG_CROSS_EDGE_TYPES) for the common cross-graph case;\n  // these catalog entries are the within-graph degenerate case.\n  //   - screen_targets_competitor: a comparison / \"vs\" / positioning screen targets a\n  //     competitor (the competitor typically lives in a watched competitor-intel graph).\n  //   - feature_surfaces_product: a feature surfaces / embeds another product (a \"Canvas\"\n  //     feature that IS the Canvas product embedded). The feature-granular sibling of\n  //     depends_on_product; wires the portfolio from islands into a mesh.\n  //   - feature_uses_design_component: a feature consumes a shared design_component (the\n  //     feature sibling of screen_renders_design_component; the component lives in the\n  //     design-system product graph).\n  //   - product_implements_design_system: a product adopts / implements the shared design\n  //     system (the adoption semantic, mirroring product_implements_specification). Distinct\n  //     from the hierarchy `product_systematised_in_design_system` (structural containment):\n  //     same pattern as brand (branded_as = hierarchy, expresses = semantic).\n  screen_targets_competitor: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'semantic', source_type: 'screen', target_type: 'competitor', cross_product_eligible: true },\n  feature_surfaces_product: { forward_verb: 'surfaces', reverse_verb: 'surfaced_by', classification: 'semantic', source_type: 'feature', target_type: 'product', cross_product_eligible: true },\n  feature_uses_design_component: { forward_verb: 'uses', reverse_verb: 'used_by', classification: 'semantic', source_type: 'feature', target_type: 'design_component', cross_product_eligible: true },\n  product_implements_design_system: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'semantic', source_type: 'product', target_type: 'design_system', cross_product_eligible: true },\n  screen_navigates_to_screen: { forward_verb: 'navigates_to', reverse_verb: 'navigated_from', classification: 'hierarchy', source_type: 'screen', target_type: 'screen' },\n  screen_surfaces_feature: { forward_verb: 'surfaces', reverse_verb: 'surfaced_on', classification: 'cross-domain', source_type: 'screen', target_type: 'feature' },\n  screen_wireframed_as_wireframe: { forward_verb: 'wireframed_as', reverse_verb: 'wireframes', classification: 'hierarchy', source_type: 'screen', target_type: 'wireframe' },\n  wireframe_specifies_screen: { forward_verb: 'specifies', reverse_verb: 'specified_by', classification: 'cross-domain', source_type: 'wireframe', target_type: 'screen' },\n\n  // 2.6 Brand Domain\n  product_branded_as_brand_identity: { forward_verb: 'branded_as', reverse_verb: 'brands', classification: 'hierarchy', source_type: 'product', target_type: 'brand_identity' },\n  brand_identity_coloured_with_brand_colour: { forward_verb: 'coloured_with', reverse_verb: 'colours', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_colour' },\n  brand_identity_typeset_with_brand_typography: { forward_verb: 'typeset_with', reverse_verb: 'typesets', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_typography' },\n  brand_identity_speaks_with_brand_voice: { forward_verb: 'speaks_with', reverse_verb: 'voices', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_voice' },\n  brand_identity_expressed_in_brand_asset: { forward_verb: 'expressed_in', reverse_verb: 'expresses', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_asset' },\n  brand_identity_expressed_through_brand_imagery: { forward_verb: 'expressed_through', reverse_verb: 'expresses', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_imagery' },\n\n  // ── Part 3: Build Ring (Ring 3) ────────────────────────────────────────────\n\n  // 3.1 Engineering Domain\n  product_bounded_by_bounded_context: { forward_verb: 'bounded_by', reverse_verb: 'bounds', classification: 'hierarchy', source_type: 'product', target_type: 'bounded_context' },\n  product_decided_via_decision: { forward_verb: 'decided_via', reverse_verb: 'decides_for', classification: 'hierarchy', source_type: 'product', target_type: 'decision' },\n  product_bounded_by_constraint: { forward_verb: 'bounded_by', reverse_verb: 'bounds', classification: 'hierarchy', source_type: 'product', target_type: 'constraint' },\n  product_stored_in_code_repository: { forward_verb: 'stored_in', reverse_verb: 'stores', classification: 'hierarchy', source_type: 'product', target_type: 'code_repository' },\n  product_integrates_via_integration_pattern: { forward_verb: 'integrates_via', reverse_verb: 'integrates', classification: 'hierarchy', source_type: 'product', target_type: 'integration_pattern' },\n  product_connects_to_external_api: { forward_verb: 'connects_to', reverse_verb: 'connected_by', classification: 'hierarchy', source_type: 'product', target_type: 'external_api' },\n  product_flows_through_data_flow: { forward_verb: 'flows_through', reverse_verb: 'flows_for', classification: 'hierarchy', source_type: 'product', target_type: 'data_flow' },\n  bounded_context_deploys_service: { forward_verb: 'deploys', reverse_verb: 'deployed_in', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'service' },\n  bounded_context_emits_domain_event: { forward_verb: 'emits', reverse_verb: 'emitted_by', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'domain_event' },\n  bounded_context_decided_via_decision: { forward_verb: 'decided_via', reverse_verb: 'decides_for', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'decision' },\n  bounded_context_modelled_as_aggregate: { forward_verb: 'modelled_as', reverse_verb: 'models', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'aggregate' },\n  bounded_context_projected_as_read_model: { forward_verb: 'projected_as', reverse_verb: 'projects', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'read_model' },\n  bounded_context_persisted_in_data_model: { forward_verb: 'persisted_in', reverse_verb: 'persists', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'data_model' },\n  bounded_context_stored_in_code_repository: { forward_verb: 'stored_in', reverse_verb: 'stores', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'code_repository' },\n  bounded_context_integrates_via_integration_pattern: { forward_verb: 'integrates_via', reverse_verb: 'integrates', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'integration_pattern' },\n  bounded_context_connects_to_external_api: { forward_verb: 'connects_to', reverse_verb: 'connected_by', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'external_api' },\n  bounded_context_flows_through_data_flow: { forward_verb: 'flows_through', reverse_verb: 'flows_within', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'data_flow' },\n  bounded_context_contains_feature_area: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'cross-domain', source_type: 'bounded_context', target_type: 'feature_area' },\n  service_exposes_api_contract: { forward_verb: 'exposes', reverse_verb: 'exposed_by', classification: 'hierarchy', source_type: 'service', target_type: 'api_contract' },\n  service_carries_technical_debt_item: { forward_verb: 'carries', reverse_verb: 'carried_by', classification: 'hierarchy', source_type: 'service', target_type: 'technical_debt_item' },\n  service_toggles_feature_flag: { forward_verb: 'toggles', reverse_verb: 'toggled_by', classification: 'hierarchy', source_type: 'service', target_type: 'feature_flag' },\n  service_deployed_as_deployment: { forward_verb: 'deployed_as', reverse_verb: 'deploys', classification: 'hierarchy', source_type: 'service', target_type: 'deployment' },\n  // v0.7.2 (UPG-571 §1): change is the leading cause of incidents (DORA/SRE); connects the isolated `deployment` member to the ops anchor.\n  deployment_triggers_incident: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'causal', source_type: 'deployment', target_type: 'incident' },\n  service_serves_api_endpoint: { forward_verb: 'serves', reverse_verb: 'served_by', classification: 'hierarchy', source_type: 'service', target_type: 'api_endpoint' },\n  // v0.5.1 (UPG-517 C2): api_contract and api_endpoint both anchored from\n  // service as siblings, leaving the natural parent-child wiring absent. A\n  // contract groups endpoints by version/protocol; endpoints belong to a\n  // specific contract. Hierarchy classification is correct here: endpoints\n  // are structurally contained by their contract, not merely associated.\n  api_contract_contains_api_endpoint: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'api_contract', target_type: 'api_endpoint' },\n  service_persisted_in_database_schema: { forward_verb: 'persisted_in', reverse_verb: 'persists', classification: 'hierarchy', source_type: 'service', target_type: 'database_schema' },\n  service_publishes_to_queue_topic: { forward_verb: 'publishes_to', reverse_verb: 'published_by', classification: 'hierarchy', source_type: 'service', target_type: 'queue_topic' },\n  service_produces_build_artifact: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'service', target_type: 'build_artifact' },\n  service_depends_on_library_dependency: { forward_verb: 'depends_on', reverse_verb: 'dependency_of', classification: 'hierarchy', source_type: 'service', target_type: 'library_dependency' },\n  service_powers_feature_area: { forward_verb: 'powers', reverse_verb: 'powered_by', classification: 'cross-domain', source_type: 'service', target_type: 'feature_area' },\n  service_powers_feature: { forward_verb: 'powers', reverse_verb: 'powered_by', classification: 'cross-domain', source_type: 'service', target_type: 'feature' },\n  decision_incurs_technical_debt_item: { forward_verb: 'incurs', reverse_verb: 'incurred_by', classification: 'causal', source_type: 'decision', target_type: 'technical_debt_item' },\n  aggregate_contains_domain_entity: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'aggregate', target_type: 'domain_entity' },\n  aggregate_contains_value_object: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'aggregate', target_type: 'value_object' },\n  aggregate_handles_command: { forward_verb: 'handles', reverse_verb: 'handled_by', classification: 'hierarchy', source_type: 'aggregate', target_type: 'command' },\n  // v0.5.3 (UPG-517 C1): the DDD/CQRS event-flow spine. The pre-existing edges\n  // above (aggregate_contains_*, aggregate_handles_command, bounded_context_\n  // modelled_as_aggregate, bounded_context_emits_domain_event) cover the\n  // structural shape (who owns what). These three are the causal edges that\n  // make the event-driven dynamics expressible:\n  //\n  //   command  → produces      → domain_event   (a command emits exactly one\n  //                                              event per handle; the command\n  //                                              is the cause)\n  //   aggregate → emits         → domain_event   (the aggregate is the emitter\n  //                                              instance; same event, viewed\n  //                                              from its source)\n  //   domain_event → projected_to → read_model   (CQRS read-side projection;\n  //                                              the event is the cause of\n  //                                              the read-model update)\n  //\n  // All three are classified 'causal' rather than 'hierarchy': the relations\n  // are temporal cause-and-effect, not containment. The same domain_event is\n  // both produced_by a command AND emitted_by an aggregate; that polysemy is\n  // intentional and matches DDD/CQRS literature: a command is the trigger, the\n  // aggregate is the source. Composes cleanly with UPG-520 self-loop refusal;\n  // none of these are same-type edges.\n  aggregate_emits_domain_event: { forward_verb: 'emits', reverse_verb: 'emitted_by', classification: 'causal', source_type: 'aggregate', target_type: 'domain_event' },\n  command_produces_domain_event: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'causal', source_type: 'command', target_type: 'domain_event' },\n  domain_event_projected_to_read_model: { forward_verb: 'projected_to', reverse_verb: 'projected_from', classification: 'causal', source_type: 'domain_event', target_type: 'read_model' },\n  // Engineering: Causal & Investigation Edges\n  root_cause_causes_symptom: { forward_verb: 'causes', reverse_verb: 'caused_by', classification: 'causal', source_type: 'root_cause', target_type: 'symptom' },\n  root_cause_causes_bug: { forward_verb: 'causes', reverse_verb: 'caused_by', classification: 'causal', source_type: 'root_cause', target_type: 'bug' },\n  investigation_revealed_bug: { forward_verb: 'revealed', reverse_verb: 'revealed_by', classification: 'causal', source_type: 'investigation', target_type: 'bug' },\n  investigation_revealed_root_cause: { forward_verb: 'revealed', reverse_verb: 'revealed_by', classification: 'causal', source_type: 'investigation', target_type: 'root_cause' },\n  fix_resolved_bug: { forward_verb: 'resolved', reverse_verb: 'resolved_by', classification: 'causal', source_type: 'fix', target_type: 'bug' },\n  fix_resolved_root_cause: { forward_verb: 'resolved', reverse_verb: 'resolved_by', classification: 'causal', source_type: 'fix', target_type: 'root_cause' },\n  fix_derived_from_investigation: { forward_verb: 'derived_from', reverse_verb: 'produced', classification: 'causal', source_type: 'fix', target_type: 'investigation' },\n  root_cause_shares_cause_with_root_cause: { forward_verb: 'shares_cause_with', reverse_verb: 'shares_cause_with', classification: 'semantic', source_type: 'root_cause', target_type: 'root_cause' },\n  root_cause_manifests_as_technical_debt_item: { forward_verb: 'manifests_as', reverse_verb: 'manifested_by', classification: 'causal', source_type: 'root_cause', target_type: 'technical_debt_item' },\n  // investigation and root_cause are causal (triggered by service issues),\n  // not contained within a service. Investigation is its own top-level entity.\n  service_investigated_via_investigation: { forward_verb: 'investigated_via', reverse_verb: 'investigates', classification: 'causal', source_type: 'service', target_type: 'investigation' },\n  service_affected_by_root_cause: { forward_verb: 'affected_by', reverse_verb: 'affects', classification: 'causal', source_type: 'service', target_type: 'root_cause' },\n  bug_affects_service: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'bug', target_type: 'service' },\n  root_cause_affects_service: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'root_cause', target_type: 'service' },\n  root_cause_affects_feature: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'root_cause', target_type: 'feature' },\n  investigation_surfaces_symptom:         { forward_verb: 'surfaces',          reverse_verb: 'surfaced_by',      classification: 'hierarchy',  source_type: 'investigation',     target_type: 'symptom' },\n  root_cause_resolved_by_fix:             { forward_verb: 'resolved_by',       reverse_verb: 'resolves',         classification: 'causal',     source_type: 'root_cause',        target_type: 'fix' },\n  // Engineering: Cross-Domain Edges\n  bounded_context_contains_feature: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'cross-domain', source_type: 'bounded_context', target_type: 'feature' },\n  technical_debt_item_blocks_feature: { forward_verb: 'blocks', reverse_verb: 'blocked_by', classification: 'cross-domain', source_type: 'technical_debt_item', target_type: 'feature' },\n  api_endpoint_serves_feature: { forward_verb: 'serves', reverse_verb: 'served_by', classification: 'cross-domain', source_type: 'api_endpoint', target_type: 'feature' },\n  design_component_implements_feature: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'design_component', target_type: 'feature' },\n  design_component_consumes_service: { forward_verb: 'consumes', reverse_verb: 'consumed_by', classification: 'cross-domain', source_type: 'design_component', target_type: 'service' },\n  prototype_validates_feature: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'prototype', target_type: 'feature' },\n  wireframe_specifies_feature: { forward_verb: 'specifies', reverse_verb: 'specified_by', classification: 'cross-domain', source_type: 'wireframe', target_type: 'feature' },\n  user_flow_requires_feature: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'cross-domain', source_type: 'user_flow', target_type: 'feature' },\n\n  // 3.2 DevOps & Platform Domain\n  product_commits_to_service_level_objective: { forward_verb: 'commits_to', reverse_verb: 'committed_by', classification: 'hierarchy', source_type: 'product', target_type: 'service_level_objective' },\n  service_level_objective_measured_by_service_level_indicator: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'service_level_objective', target_type: 'service_level_indicator' },\n  service_level_objective_budgets_as_error_budget: { forward_verb: 'budgets_as', reverse_verb: 'budgeted_by', classification: 'hierarchy', source_type: 'service_level_objective', target_type: 'error_budget' },\n  product_experiences_incident: { forward_verb: 'experiences', reverse_verb: 'affects', classification: 'hierarchy', source_type: 'product', target_type: 'incident' },\n  incident_analysed_in_postmortem: { forward_verb: 'analysed_in', reverse_verb: 'analyses', classification: 'hierarchy', source_type: 'incident', target_type: 'postmortem' },\n  product_documented_in_runbook: { forward_verb: 'documented_in', reverse_verb: 'documents', classification: 'hierarchy', source_type: 'product', target_type: 'runbook' },\n  product_monitored_by_monitor: { forward_verb: 'monitored_by', reverse_verb: 'monitors', classification: 'hierarchy', source_type: 'product', target_type: 'monitor' },\n  monitor_triggers_via_alert_rule: { forward_verb: 'triggers_via', reverse_verb: 'triggered_by', classification: 'hierarchy', source_type: 'monitor', target_type: 'alert_rule' },\n  product_built_by_ci_pipeline: { forward_verb: 'built_by', reverse_verb: 'builds', classification: 'hierarchy', source_type: 'product', target_type: 'ci_pipeline' },\n  product_released_via_release_strategy: { forward_verb: 'released_via', reverse_verb: 'releases', classification: 'hierarchy', source_type: 'product', target_type: 'release_strategy' },\n  product_covered_by_on_call_rotation: { forward_verb: 'covered_by', reverse_verb: 'covers', classification: 'hierarchy', source_type: 'product', target_type: 'on_call_rotation' },\n  product_runs_on_infrastructure_component: { forward_verb: 'runs_on', reverse_verb: 'runs', classification: 'hierarchy', source_type: 'product', target_type: 'infrastructure_component' },\n  ci_pipeline_produces_build_artifact: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'ci_pipeline', target_type: 'build_artifact' },\n  infrastructure_component_committed_to_service_level_objective: { forward_verb: 'committed_to', reverse_verb: 'committed_by', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'service_level_objective' },\n  infrastructure_component_monitored_by_monitor: { forward_verb: 'monitored_by', reverse_verb: 'monitors', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'monitor' },\n  infrastructure_component_built_by_ci_pipeline: { forward_verb: 'built_by', reverse_verb: 'builds', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'ci_pipeline' },\n  infrastructure_component_experiences_incident: { forward_verb: 'experiences', reverse_verb: 'affects', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'incident' },\n  infrastructure_component_documented_in_runbook: { forward_verb: 'documented_in', reverse_verb: 'documents', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'runbook' },\n  infrastructure_component_released_via_release_strategy: { forward_verb: 'released_via', reverse_verb: 'releases', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'release_strategy' },\n  infrastructure_component_covered_by_on_call_rotation: { forward_verb: 'covered_by', reverse_verb: 'covers', classification: 'hierarchy', source_type: 'infrastructure_component', target_type: 'on_call_rotation' },\n  service_level_objective_tracks_metric: { forward_verb: 'tracks', reverse_verb: 'tracked_by', classification: 'cross-domain', source_type: 'service_level_objective', target_type: 'metric' },\n  service_level_objective_satisfies_service_level_agreement: { forward_verb: 'satisfies', reverse_verb: 'satisfied_by', classification: 'cross-domain', source_type: 'service_level_objective', target_type: 'service_level_agreement' },\n  incident_triggers_postmortem: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'cross-domain', source_type: 'incident', target_type: 'postmortem' },\n  incident_breaches_service_level_objective: { forward_verb: 'breaches', reverse_verb: 'breached_by', classification: 'cross-domain', source_type: 'incident', target_type: 'service_level_objective' },\n  incident_caused_by_root_cause: { forward_verb: 'caused_by', reverse_verb: 'causes', classification: 'cross-domain', source_type: 'incident', target_type: 'root_cause' },\n  incident_exploits_vulnerability: { forward_verb: 'exploits', reverse_verb: 'exploited_by', classification: 'cross-domain', source_type: 'incident', target_type: 'vulnerability' },\n  monitor_watches_service: { forward_verb: 'watches', reverse_verb: 'watched_by', classification: 'cross-domain', source_type: 'monitor', target_type: 'service' },\n  // v0.7.2 (UPG-571 §1): an SLI is by definition what monitoring measures (Google SRE); connects the isolated `monitor` member to its sibling SLI.\n  monitor_measures_service_level_indicator: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'semantic', source_type: 'monitor', target_type: 'service_level_indicator' },\n  ci_pipeline_deploys_service: { forward_verb: 'deploys', reverse_verb: 'deployed_by', classification: 'cross-domain', source_type: 'ci_pipeline', target_type: 'service' },\n  alert_rule_triggers_runbook: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'cross-domain', source_type: 'alert_rule', target_type: 'runbook' },\n  runbook_mitigates_incident: { forward_verb: 'mitigates', reverse_verb: 'mitigated_by', classification: 'cross-domain', source_type: 'runbook', target_type: 'incident' },\n  // v0.5.1 (UPG-517 C3): postmortem was a pure terminal (zero outgoing\n  // edges) despite the devops \"Incident Response Chain\" pattern routing\n  // through it. The existing `investigation_revealed_root_cause` edge\n  // anchors on `investigation`, not `postmortem`, so the documented chain\n  // (monitor → symptom → incident → postmortem → root_cause) broke at hop\n  // 4. Causal: postmortems analyse incidents and identify causes.\n  postmortem_identifies_root_cause: { forward_verb: 'identifies', reverse_verb: 'identified_by', classification: 'causal', source_type: 'postmortem', target_type: 'root_cause' },\n  // v0.5.1 (UPG-517 C3): real ops practice; postmortems generate runbook\n  // updates as action items. Previously no path between the two existed in\n  // the catalog. Causal: the postmortem produces (or updates) the runbook.\n  postmortem_produces_runbook: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'causal', source_type: 'postmortem', target_type: 'runbook' },\n\n  // 3.3 Security Domain\n  product_models_threats_with_threat_model: { forward_verb: 'models_threats_with', reverse_verb: 'modelled_for', classification: 'hierarchy', source_type: 'product', target_type: 'threat_model' },\n  threat_model_identifies_threat: { forward_verb: 'identifies', reverse_verb: 'identified_by', classification: 'hierarchy', source_type: 'threat_model', target_type: 'threat' },\n  threat_model_surfaces_vulnerability: { forward_verb: 'surfaces', reverse_verb: 'surfaced_by', classification: 'hierarchy', source_type: 'threat_model', target_type: 'vulnerability' },\n  product_enforces_security_control: { forward_verb: 'enforces', reverse_verb: 'enforced_by', classification: 'hierarchy', source_type: 'product', target_type: 'security_control' },\n  product_governed_by_security_policy: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'hierarchy', source_type: 'product', target_type: 'security_policy' },\n  // (UPG-677) product_experiences_incident_hierarchy retired — byte-identical\n  // shadow of product_experiences_incident (the clean key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  product_tested_by_penetration_test: { forward_verb: 'tested_by', reverse_verb: 'tests', classification: 'hierarchy', source_type: 'product', target_type: 'penetration_test' },\n  product_reviewed_by_security_review: { forward_verb: 'reviewed_by', reverse_verb: 'reviews', classification: 'hierarchy', source_type: 'product', target_type: 'security_review' },\n  product_classifies_data_with_data_classification: { forward_verb: 'classifies_data_with', reverse_verb: 'classifies_data_for', classification: 'hierarchy', source_type: 'product', target_type: 'data_classification' },\n  product_restricts_access_with_access_policy: { forward_verb: 'restricts_access_with', reverse_verb: 'restricts_access_for', classification: 'hierarchy', source_type: 'product', target_type: 'access_policy' },\n  security_policy_mandates_security_control: { forward_verb: 'mandates', reverse_verb: 'mandated_by', classification: 'hierarchy', source_type: 'security_policy', target_type: 'security_control' },\n  security_policy_defines_access_policy: { forward_verb: 'defines', reverse_verb: 'defined_by', classification: 'hierarchy', source_type: 'security_policy', target_type: 'access_policy' },\n  security_policy_establishes_data_classification: { forward_verb: 'establishes', reverse_verb: 'established_by', classification: 'hierarchy', source_type: 'security_policy', target_type: 'data_classification' },\n  security_policy_requires_threat_model: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'hierarchy', source_type: 'security_policy', target_type: 'threat_model' },\n  security_policy_schedules_security_review: { forward_verb: 'schedules', reverse_verb: 'scheduled_by', classification: 'hierarchy', source_type: 'security_policy', target_type: 'security_review' },\n  security_review_commissions_penetration_test: { forward_verb: 'commissions', reverse_verb: 'commissioned_by', classification: 'hierarchy', source_type: 'security_review', target_type: 'penetration_test' },\n  security_policy_governs_incident:       { forward_verb: 'governs',           reverse_verb: 'governed_by',      classification: 'hierarchy',  source_type: 'security_policy',   target_type: 'incident' },\n  threat_targets_service: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'threat', target_type: 'service' },\n  vulnerability_affects_service: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'vulnerability', target_type: 'service' },\n  security_control_mitigates_threat: { forward_verb: 'mitigates', reverse_verb: 'mitigated_by', classification: 'cross-domain', source_type: 'security_control', target_type: 'threat' },\n  penetration_test_assesses_service: { forward_verb: 'assesses', reverse_verb: 'assessed_by', classification: 'cross-domain', source_type: 'penetration_test', target_type: 'service' },\n  security_control_protects_service: { forward_verb: 'protects', reverse_verb: 'protected_by', classification: 'cross-domain', source_type: 'security_control', target_type: 'service' },\n  access_policy_governs_service: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'cross-domain', source_type: 'access_policy', target_type: 'service' },\n  vulnerability_discovered_by_penetration_test: { forward_verb: 'discovered_by', reverse_verb: 'discovers', classification: 'cross-domain', source_type: 'vulnerability', target_type: 'penetration_test' },\n  data_classification_applies_to_data_source: { forward_verb: 'applies_to', reverse_verb: 'classified_by', classification: 'cross-domain', source_type: 'data_classification', target_type: 'data_source' },\n\n  // 3.4 Quality Assurance & Testing Domain\n  // (UPG-678) test_plan re-homed validation → QA. It is the QA planning layer:\n  // the product owns its test plans; each plan is carried out by the suites it\n  // groups and specifies the environments it exercises.\n  product_plans_qa_via_test_plan: { forward_verb: 'plans_qa_via', reverse_verb: 'plans_qa_for', classification: 'hierarchy', source_type: 'product', target_type: 'test_plan' },\n  test_plan_executed_by_test_suite: { forward_verb: 'executed_by', reverse_verb: 'executes', classification: 'hierarchy', source_type: 'test_plan', target_type: 'test_suite' },\n  test_plan_specifies_test_environment: { forward_verb: 'specifies', reverse_verb: 'specified_by', classification: 'hierarchy', source_type: 'test_plan', target_type: 'test_environment' },\n  product_maintains_test_suite: { forward_verb: 'maintains', reverse_verb: 'maintained_by', classification: 'hierarchy', source_type: 'product', target_type: 'test_suite' },\n  test_suite_contains_test_case: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'test_suite', target_type: 'test_case' },\n  product_undergoes_qa_session: { forward_verb: 'undergoes', reverse_verb: 'conducted_on', classification: 'hierarchy', source_type: 'product', target_type: 'qa_session' },\n  test_suite_includes_regression_test: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'hierarchy', source_type: 'test_suite', target_type: 'regression_test' },\n  product_measured_by_test_coverage_report: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'product', target_type: 'test_coverage_report' },\n  product_provisioned_in_test_environment: { forward_verb: 'provisioned_in', reverse_verb: 'provisions', classification: 'hierarchy', source_type: 'product', target_type: 'test_environment' },\n  qa_session_discovers_bug: { forward_verb: 'discovers', reverse_verb: 'discovered_in', classification: 'hierarchy', source_type: 'qa_session', target_type: 'bug' },\n  test_suite_tested_via_qa_session: { forward_verb: 'tested_via', reverse_verb: 'tests', classification: 'hierarchy', source_type: 'test_suite', target_type: 'qa_session' },\n  test_suite_measured_by_test_coverage_report: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'test_suite', target_type: 'test_coverage_report' },\n  test_suite_deployed_in_test_environment: { forward_verb: 'deployed_in', reverse_verb: 'deploys', classification: 'hierarchy', source_type: 'test_suite', target_type: 'test_environment' },\n  test_case_validates_acceptance_criterion: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'test_case', target_type: 'acceptance_criterion' },\n  test_suite_covers_feature: { forward_verb: 'covers', reverse_verb: 'covered_by', classification: 'cross-domain', source_type: 'test_suite', target_type: 'feature' },\n  test_environment_mirrors_deployment: { forward_verb: 'mirrors', reverse_verb: 'mirrored_by', classification: 'cross-domain', source_type: 'test_environment', target_type: 'deployment' },\n  regression_test_guards_release: { forward_verb: 'guards', reverse_verb: 'guarded_by', classification: 'cross-domain', source_type: 'regression_test', target_type: 'release' },\n  test_case_covers_user_story: { forward_verb: 'covers', reverse_verb: 'covered_by', classification: 'cross-domain', source_type: 'test_case', target_type: 'user_story' },\n  qa_session_targets_feature: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'qa_session', target_type: 'feature' },\n  test_coverage_report_covers_service: { forward_verb: 'covers', reverse_verb: 'covered_by', classification: 'cross-domain', source_type: 'test_coverage_report', target_type: 'service' },\n  test_suite_produces_test_result:        { forward_verb: 'produces',          reverse_verb: 'produced_by',      classification: 'causal',     source_type: 'test_suite',        target_type: 'test_result' },\n  test_case_produces_test_result:         { forward_verb: 'produces',          reverse_verb: 'produced_by',      classification: 'causal',     source_type: 'test_case',         target_type: 'test_result' },\n\n  // 3.5 Accessibility Domain\n  product_conforms_to_a11y_standard: { forward_verb: 'conforms_to', reverse_verb: 'applies_to', classification: 'hierarchy', source_type: 'product', target_type: 'a11y_standard' },\n  a11y_standard_contains_a11y_guideline: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'a11y_standard', target_type: 'a11y_guideline' },\n  product_audited_by_a11y_audit: { forward_verb: 'audited_by', reverse_verb: 'audits', classification: 'hierarchy', source_type: 'product', target_type: 'a11y_audit' },\n  a11y_audit_discovers_a11y_issue: { forward_verb: 'discovers', reverse_verb: 'discovered_in', classification: 'hierarchy', source_type: 'a11y_audit', target_type: 'a11y_issue' },\n  product_annotated_with_a11y_annotation: { forward_verb: 'annotated_with', reverse_verb: 'annotates', classification: 'hierarchy', source_type: 'product', target_type: 'a11y_annotation' },\n  a11y_standard_verified_by_a11y_audit: { forward_verb: 'verified_by', reverse_verb: 'verifies', classification: 'hierarchy', source_type: 'a11y_standard', target_type: 'a11y_audit' },\n  a11y_standard_annotated_with_a11y_annotation: { forward_verb: 'annotated_with', reverse_verb: 'annotates', classification: 'hierarchy', source_type: 'a11y_standard', target_type: 'a11y_annotation' },\n  a11y_issue_affects_design_component: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'a11y_issue', target_type: 'design_component' },\n  a11y_audit_covers_feature: { forward_verb: 'covers', reverse_verb: 'covered_by', classification: 'cross-domain', source_type: 'a11y_audit', target_type: 'feature' },\n\n  // 3.6 AI/ML Operations Domain\n  product_powered_by_ai_model: { forward_verb: 'powered_by', reverse_verb: 'powers', classification: 'hierarchy', source_type: 'product', target_type: 'ai_model' },\n  // (UPG-665) The prompt abstraction is corrected to ai_model → prompt_template\n  // → prompt_version. The model defines templates; each template contains its\n  // versions. This replaces the inverted ai_model → prompt_version ownership\n  // and the backwards prompt_version → prompt_template edge.\n  ai_model_defines_prompt_template: { forward_verb: 'defines', reverse_verb: 'defined_by', classification: 'hierarchy', source_type: 'ai_model', target_type: 'prompt_template' },\n  prompt_template_contains_prompt_version: { forward_verb: 'contains', reverse_verb: 'version_of', classification: 'hierarchy', source_type: 'prompt_template', target_type: 'prompt_version' },\n  ai_model_benchmarked_by_eval_benchmark: { forward_verb: 'benchmarked_by', reverse_verb: 'benchmarks', classification: 'hierarchy', source_type: 'ai_model', target_type: 'eval_benchmark' },\n  eval_benchmark_executed_as_eval_run: { forward_verb: 'executed_as', reverse_verb: 'executes', classification: 'hierarchy', source_type: 'eval_benchmark', target_type: 'eval_run' },\n  ai_model_costed_by_ai_cost_tracker: { forward_verb: 'costed_by', reverse_verb: 'costs', classification: 'hierarchy', source_type: 'ai_model', target_type: 'ai_cost_tracker' },\n  ai_model_flagged_by_hallucination_report: { forward_verb: 'flagged_by', reverse_verb: 'flags', classification: 'hierarchy', source_type: 'ai_model', target_type: 'hallucination_report' },\n  ai_model_constrained_by_ai_guardrail: { forward_verb: 'constrained_by', reverse_verb: 'constrains', classification: 'hierarchy', source_type: 'ai_model', target_type: 'ai_guardrail' },\n  product_compared_via_model_comparison: { forward_verb: 'compared_via', reverse_verb: 'compares', classification: 'hierarchy', source_type: 'product', target_type: 'model_comparison' },\n  ai_model_compared_in_model_comparison: { forward_verb: 'compared_in', reverse_verb: 'compares', classification: 'hierarchy', source_type: 'ai_model', target_type: 'model_comparison' },\n  // (UPG-665, AI-10) prompt_version self-ordering: track iteration order with a\n  // real edge, not just a string property — the domain's own anti-pattern is\n  // \"version prompts like code\".\n  prompt_version_supersedes_prompt_version: { forward_verb: 'supersedes', reverse_verb: 'superseded_by', classification: 'semantic', source_type: 'prompt_version', target_type: 'prompt_version' },\n  // The TYPED subject edge. Kept alongside the polymorphic `eval_benchmark_measures_node`\n  // added in 0.31.0, on the same footing as `constraint_constrains_feature` beside\n  // `node_constrains_node`: reach for THIS one when the subject is a feature, and for the\n  // wildcard only when it is not. Two ways to say the same thing about a feature is the\n  // cost of the pair, and it is paid deliberately rather than by accident.\n  eval_benchmark_measures_feature: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'eval_benchmark', target_type: 'feature' },\n  /*\n   * 0.31.0 — the benchmark SUBJECT, polymorphic.\n   *\n   * An eval measures a tool, a document, a check, an importer, a feature. Those\n   * are unrelated types, so the subject relation is genuinely wildcard-shaped and\n   * follows the decision-to-anything family (`decision_influences_node`).\n   *\n   * THE WIDTH IS OVER-WIDE, AND THAT IS ON THE LABEL RATHER THAN LAUNDERED.\n   * The decision family's warrant is that a decision really is about anything. A\n   * benchmark is not: it measures a MEASURABLE thing, and this edge will happily\n   * claim a benchmark can measure a persona, which is meaningless. It ships as the\n   * honest deferral it is — the alternative was minting typed edges for subject\n   * types the spec does not yet have, which would answer \"what is a tool in the\n   * graph\" as a side effect of building an eval harness. That question is a stated\n   * non-goal, and deferring it is the point of choosing the wildcard.\n   *\n   * Registered in UPG_POLYMORPHIC_EDGE_KEYS; Audit 05 errors on any wildcard that\n   * is not.\n   */\n  eval_benchmark_measures_node: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'semantic', source_type: 'eval_benchmark', target_type: 'node' },\n  /*\n   * 0.31.0 — the labeled corpus a benchmark draws its cases from.\n   *\n   * `ai_dataset` reused rather than a new `corpus` type minted (Q5, ratified): the\n   * existing type plus one join edge carries the need, and a corpus type would be\n   * minted only if that demonstrably failed. It has not.\n   */\n  eval_benchmark_draws_cases_from_ai_dataset: { forward_verb: 'draws_cases_from', reverse_verb: 'provides_cases_to', classification: 'semantic', source_type: 'eval_benchmark', target_type: 'ai_dataset' },\n  ai_guardrail_enforces_security_policy: { forward_verb: 'enforces', reverse_verb: 'enforced_by', classification: 'cross-domain', source_type: 'ai_guardrail', target_type: 'security_policy' },\n  model_comparison_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'model_comparison', target_type: 'decision' },\n  ai_cost_tracker_feeds_cost_structure: { forward_verb: 'feeds', reverse_verb: 'fed_by', classification: 'cross-domain', source_type: 'ai_cost_tracker', target_type: 'cost_structure' },\n  ai_model_evaluated_through_ai_experiment: { forward_verb: 'evaluated_through', reverse_verb: 'evaluates',     classification: 'hierarchy',  source_type: 'ai_model',          target_type: 'ai_experiment' },\n  ai_model_trained_on_ai_dataset:         { forward_verb: 'trained_on',        reverse_verb: 'trains',           classification: 'hierarchy',  source_type: 'ai_model',          target_type: 'ai_dataset' },\n  ai_model_produces_ai_trace:             { forward_verb: 'produces',          reverse_verb: 'produced_by',      classification: 'causal',     source_type: 'ai_model',          target_type: 'ai_trace' },\n  // (UPG-665) Observability bridges — turn four sinks into wired evidence and\n  // close the Model Evaluation Loop.\n  // AI-3: an eval_run can reach the model and prompt version it judged.\n  eval_run_evaluates_ai_model:            { forward_verb: 'evaluates',         reverse_verb: 'evaluated_by',     classification: 'cross-domain', source_type: 'eval_run',         target_type: 'ai_model' },\n  eval_run_scores_prompt_version:         { forward_verb: 'scores',            reverse_verb: 'scored_by',        classification: 'cross-domain', source_type: 'eval_run',         target_type: 'prompt_version' },\n  // AI-5: a hallucination_report reaches the trace that produced it and its root cause.\n  hallucination_report_traces_to_ai_trace: { forward_verb: 'traces_to',        reverse_verb: 'traced_by',        classification: 'cross-domain', source_type: 'hallucination_report', target_type: 'ai_trace' },\n  hallucination_report_caused_by_root_cause: { forward_verb: 'caused_by',       reverse_verb: 'causes',           classification: 'cross-domain', source_type: 'hallucination_report', target_type: 'root_cause' },\n  // AI-6: an ai_trace reaches the prompt version it executed.\n  ai_trace_executed_prompt_version:       { forward_verb: 'executed',          reverse_verb: 'executed_in',      classification: 'cross-domain', source_type: 'ai_trace',          target_type: 'prompt_version' },\n  // AI-4/AI-11: an ai_dataset carries provenance to its data source.\n  ai_dataset_sourced_from_data_source:    { forward_verb: 'sourced_from',      reverse_verb: 'sources',          classification: 'cross-domain', source_type: 'ai_dataset',        target_type: 'data_source' },\n\n  // 3.7 Agentic Workflows & Process Domain\n  product_automated_via_workflow_template: { forward_verb: 'automated_via', reverse_verb: 'automates', classification: 'hierarchy', source_type: 'product', target_type: 'workflow_template' },\n  workflow_template_executed_as_workflow_run: { forward_verb: 'executed_as', reverse_verb: 'executes', classification: 'hierarchy', source_type: 'workflow_template', target_type: 'workflow_run' },\n  product_assisted_by_agent_definition: { forward_verb: 'assisted_by', reverse_verb: 'assists', classification: 'hierarchy', source_type: 'product', target_type: 'agent_definition' },\n  agent_definition_runs_agent_session: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'agent_definition', target_type: 'agent_session' },\n  workflow_template_gated_by_review_gate: { forward_verb: 'gated_by', reverse_verb: 'gates', classification: 'hierarchy', source_type: 'workflow_template', target_type: 'review_gate' },\n  review_gate_approved_via_approval_record: { forward_verb: 'approved_via', reverse_verb: 'approves', classification: 'hierarchy', source_type: 'review_gate', target_type: 'approval_record' },\n  agent_definition_capable_of_agent_skill: { forward_verb: 'capable_of', reverse_verb: 'enables', classification: 'hierarchy', source_type: 'agent_definition', target_type: 'agent_skill' },\n  agent_definition_triggered_via_agent_hook: { forward_verb: 'triggered_via', reverse_verb: 'triggers', classification: 'hierarchy', source_type: 'agent_definition', target_type: 'agent_hook' },\n  workflow_run_produces_workflow_artifact: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'workflow_run', target_type: 'workflow_artifact' },\n  agent_definition_orchestrates_workflow_template: { forward_verb: 'orchestrates', reverse_verb: 'orchestrated_by', classification: 'hierarchy', source_type: 'agent_definition', target_type: 'workflow_template' },\n  workflow_run_implements_initiative: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'workflow_run', target_type: 'initiative' },\n  agent_session_creates_decision: { forward_verb: 'creates', reverse_verb: 'created_by', classification: 'cross-domain', source_type: 'agent_session', target_type: 'decision' },\n  review_gate_blocks_release: { forward_verb: 'blocks', reverse_verb: 'blocked_by', classification: 'cross-domain', source_type: 'review_gate', target_type: 'release' },\n  agent_skill_extends_feature: { forward_verb: 'extends', reverse_verb: 'extended_by', classification: 'cross-domain', source_type: 'agent_skill', target_type: 'feature' },\n  workflow_artifact_references_deliverable: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'workflow_artifact', target_type: 'deliverable' },\n  agent_hook_triggers_ci_pipeline: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'cross-domain', source_type: 'agent_hook', target_type: 'ci_pipeline' },\n  workflow_template_defines_agent_task:   { forward_verb: 'defines',           reverse_verb: 'defined_by',       classification: 'hierarchy',  source_type: 'workflow_template', target_type: 'agent_task' },\n  agent_definition_spawns_agent_task:     { forward_verb: 'spawns',            reverse_verb: 'spawned_by',       classification: 'hierarchy',  source_type: 'agent_definition',  target_type: 'agent_task' },\n  // The delegation bridge (tasks-workflows-2026-08 §5). Before this, the whole\n  // automation domain could reach product work only at coarse grain —\n  // `workflow_run_implements_initiative` (initiative), `agent_skill_extends_feature`\n  // (feature), `agent_session_creates_decision` (decision),\n  // `workflow_artifact_references_deliverable` (deliverable) — and NOTHING reached\n  // `task`, the atomic unit of product work that `feature_decomposes_into_task` /\n  // `epic_decomposes_into_task` make the delivery hierarchy's leaf. So \"this agent\n  // work item IS the execution of that product task\" was inexpressible, and a\n  // human-vs-agent assignee could not be read off the graph.\n  // Cross-domain: agent_task lives in `automation`, task in product delivery.\n  // NOT hierarchy — the agent_task does not CONTAIN the task; both are\n  // independently-parented work items (`workflow_template_defines_agent_task` /\n  // `agent_definition_spawns_agent_task` own the agent side, feature/epic the\n  // product side), and the delegation is a lateral reference between them.\n  // Verb `executes` mirrors the domain's own vocabulary (`workflow_template`\n  // is `executed_as` a run); reverse reads \"this task is executed_by that agent task\".\n  agent_task_executes_task:               { forward_verb: 'executes',          reverse_verb: 'executed_by',      classification: 'cross-domain', source_type: 'agent_task',      target_type: 'task' },\n\n  // ── Part 4: Scale Ring (Ring 4) ────────────────────────────────────────────\n\n  // 4.1 Growth Domain\n  product_measures_funnel: { forward_verb: 'measures', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product', target_type: 'funnel' },\n  product_acquires_via_acquisition_channel: { forward_verb: 'acquires_via', reverse_verb: 'acquires_for', classification: 'hierarchy', source_type: 'product', target_type: 'acquisition_channel' },\n  product_segments_into_cohort: { forward_verb: 'segments_into', reverse_verb: 'segmented_for', classification: 'hierarchy', source_type: 'product', target_type: 'cohort' },\n  product_segments_into_behavioral_segment: { forward_verb: 'segments_into', reverse_verb: 'segmented_for', classification: 'hierarchy', source_type: 'product', target_type: 'behavioral_segment' },\n  product_grows_via_growth_loop: { forward_verb: 'grows_via', reverse_verb: 'grows', classification: 'hierarchy', source_type: 'product', target_type: 'growth_loop' },\n  product_attributed_via_attribution_model: { forward_verb: 'attributed_via', reverse_verb: 'attributes', classification: 'hierarchy', source_type: 'product', target_type: 'attribution_model' },\n  // v0.7.2 (UPG-571 §1): attribution = distributing credit across channels (the definition); connects the isolated `attribution_model` member to the acquisition_channel hub.\n  attribution_model_credits_acquisition_channel: { forward_verb: 'credits', reverse_verb: 'credited_by', classification: 'semantic', source_type: 'attribution_model', target_type: 'acquisition_channel' },\n  product_guided_by_metric: { forward_verb: 'guided_by', reverse_verb: 'guides', classification: 'hierarchy', source_type: 'product', target_type: 'metric' },\n  funnel_contains_funnel_step: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'funnel', target_type: 'funnel_step' },\n  acquisition_channel_runs_growth_campaign: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'acquisition_channel', target_type: 'growth_campaign' },\n  growth_campaign_tests_variant:          { forward_verb: 'tests',             reverse_verb: 'tested_in',        classification: 'hierarchy',  source_type: 'growth_campaign',   target_type: 'variant' },\n  growth_campaign_tests_via_experiment_plan: { forward_verb: 'tests_via', reverse_verb: 'tested_in', classification: 'hierarchy', source_type: 'growth_campaign', target_type: 'experiment_plan' },\n  // variant is owned by growth_campaign in the hierarchy; experiments\n  // test them via a semantic relationship.\n  experiment_run_tests_variant: { forward_verb: 'tests', reverse_verb: 'tested_in', classification: 'semantic', source_type: 'experiment_run', target_type: 'variant' },\n  // (UPG-677) metric_decomposed_into_metric retired — tense-twin of\n  // metric_decomposes_into_metric (the active-voice canonical key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  metric_drives_metric: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'causal', source_type: 'metric', target_type: 'metric' },\n  funnel_step_reveals_need: { forward_verb: 'reveals', reverse_verb: 'visible_in', classification: 'cross-domain', source_type: 'funnel_step', target_type: 'need' },\n  funnel_step_tracks_event_schema: { forward_verb: 'tracks', reverse_verb: 'fires_in', classification: 'cross-domain', source_type: 'funnel_step', target_type: 'event_schema' },\n  marketing_channel_drives_funnel: { forward_verb: 'drives', reverse_verb: 'fed_by', classification: 'cross-domain', source_type: 'marketing_channel', target_type: 'funnel' },\n  metric_measures_key_result: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'metric', target_type: 'key_result' },\n  behavioral_segment_maps_to_persona: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'behavioral_segment', target_type: 'persona' },\n  cohort_exposed_to_experiment_run: { forward_verb: 'exposed_to', reverse_verb: 'exposes', classification: 'cross-domain', source_type: 'cohort', target_type: 'experiment_run' },\n  acquisition_channel_drives_outcome: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'acquisition_channel', target_type: 'outcome' },\n  growth_campaign_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'growth_campaign', target_type: 'behavioral_segment' },\n  growth_loop_drives_metric: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'growth_loop', target_type: 'metric' },\n  // v0.7.2 (UPG-571 §1): growth loops are the engine behind sustainable channels (Reforge); connects the isolated `growth_loop` member to the acquisition_channel hub.\n  growth_loop_fuels_acquisition_channel: { forward_verb: 'fuels', reverse_verb: 'fueled_by', classification: 'semantic', source_type: 'growth_loop', target_type: 'acquisition_channel' },\n  variant_tests_hypothesis: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'cross-domain', source_type: 'variant', target_type: 'hypothesis' },\n  experiment_plan_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'experiment_plan', target_type: 'behavioral_segment' },\n  funnel_maps_persona: { forward_verb: 'maps', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'funnel', target_type: 'persona' },\n  cohort_represents_persona: { forward_verb: 'represents', reverse_verb: 'represented_by', classification: 'cross-domain', source_type: 'cohort', target_type: 'persona' },\n  acquisition_channel_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'acquisition_channel', target_type: 'behavioral_segment' },\n  acquisition_channel_reaches_persona: { forward_verb: 'reaches', reverse_verb: 'reached_by', classification: 'cross-domain', source_type: 'acquisition_channel', target_type: 'persona' },\n\n  // 4.2 Business Model Domain\n  product_monetised_via_business_model: { forward_verb: 'monetised_via', reverse_verb: 'monetises', classification: 'hierarchy', source_type: 'product', target_type: 'business_model' },\n  business_model_delivers_value_proposition: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'hierarchy', source_type: 'business_model', target_type: 'value_proposition' },\n  business_model_earns_via_revenue_stream: { forward_verb: 'earns_via', reverse_verb: 'earns_for', classification: 'hierarchy', source_type: 'business_model', target_type: 'revenue_stream' },\n  business_model_costs_via_cost_structure: { forward_verb: 'costs_via', reverse_verb: 'costs', classification: 'hierarchy', source_type: 'business_model', target_type: 'cost_structure' },\n  business_model_measured_by_unit_economics: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'business_model', target_type: 'unit_economics' },\n  business_model_partnered_via_partnership: { forward_verb: 'partnered_via', reverse_verb: 'partners_with', classification: 'hierarchy', source_type: 'business_model', target_type: 'partnership' },\n  business_model_requires_key_resource: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'hierarchy', source_type: 'business_model', target_type: 'key_resource' },\n  business_model_performs_key_activity: { forward_verb: 'performs', reverse_verb: 'performed_by', classification: 'hierarchy', source_type: 'business_model', target_type: 'key_activity' },\n  business_model_targets_market_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'business_model', target_type: 'market_segment' },\n  // (UPG-677) business_model_reaches_via_distribution_channel retired —\n  // near-synonym of business_model_distributes_via_distribution_channel (the\n  // kept canonical key; \"distributes_via\" is the Business Model Canvas Channels\n  // verb). FLAG: Captain has not separately confirmed this collapse. See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  business_model_maintains_customer_relationship: { forward_verb: 'maintains', reverse_verb: 'maintained_by', classification: 'hierarchy', source_type: 'business_model', target_type: 'customer_relationship' },\n  business_model_distributes_via_distribution_channel: { forward_verb: 'distributes_via', reverse_verb: 'distributes_for', classification: 'hierarchy', source_type: 'business_model', target_type: 'distribution_channel' },\n  revenue_stream_tiered_as_pricing_tier: { forward_verb: 'tiered_as', reverse_verb: 'tiers', classification: 'hierarchy', source_type: 'revenue_stream', target_type: 'pricing_tier' },\n  // metric isn't contained by revenue_stream / cost_structure.\n  // These are measurement relationships: semantic, not containment.\n  revenue_stream_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'semantic', source_type: 'revenue_stream', target_type: 'metric' },\n  cost_structure_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'semantic', source_type: 'cost_structure', target_type: 'metric' },\n  value_proposition_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'value_proposition', target_type: 'persona' },\n  // (since v0.4.0) canonical replacement for the removed\n  // `ValueProposition.gain_creators` string property. Link each gain\n  // (`outcome`) the proposition delivers structurally.\n  value_proposition_delivers_outcome: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'cross-domain', source_type: 'value_proposition', target_type: 'outcome' },\n  // (since v0.4.0) canonical replacement for the removed\n  // `ValueProposition.jobs_addressed` string property. Link each\n  // jobs-to-be-done the proposition addresses structurally.\n  value_proposition_addresses_job: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'value_proposition', target_type: 'job' },\n  // (since v0.4.0) canonical replacement for the removed\n  // `ValueProposition.pain_reliefs` string property. A pain is modelled\n  // as a `need` with `valence='pain'`; link each pain the proposition\n  // relieves structurally.\n  value_proposition_solves_need: { forward_verb: 'solves', reverse_verb: 'solved_by', classification: 'cross-domain', source_type: 'value_proposition', target_type: 'need' },\n  // (UPG-677) value_proposition_targets_persona_cross_domain retired —\n  // byte-identical shadow of value_proposition_targets_persona (the clean key).\n  // See UPG_EDGE_MIGRATIONS['0.9.9'].\n  revenue_stream_drives_metric: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'revenue_stream', target_type: 'metric' },\n  // Ring 5 structural edges\n  // (UPG-668, P-I) These three edges name `funnel_step` but were typed against\n  // `funnel`, so they resolved from the wrong side and were invisible on the\n  // funnel_step card. Repointed to `funnel_step`; keys unchanged.\n  funnel_step_maps_to_journey_step: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'funnel_step', target_type: 'journey_step' },\n  customer_journey_stage_contains_funnel_step: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'cross-domain', source_type: 'customer_journey_stage', target_type: 'funnel_step' },\n  customer_journey_stage_spans_journey_step: { forward_verb: 'spans', reverse_verb: 'spanned_by', classification: 'cross-domain', source_type: 'customer_journey_stage', target_type: 'journey_step' },\n  dependency_blocks_team: { forward_verb: 'blocks', reverse_verb: 'blocked_by', classification: 'cross-domain', source_type: 'dependency', target_type: 'team' },\n  dependency_depends_on_team: { forward_verb: 'depends_on', reverse_verb: 'depended_on_by', classification: 'cross-domain', source_type: 'dependency', target_type: 'team' },\n  program_implements_initiative: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'program', target_type: 'initiative' },\n  playbook_triggered_by_customer_health_score: { forward_verb: 'triggered_by', reverse_verb: 'triggers', classification: 'cross-domain', source_type: 'playbook', target_type: 'customer_health_score' },\n\n  // edges replacing deleted string properties with proper edges\n  partnership_with_integration_partner: { forward_verb: 'with', reverse_verb: 'partners_with', classification: 'cross-domain', source_type: 'partnership', target_type: 'integration_partner' },\n  market_segment_includes_persona: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'cross-domain', source_type: 'market_segment', target_type: 'persona' },\n  // inverse direction so resolve_edge_for_pair(persona, market_segment) resolves\n  persona_belongs_to_market_segment: { forward_verb: 'belongs_to', reverse_verb: 'includes_persona', classification: 'cross-domain', source_type: 'persona', target_type: 'market_segment' },\n  revenue_stream_priced_by_pricing_strategy: { forward_verb: 'priced_by', reverse_verb: 'prices', classification: 'cross-domain', source_type: 'revenue_stream', target_type: 'pricing_strategy' },\n  revenue_stream_drives_outcome: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'revenue_stream', target_type: 'outcome' },\n  // revenue_stream_measured_by_metric_cross_domain dropped in 0.13.0 Wave 1 (UPG-685 T0.1):\n  // a cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by\n  // verbs); pickCanonicalEdge never returned it. Dual-read to the canonical in UPG_EDGE_MIGRATIONS.\n  pricing_tier_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'behavioral_segment' },\n  key_resource_enables_value_proposition: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'cross-domain', source_type: 'key_resource', target_type: 'value_proposition' },\n\n  // 4.3 Go-To-Market Domain\n  product_goes_to_market_via_gtm_strategy: { forward_verb: 'goes_to_market_via', reverse_verb: 'markets', classification: 'hierarchy', source_type: 'product', target_type: 'gtm_strategy' },\n  gtm_strategy_targets_ideal_customer_profile: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'ideal_customer_profile' },\n  gtm_strategy_positions_via_positioning: { forward_verb: 'positions_via', reverse_verb: 'positions', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'positioning' },\n  gtm_strategy_launches_via_launch: { forward_verb: 'launches_via', reverse_verb: 'launches', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'launch' },\n  gtm_strategy_educates_via_content_strategy: { forward_verb: 'educates_via', reverse_verb: 'educates', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'content_strategy' },\n  gtm_strategy_sells_via_sales_motion: { forward_verb: 'sells_via', reverse_verb: 'sells', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'sales_motion' },\n  gtm_strategy_arms_with_competitive_battle_card: { forward_verb: 'arms_with', reverse_verb: 'arms', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'competitive_battle_card' },\n  gtm_strategy_generates_demand_via_demand_gen_program: { forward_verb: 'generates_demand_via', reverse_verb: 'generates', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'demand_gen_program' },\n  gtm_strategy_operates_in_territory: { forward_verb: 'operates_in', reverse_verb: 'operates_for', classification: 'hierarchy', source_type: 'gtm_strategy', target_type: 'territory' },\n  positioning_communicated_via_messaging: { forward_verb: 'communicated_via', reverse_verb: 'communicates', classification: 'hierarchy', source_type: 'positioning', target_type: 'messaging' },\n  positioning_challenged_by_objection: { forward_verb: 'challenged_by', reverse_verb: 'challenges', classification: 'hierarchy', source_type: 'positioning', target_type: 'objection' },\n  positioning_evidenced_by_proof_point: { forward_verb: 'evidenced_by', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'positioning', target_type: 'proof_point' },\n  value_proposition_challenged_by_objection: { forward_verb: 'challenged_by', reverse_verb: 'challenges', classification: 'hierarchy', source_type: 'value_proposition', target_type: 'objection' },\n  value_proposition_evidenced_by_proof_point: { forward_verb: 'evidenced_by', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'value_proposition', target_type: 'proof_point' },\n  competitive_battle_card_addresses_objection: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'hierarchy', source_type: 'competitive_battle_card', target_type: 'objection' },\n  objection_countered_by_rebuttal: { forward_verb: 'countered_by', reverse_verb: 'counters', classification: 'hierarchy', source_type: 'objection', target_type: 'rebuttal' },\n  rebuttal_evidenced_by_proof_point: { forward_verb: 'evidenced_by', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'rebuttal', target_type: 'proof_point' },\n  positioning_references_competitor: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'positioning', target_type: 'competitor' },\n  positioning_resonates_with_persona: { forward_verb: 'resonates_with', reverse_verb: 'resonated_by', classification: 'cross-domain', source_type: 'positioning', target_type: 'persona' },\n  positioning_differentiates_from_competitor: { forward_verb: 'differentiates_from', reverse_verb: 'differentiated_by', classification: 'cross-domain', source_type: 'positioning', target_type: 'competitor' },\n  ideal_customer_profile_maps_to_behavioral_segment: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'ideal_customer_profile', target_type: 'behavioral_segment' },\n  ideal_customer_profile_maps_to_persona: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'ideal_customer_profile', target_type: 'persona' },\n  ideal_customer_profile_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'ideal_customer_profile', target_type: 'behavioral_segment' },\n  launch_ships_with_release: { forward_verb: 'ships_with', reverse_verb: 'shipped_in', classification: 'cross-domain', source_type: 'launch', target_type: 'release' },\n  launch_amplified_by_growth_campaign: { forward_verb: 'amplified_by', reverse_verb: 'amplifies', classification: 'cross-domain', source_type: 'launch', target_type: 'growth_campaign' },\n  launch_ships_feature: { forward_verb: 'ships', reverse_verb: 'shipped_in', classification: 'cross-domain', source_type: 'launch', target_type: 'feature' },\n  launch_announces_release: { forward_verb: 'announces', reverse_verb: 'announced_by', classification: 'cross-domain', source_type: 'launch', target_type: 'release' },\n  messaging_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'messaging', target_type: 'persona' },\n  competitive_battle_card_references_competitor: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'competitive_battle_card', target_type: 'competitor' },\n  competitor_feature_inspires_feature: { forward_verb: 'inspires', reverse_verb: 'inspired_by', classification: 'cross-domain', source_type: 'competitor_feature', target_type: 'feature' },\n  territory_maps_to_behavioral_segment: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'territory', target_type: 'behavioral_segment' },\n\n  // GTM restructure: new structural and provenance edges\n  positioning_differentiates_via_value_proposition: { forward_verb: 'differentiates_via', reverse_verb: 'differentiates_for', classification: 'cross-domain', source_type: 'positioning', target_type: 'value_proposition' },\n  positioning_within_market_segment: { forward_verb: 'within', reverse_verb: 'positioned_by', classification: 'cross-domain', source_type: 'positioning', target_type: 'market_segment' },\n  ideal_customer_profile_targets_market_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'ideal_customer_profile', target_type: 'market_segment' },\n  launch_amplified_by_marketing_channel: { forward_verb: 'amplified_by', reverse_verb: 'amplifies', classification: 'cross-domain', source_type: 'launch', target_type: 'marketing_channel' },\n  sales_motion_qualifies_via_funnel_step: { forward_verb: 'qualifies_via', reverse_verb: 'qualifies_for', classification: 'cross-domain', source_type: 'sales_motion', target_type: 'funnel_step' },\n  objection_sourced_from_quote: { forward_verb: 'sourced_from', reverse_verb: 'surfaced_objection', classification: 'cross-domain', source_type: 'objection', target_type: 'quote' },\n  proof_point_derived_from_evidence: { forward_verb: 'derived_from', reverse_verb: 'evidences', classification: 'cross-domain', source_type: 'proof_point', target_type: 'evidence' },\n  proof_point_derived_from_insight: { forward_verb: 'derived_from', reverse_verb: 'evidences', classification: 'cross-domain', source_type: 'proof_point', target_type: 'insight' },\n\n  // 4.4 Pricing & Packaging Domain\n  product_priced_via_pricing_strategy: { forward_verb: 'priced_via', reverse_verb: 'prices', classification: 'hierarchy', source_type: 'product', target_type: 'pricing_strategy' },\n  pricing_strategy_tests_experiment_plan: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'hierarchy', source_type: 'pricing_strategy', target_type: 'experiment_plan' },\n  pricing_strategy_offers_pricing_tier: { forward_verb: 'offers', reverse_verb: 'offered_by', classification: 'hierarchy', source_type: 'pricing_strategy', target_type: 'pricing_tier' },\n  pricing_strategy_discounts_via_discount_strategy: { forward_verb: 'discounts_via', reverse_verb: 'discounts', classification: 'hierarchy', source_type: 'pricing_strategy', target_type: 'discount_strategy' },\n  pricing_strategy_trials_via_trial_config: { forward_verb: 'trials_via', reverse_verb: 'trials', classification: 'hierarchy', source_type: 'pricing_strategy', target_type: 'trial_config' },\n  pricing_strategy_gates_via_paywall: { forward_verb: 'gates_via', reverse_verb: 'gates', classification: 'hierarchy', source_type: 'pricing_strategy', target_type: 'paywall' },\n  pricing_tier_includes_feature: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'feature' },\n  pricing_tier_gated_by_paywall: { forward_verb: 'gated_by', reverse_verb: 'gates_tier', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'paywall' },\n  pricing_tier_trialed_via_trial_config: { forward_verb: 'trialed_via', reverse_verb: 'trials_tier', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'trial_config' },\n  pricing_tier_discounted_by_discount_strategy: { forward_verb: 'discounted_by', reverse_verb: 'discounts_tier', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'discount_strategy' },\n  experiment_run_tests_pricing_tier: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'pricing_tier' },\n  trial_config_unlocks_feature: { forward_verb: 'unlocks', reverse_verb: 'unlocked_by', classification: 'cross-domain', source_type: 'trial_config', target_type: 'feature' },\n  trial_config_drives_funnel: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'trial_config', target_type: 'funnel' },\n  paywall_gates_feature: { forward_verb: 'gates', reverse_verb: 'gated_by', classification: 'cross-domain', source_type: 'paywall', target_type: 'feature' },\n  discount_strategy_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'discount_strategy', target_type: 'behavioral_segment' },\n  pricing_tier_localised_as_regional_pricing: { forward_verb: 'localised_as', reverse_verb: 'localises', classification: 'cross-domain', source_type: 'pricing_tier', target_type: 'regional_pricing' },\n\n  // 4.5 Sales & Revenue Domain\n  product_sold_via_pipeline_sales: { forward_verb: 'sold_via', reverse_verb: 'sells', classification: 'hierarchy', source_type: 'product', target_type: 'pipeline_sales' },\n  pipeline_sales_contains_pipeline_stage: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'pipeline_sales', target_type: 'pipeline_stage' },\n  product_serves_account: { forward_verb: 'serves', reverse_verb: 'served_by', classification: 'hierarchy', source_type: 'product', target_type: 'account' },\n  account_contains_contact: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'account', target_type: 'contact' },\n  account_negotiates_deal: { forward_verb: 'negotiates', reverse_verb: 'negotiated_by', classification: 'hierarchy', source_type: 'account', target_type: 'deal' },\n  product_attracts_lead: { forward_verb: 'attracts', reverse_verb: 'attracted_to', classification: 'hierarchy', source_type: 'product', target_type: 'lead' },\n  deal_quoted_via_quote_document: { forward_verb: 'quoted_via', reverse_verb: 'quotes', classification: 'hierarchy', source_type: 'deal', target_type: 'quote_document' },\n  product_subscribed_via_subscription: { forward_verb: 'subscribed_via', reverse_verb: 'subscribes', classification: 'hierarchy', source_type: 'product', target_type: 'subscription' },\n  subscription_billed_via_invoice: { forward_verb: 'billed_via', reverse_verb: 'bills', classification: 'hierarchy', source_type: 'subscription', target_type: 'invoice' },\n  product_forecasted_via_forecast: { forward_verb: 'forecasted_via', reverse_verb: 'forecasts', classification: 'hierarchy', source_type: 'product', target_type: 'forecast' },\n  pipeline_sales_qualifies_lead: { forward_verb: 'qualifies', reverse_verb: 'qualified_in', classification: 'hierarchy', source_type: 'pipeline_sales', target_type: 'lead' },\n  pipeline_sales_manages_account: { forward_verb: 'manages', reverse_verb: 'managed_in', classification: 'hierarchy', source_type: 'pipeline_sales', target_type: 'account' },\n  pipeline_sales_projected_via_forecast: { forward_verb: 'projected_via', reverse_verb: 'projects', classification: 'hierarchy', source_type: 'pipeline_sales', target_type: 'forecast' },\n  pipeline_sales_converts_to_subscription: { forward_verb: 'converts_to', reverse_verb: 'converted_from', classification: 'hierarchy', source_type: 'pipeline_sales', target_type: 'subscription' },\n  deal_references_ideal_customer_profile: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'deal', target_type: 'ideal_customer_profile' },\n  lead_becomes_account: { forward_verb: 'becomes', reverse_verb: 'originated_as', classification: 'causal', source_type: 'lead', target_type: 'account' },\n  subscription_drives_revenue_stream: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'subscription', target_type: 'revenue_stream' },\n  forecast_predicts_revenue_stream: { forward_verb: 'predicts', reverse_verb: 'predicted_by', classification: 'cross-domain', source_type: 'forecast', target_type: 'revenue_stream' },\n  // v0.7.2 (UPG-571 §1): a forecast is the forward projection of a metric; connects the isolated `forecast` member to the analytics anchor.\n  forecast_projects_metric: { forward_verb: 'projects', reverse_verb: 'projected_by', classification: 'cross-domain', source_type: 'forecast', target_type: 'metric' },\n\n  // 4.6 Marketing & Communications Domain\n  product_markets_through_marketing_strategy: { forward_verb: 'markets_through', reverse_verb: 'markets', classification: 'hierarchy', source_type: 'product', target_type: 'marketing_strategy' },\n  marketing_strategy_activates_marketing_channel: { forward_verb: 'activates', reverse_verb: 'activated_by', classification: 'hierarchy', source_type: 'marketing_strategy', target_type: 'marketing_channel' },\n  marketing_strategy_targets_seo_keyword: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'marketing_strategy', target_type: 'seo_keyword' },\n  marketing_strategy_publishes_press_release: { forward_verb: 'publishes', reverse_verb: 'published_by', classification: 'hierarchy', source_type: 'marketing_strategy', target_type: 'press_release' },\n  marketing_strategy_hosts_event: { forward_verb: 'hosts', reverse_verb: 'hosted_by', classification: 'hierarchy', source_type: 'marketing_strategy', target_type: 'event' },\n  marketing_strategy_builds_community_via_community_initiative: { forward_verb: 'builds_community_via', reverse_verb: 'builds_for', classification: 'hierarchy', source_type: 'marketing_strategy', target_type: 'community_initiative' },\n  marketing_channel_runs_marketing_campaign_plan: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'marketing_channel', target_type: 'marketing_campaign_plan' },\n  marketing_campaign_plan_sends_email_sequence: { forward_verb: 'sends', reverse_verb: 'sent_by', classification: 'hierarchy', source_type: 'marketing_campaign_plan', target_type: 'email_sequence' },\n  marketing_campaign_plan_publishes_social_post: { forward_verb: 'publishes', reverse_verb: 'published_by', classification: 'hierarchy', source_type: 'marketing_campaign_plan', target_type: 'social_post' },\n  marketing_campaign_plan_runs_ad_creative: { forward_verb: 'runs', reverse_verb: 'run_by', classification: 'hierarchy', source_type: 'marketing_campaign_plan', target_type: 'ad_creative' },\n  product_announced_via_press_release: { forward_verb: 'announced_via', reverse_verb: 'announces', classification: 'hierarchy', source_type: 'product', target_type: 'press_release' },\n  product_hosts_event: { forward_verb: 'hosts', reverse_verb: 'hosted_by', classification: 'hierarchy', source_type: 'product', target_type: 'event' },\n  product_engages_via_community_initiative: { forward_verb: 'engages_via', reverse_verb: 'engages', classification: 'hierarchy', source_type: 'product', target_type: 'community_initiative' },\n  marketing_campaign_plan_targets_behavioral_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'marketing_campaign_plan', target_type: 'behavioral_segment' },\n  event_generates_lead: { forward_verb: 'generates', reverse_verb: 'generated_at', classification: 'cross-domain', source_type: 'event', target_type: 'lead' },\n  seo_keyword_drives_content_piece: { forward_verb: 'drives', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'seo_keyword', target_type: 'content_piece' },\n  ad_creative_references_messaging: { forward_verb: 'references', reverse_verb: 'expressed_in', classification: 'cross-domain', source_type: 'ad_creative', target_type: 'messaging' },\n  community_initiative_surfaces_insight_about_persona: { forward_verb: 'surfaces_insight_about', reverse_verb: 'understood_through', classification: 'cross-domain', source_type: 'community_initiative', target_type: 'persona' },\n\n  // ── Part 5: Operate Ring (Ring 5) ──────────────────────────────────────────\n\n  // 5.1 Operations & Customer Success Domain\n  product_supports_via_support_ticket: { forward_verb: 'supports_via', reverse_verb: 'supports', classification: 'hierarchy', source_type: 'product', target_type: 'support_ticket' },\n  product_listens_via_customer_feedback: { forward_verb: 'listens_via', reverse_verb: 'listened_to', classification: 'hierarchy', source_type: 'product', target_type: 'customer_feedback' },\n  product_loses_because_churn_reason: { forward_verb: 'loses_because', reverse_verb: 'causes_churn_for', classification: 'hierarchy', source_type: 'product', target_type: 'churn_reason' },\n  product_onboards_via_user_flow: { forward_verb: 'onboards_via', reverse_verb: 'onboards', classification: 'hierarchy', source_type: 'product', target_type: 'user_flow' },\n  product_health_scored_via_customer_health_score: { forward_verb: 'health_scored_via', reverse_verb: 'scores', classification: 'hierarchy', source_type: 'product', target_type: 'customer_health_score' },\n  product_operated_via_playbook: { forward_verb: 'operated_via', reverse_verb: 'operates', classification: 'hierarchy', source_type: 'product', target_type: 'playbook' },\n  product_guarantees_via_service_level_agreement: { forward_verb: 'guarantees_via', reverse_verb: 'guarantees', classification: 'hierarchy', source_type: 'product', target_type: 'service_level_agreement' },\n  product_celebrates_via_success_milestone: { forward_verb: 'celebrates_via', reverse_verb: 'celebrates', classification: 'hierarchy', source_type: 'product', target_type: 'success_milestone' },\n  product_blueprinted_via_service_blueprint: { forward_verb: 'blueprinted_via', reverse_verb: 'blueprints', classification: 'hierarchy', source_type: 'product', target_type: 'service_blueprint' },\n  product_measured_by_nps_campaign: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'product', target_type: 'nps_campaign' },\n  service_blueprint_contains_user_flow: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'user_flow' },\n  service_blueprint_contains_playbook: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'playbook' },\n  service_blueprint_contains_service_level_agreement: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'service_level_agreement' },\n  service_blueprint_contains_customer_health_score: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'customer_health_score' },\n  service_blueprint_contains_support_ticket: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'support_ticket' },\n  service_blueprint_contains_customer_feedback: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'service_blueprint', target_type: 'customer_feedback' },\n  customer_health_score_tracked_by_nps_campaign: { forward_verb: 'tracked_by', reverse_verb: 'tracks', classification: 'hierarchy', source_type: 'customer_health_score', target_type: 'nps_campaign' },\n  customer_health_score_contains_success_milestone: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'customer_health_score', target_type: 'success_milestone' },\n  customer_feedback_reveals_churn_reason: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'hierarchy', source_type: 'customer_feedback', target_type: 'churn_reason' },\n  user_flow_contains_customer_journey_stage: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'user_flow', target_type: 'customer_journey_stage' },\n  customer_journey_stage_contains_touchpoint: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'customer_journey_stage', target_type: 'touchpoint' },\n  // (UPG-677) reverse_verb normalised revealed_by_ticket → revealed_by when the\n  // support_ticket_reveals_need_cross_domain twin was collapsed into this clean key.\n  support_ticket_reveals_need: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'support_ticket', target_type: 'need' },\n  customer_feedback_creates_observation: { forward_verb: 'creates', reverse_verb: 'created_from_feedback', classification: 'cross-domain', source_type: 'customer_feedback', target_type: 'observation' },\n  churn_reason_generates_hypothesis: { forward_verb: 'generates', reverse_verb: 'generated_from_churn', classification: 'cross-domain', source_type: 'churn_reason', target_type: 'hypothesis' },\n  user_flow_maps_user_journey: { forward_verb: 'maps', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'user_flow', target_type: 'user_journey' },\n  service_level_agreement_governs_service: { forward_verb: 'governs', reverse_verb: 'governed_by_sla', classification: 'cross-domain', source_type: 'service_level_agreement', target_type: 'service' },\n  touchpoint_occurs_in_journey_step: { forward_verb: 'occurs_in', reverse_verb: 'has_touchpoint', classification: 'cross-domain', source_type: 'touchpoint', target_type: 'journey_step' },\n  nps_campaign_tracks_customer_health_score: { forward_verb: 'tracks', reverse_verb: 'tracked_by_nps', classification: 'cross-domain', source_type: 'nps_campaign', target_type: 'customer_health_score' },\n  playbook_targets_customer_journey_stage: { forward_verb: 'targets', reverse_verb: 'targeted_by_playbook', classification: 'cross-domain', source_type: 'playbook', target_type: 'customer_journey_stage' },\n  success_milestone_validates_outcome: { forward_verb: 'validates', reverse_verb: 'validated_by_milestone', classification: 'cross-domain', source_type: 'success_milestone', target_type: 'outcome' },\n  customer_health_score_informs_playbook: { forward_verb: 'informs', reverse_verb: 'informed_by_health_score', classification: 'cross-domain', source_type: 'customer_health_score', target_type: 'playbook' },\n  customer_feedback_becomes_feature_request: { forward_verb: 'becomes', reverse_verb: 'originated_from', classification: 'cross-domain', source_type: 'customer_feedback', target_type: 'feature_request' },\n  support_ticket_reports_bug: { forward_verb: 'reports', reverse_verb: 'reported_by', classification: 'cross-domain', source_type: 'support_ticket', target_type: 'bug' },\n  // (UPG-677) support_ticket_reveals_need_cross_domain retired — near-duplicate\n  // of support_ticket_reveals_need (the clean key, whose reverse_verb is now\n  // revealed_by). See UPG_EDGE_MIGRATIONS['0.9.9'].\n  churn_reason_reveals_need: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'churn_reason', target_type: 'need' },\n\n  // 5.2 Content & Knowledge Domain\n  product_publishes_content_piece: { forward_verb: 'publishes', reverse_verb: 'published_by', classification: 'hierarchy', source_type: 'product', target_type: 'content_piece' },\n  product_documents_in_knowledge_base_article: { forward_verb: 'documents_in', reverse_verb: 'documented_by', classification: 'hierarchy', source_type: 'product', target_type: 'knowledge_base_article' },\n  product_expressed_via_brand_asset: { forward_verb: 'expressed_via', reverse_verb: 'expresses', classification: 'hierarchy', source_type: 'product', target_type: 'brand_asset' },\n  product_documented_in_document: { forward_verb: 'documented_in', reverse_verb: 'documents', classification: 'hierarchy', source_type: 'product', target_type: 'document' },\n  // (UPG-665) product_prompted_via_prompt_template retired — prompt_template\n  // re-parented product → ai_model (ai_model_defines_prompt_template). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  product_templated_via_documentation_template: { forward_verb: 'templated_via', reverse_verb: 'templates', classification: 'hierarchy', source_type: 'product', target_type: 'documentation_template' },\n  product_records_in_document: { forward_verb: 'records_in', reverse_verb: 'records', classification: 'hierarchy', source_type: 'product', target_type: 'document' },\n  content_strategy_scheduled_in_content_calendar: { forward_verb: 'scheduled_in', reverse_verb: 'schedules', classification: 'hierarchy', source_type: 'content_strategy', target_type: 'content_calendar' },\n  content_strategy_themed_by_content_theme: { forward_verb: 'themed_by', reverse_verb: 'themes', classification: 'hierarchy', source_type: 'content_strategy', target_type: 'content_theme' },\n  content_calendar_contains_content_theme: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'content_theme' },\n  content_calendar_schedules_content_piece: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'content_piece' },\n  content_calendar_schedules_knowledge_base_article: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'knowledge_base_article' },\n  content_calendar_schedules_brand_asset: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'brand_asset' },\n  content_calendar_schedules_document: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'document' },\n  // (UPG-665) content_calendar_schedules_prompt_template retired — prompt_template\n  // re-homed to the ai_model containment tree (it is an AI artefact, not a\n  // content-calendar-scheduled item). See UPG_EDGE_MIGRATIONS['0.9.9'].\n  content_calendar_schedules_documentation_template: { forward_verb: 'schedules', reverse_verb: 'scheduled_in', classification: 'hierarchy', source_type: 'content_calendar', target_type: 'documentation_template' },\n  content_piece_supports_messaging: { forward_verb: 'supports', reverse_verb: 'supported_by', classification: 'cross-domain', source_type: 'content_piece', target_type: 'messaging' },\n  content_piece_part_of_growth_campaign: { forward_verb: 'part_of', reverse_verb: 'includes', classification: 'cross-domain', source_type: 'content_piece', target_type: 'growth_campaign' },\n  knowledge_base_article_documents_feature: { forward_verb: 'documents', reverse_verb: 'documented_by', classification: 'cross-domain', source_type: 'knowledge_base_article', target_type: 'feature' },\n  // (UPG-677) changelog_documents_release retired — inverse of the containment\n  // edge release_documented_in_changelog (release → changelog, matching the\n  // hierarchy release: ['changelog']). The \"changelog documents release\" read is\n  // preserved by that edge's reverse_verb (documents). FLAG: this is the only\n  // inverse pair collapsed; feature↔bug is kept (distinct classification +\n  // semantic). See UPG_EDGE_MIGRATIONS['0.9.9'].\n  prompt_template_powers_feature: { forward_verb: 'powers', reverse_verb: 'powered_by', classification: 'cross-domain', source_type: 'prompt_template', target_type: 'feature' },\n  content_theme_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'content_theme', target_type: 'persona' },\n  // v0.7.2 (UPG-571 §1): topic-cluster / content-pillar model; themes organize pieces. Connects the isolated `content_theme` AND `content_piece` members.\n  content_theme_organizes_content_piece: { forward_verb: 'organizes', reverse_verb: 'organized_under', classification: 'semantic', source_type: 'content_theme', target_type: 'content_piece' },\n  // Document Provenance Edges\n  document_describes_feature: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'feature' },\n  document_describes_vision: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'vision' },\n  document_describes_persona: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'persona' },\n  document_describes_competitor: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'competitor' },\n  document_describes_strategic_pillar: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'strategic_pillar' },\n  document_describes_market_segment: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'market_segment' },\n  document_describes_revenue_stream: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'revenue_stream' },\n  document_describes_positioning: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'positioning' },\n  document_describes_decision: { forward_verb: 'describes', reverse_verb: 'described_by', classification: 'semantic', source_type: 'document', target_type: 'decision' },\n  document_contains_insight: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'semantic', source_type: 'document', target_type: 'insight' },\n  // Research-provenance containment (0.17.5): a synthesis document is walkable\n  // to the evidence it sourced. Within-graph containment (the document and the\n  // evidence co-reside), so NOT cross_product_eligible.\n  document_contains_quote: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'semantic', source_type: 'document', target_type: 'quote' },\n  document_contains_observation: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'semantic', source_type: 'document', target_type: 'observation' },\n  /**\n   * A document EMBEDS this node's live value at a position in its prose.\n   *\n   * @remarks\n   * NOT `describes`. `document_describes_persona` says the document is ABOUT the\n   * persona. Transclusion says the document RENDERS that node where the prose\n   * sits, so the value a reader sees is the node's current value rather than a\n   * copy taken when the sentence was written. A PRD that transcludes a metric is\n   * not \"about\" the metric, and collapsing the two would lose the only property\n   * transclusion is bought for: current by construction. The nine-member\n   * `document_describes_*` family is untouched and keeps its meaning.\n   *\n   * POLYMORPHIC because the target set is genuinely open. Anything renderable can\n   * be embedded, and the nine enumerated describe-targets are none of `metric`,\n   * `research_study`, `specification` or `architecture_decision`, which is what\n   * 65% of measured documents carrying zero outbound edges were reaching for.\n   *\n   * THE ANCHOR BINDING (normative). `@unified-product-graph/markdown` already\n   * parses an inline reference form and records the source line of every\n   * occurrence: `[[type:id]]`, `[[type:id|label]]`, `[[type:id|k:v|...]]`,\n   * `[[+type:id]]` for creation, and `[[type:id@product]]` across products. The\n   * grammar is published as Appendix F of the specification paper. The rule that\n   * was missing, and is stated here: an anchor appearing in the body of a\n   * `document` IS a transclusion anchor, and a conformant parser WRITES this edge\n   * beside it. Anchor and edge are one fact recorded twice, so they must be\n   * written together or they drift.\n   *\n   * NO POSITION PROPERTY, deliberately. The obvious `anchor_line` is the most\n   * volatile value a text document has: every insertion above moves every anchor\n   * below, so a stored line number is wrong after the next paragraph and nothing\n   * reports the drift. The anchor IS the position, and it lives in the prose\n   * where ordinary editing moves it for free. What the law asks is that the edge\n   * be written BESIDE the anchor, which is a write-time discipline rather than a\n   * stored field.\n   *\n   * `deliberate_only`, and the 0.33.0 trap is why that is safe here. Flagging a\n   * widened edge `deliberate_only` silently switched five adapters off in the\n   * last release, two of them under a green suite. The rule that came out of it:\n   * an adapter reading an explicit field the SOURCE stores carries an authored\n   * fact rather than an inferred one and must emit deliberate-only edges\n   * EXPLICITLY. A `[[type:id]]` anchor is as explicit as a source gets, because a\n   * person typed it, so the markdown emitter keys on the ANCHOR and never on the\n   * `node` wildcard. No generic pair-resolution path may ever produce one.\n   */\n  document_transcludes_node: { forward_verb: 'transcludes', reverse_verb: 'transcluded_in', classification: 'semantic', source_type: 'document', target_type: 'node', deliberate_only: true },\n\n  // 5.3 Customer Education & Training Domain\n  product_educates_via_education_program: { forward_verb: 'educates_via', reverse_verb: 'educates', classification: 'hierarchy', source_type: 'product', target_type: 'education_program' },\n  education_program_teaches_via_tutorial: { forward_verb: 'teaches_via', reverse_verb: 'teaches', classification: 'hierarchy', source_type: 'education_program', target_type: 'tutorial' },\n  education_program_guides_via_walkthrough: { forward_verb: 'guides_via', reverse_verb: 'guides', classification: 'hierarchy', source_type: 'education_program', target_type: 'walkthrough' },\n  education_program_presents_via_webinar: { forward_verb: 'presents_via', reverse_verb: 'presents', classification: 'hierarchy', source_type: 'education_program', target_type: 'webinar' },\n  education_program_certifies_via_certification: { forward_verb: 'certifies_via', reverse_verb: 'certifies', classification: 'hierarchy', source_type: 'education_program', target_type: 'certification' },\n  education_program_demonstrates_via_help_video: { forward_verb: 'demonstrates_via', reverse_verb: 'demonstrates', classification: 'hierarchy', source_type: 'education_program', target_type: 'help_video' },\n  education_program_structures_via_learning_path: { forward_verb: 'structures_via', reverse_verb: 'structures', classification: 'hierarchy', source_type: 'education_program', target_type: 'learning_path' },\n  learning_path_contains_tutorial: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'learning_path', target_type: 'tutorial' },\n  learning_path_includes_certification: { forward_verb: 'includes', reverse_verb: 'included_in_path', classification: 'hierarchy', source_type: 'learning_path', target_type: 'certification' },\n  tutorial_explains_feature: { forward_verb: 'explains', reverse_verb: 'explained_by_tutorial', classification: 'cross-domain', source_type: 'tutorial', target_type: 'feature' },\n  walkthrough_maps_user_flow: { forward_verb: 'maps', reverse_verb: 'mapped_by_walkthrough', classification: 'cross-domain', source_type: 'walkthrough', target_type: 'user_flow' },\n  certification_validates_skill: { forward_verb: 'validates', reverse_verb: 'validated_by_certification', classification: 'cross-domain', source_type: 'certification', target_type: 'skill' },\n  help_video_documents_screen: { forward_verb: 'documents', reverse_verb: 'documented_by_video', classification: 'cross-domain', source_type: 'help_video', target_type: 'screen' },\n  tutorial_references_knowledge_base_article: { forward_verb: 'references', reverse_verb: 'referenced_by_tutorial', classification: 'cross-domain', source_type: 'tutorial', target_type: 'knowledge_base_article' },\n  webinar_generates_content_piece: { forward_verb: 'generates', reverse_verb: 'generated_from_webinar', classification: 'cross-domain', source_type: 'webinar', target_type: 'content_piece' },\n\n  // ── Part 6: Extend Ring (Ring 6) ───────────────────────────────────────────\n\n  // 6.1 Team & Organisation Domain\n  product_staffed_by_team: { forward_verb: 'staffed_by', reverse_verb: 'staffs', classification: 'hierarchy', source_type: 'product', target_type: 'team' },\n  product_influenced_by_stakeholder: { forward_verb: 'influenced_by', reverse_verb: 'influences', classification: 'hierarchy', source_type: 'product', target_type: 'stakeholder' },\n  // (UPG-677) product_decided_via_decision_hierarchy retired — duplicate of\n  // product_decided_via_decision (the clean key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  product_organised_into_department: { forward_verb: 'organised_into', reverse_verb: 'organises', classification: 'hierarchy', source_type: 'product', target_type: 'department' },\n  department_contains_team: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'department', target_type: 'team' },\n  // Second-level team nesting (0.17.2). department_contains_team covers the first\n  // level (department -> team); this covers a team nested inside another team in\n  // the same department (a sub-team or squad under a parent team). Modelled\n  // parent -> child like feature_area_contains_feature_area, so the org map builds\n  // correctly in get_tree (which reads source as the parent); the reverse verb\n  // belongs_to gives the upward \"this team is part of that team\" read. The\n  // same-department expectation is advisory (a write-time warning), never a hard\n  // block; cross-department reporting lines belong to person_reports_to_person at\n  // the individual level.\n  team_contains_team: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'team', target_type: 'team' },\n  department_includes_stakeholder: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'hierarchy', source_type: 'department', target_type: 'stakeholder' },\n  // NOTE: `person` is a containment-free entity type (see\n  // UPG_CONTAINMENT_FREE_TYPES in grammar/hierarchy.ts). It is referenced\n  // by other nodes via `node_owned_by_person` but is not structurally\n  // contained by product / department / team. Hierarchy edges for person\n  // are deliberately omitted; adding them only to satisfy a hierarchy\n  // audit would invert the orthogonality the type was introduced to express.\n  // ── Org membership and reporting (0.33.0) ───────────────────────────────────\n  // Both edges are `semantic` REFERENCE edges and neither is a reversal of\n  // the containment-free stance recorded immediately above. That note forecloses\n  // HIERARCHY edges added ONLY to satisfy a hierarchy audit; these are neither.\n  // UPG_CONTAINMENT_FREE_TYPES, UPG_VALID_CHILDREN, get_tree and G2b are all\n  // untouched, and node_assigned_to_person was minted cross-domain onto `person`\n  // at 0.32.0 on the same reading.\n  //\n  // DIRECTION IS LOAD-BEARING, not a preference. get_tree reads SOURCE as parent\n  // (see the team_contains_team note above), so a team -> person edge would sit\n  // one classification change away from putting people in the org tree. Sourcing\n  // on `person` makes the containment reading unavailable rather than merely\n  // unchosen. `team_includes_person` classified hierarchy is the shape to refuse.\n  //\n  // CLASSIFICATION IS `semantic` AND NOT `cross-domain`, which the 0.33.0 design\n  // recommended before the guardrail was consulted. `person` and `team` both live\n  // in the team_org domain, so a `cross-domain` label would contradict itself: the\n  // edge crosses no domain boundary, and T1.7 forbids NEW same-domain cross-domain\n  // edges precisely so that debt stops growing. Nothing the design argument\n  // depends on moves: `semantic` enters neither UPG_VALID_CHILDREN nor get_tree,\n  // and G2b is not engaged.\n  // Membership is UNQUALIFIED: no role property on the edge. `role` is already an\n  // entity type with team_staffed_with_role, so a role string here would be a\n  // second role model beside a node type. The consequence that used to follow is\n  // now closed rather than accepted: the graph can say a team has a slot, that a\n  // person is on the team, AND that the person fills the slot, the last through\n  // `person_holds_role` (0.34.0) rather than through a qualifier here.\n  //\n  // Neither is cross_product_eligible: `person` is not portfolio_shared, so the\n  // 0.18.0 both-endpoints gate rejects the flag regardless of any team-scoping\n  // ruling.\n  person_member_of_team: { forward_verb: 'member_of', reverse_verb: 'has_member', classification: 'semantic', source_type: 'person', target_type: 'team' },\n  // Cited three times in spec source since 0.17.2 and existing zero times: the\n  // team_contains_team note above, the team-nesting domain guide, and an\n  // anti_patterns entry that instructs users to model a cross-department\n  // reporting line with this edge. An anti-pattern guide is instructional by\n  // construction, so that third site was telling users to use an edge the catalog\n  // would refuse. Minting makes all three true and needs no prose edit.\n  //\n  // semantic, not hierarchy, and the temptation is real: a reporting line IS a\n  // hierarchy in ordinary English, which is exactly why classifying it that way\n  // would put `person` into containment and become the reversal the sibling edge\n  // above is shaped to avoid. The org chart is a reference structure over\n  // containment-free people. Same classification as the membership edge above, so\n  // the person / team / department triangle is decided once rather than three\n  // times.\n  person_reports_to_person: { forward_verb: 'reports_to', reverse_verb: 'has_report', classification: 'semantic', source_type: 'person', target_type: 'person' },\n  // MINTED 0.34.0 on a grammar-versus-catalog inconsistency readable entirely\n  // inside this package, NOT on the field condition the 0.33.0 bank named. That\n  // condition is still unmet and saying so is the honest framing: both org edges\n  // exist in exactly one graph and it is the saturation fixture, whose person set\n  // contains teams mistyped as people. What replaced it is stronger on its own\n  // terms because it is checkable and adoption-independent:\n  //\n  //   `role`'s lifecycle terminates at `filled` and `vacant`, and `filled` is\n  //   described \"Role is staffed.\" `team_staffed_with_role` runs team -> slot.\n  //   `person_member_of_team` runs person -> team. NOTHING connected a person to\n  //   a role. So a graph could legally mark a role `filled` and no edge in the\n  //   catalog could say by whom.\n  //\n  // A terminal lifecycle phase that no edge can substantiate is dead schema, and\n  // it is worse than a phantom edge name: a phantom is inert, while `filled` is a\n  // value graphs will actually carry. Same class as the anti-pattern entry that\n  // instructed users toward an edge the catalog refused, which is what minted\n  // `person_reports_to_person` one release ago.\n  //\n  // `semantic`, not `cross-domain`. `person`, `role` and `team` are one domain\n  // (domains.ts, team_org), and T1.7 forbids new same-domain cross-domain edges.\n  // This is the third member of that triangle and it is decided on exactly the\n  // ground the other two were decided on mid-build at 0.33.0.\n  //\n  // Direction is person -> role, matching both 0.33.0 person edges, so the\n  // containment reading stays UNAVAILABLE rather than merely unchosen and\n  // UPG_VALID_CHILDREN is untouched. `role_filled_by_person` would source the\n  // edge on the slot, which reads as the slot owning the person.\n  //\n  // Unqualified, for the reason the membership edge above gives: `role` is a type,\n  // not a string, so a qualifier here would be a second role model.\n  //\n  // Not cross_product_eligible: `person` is not portfolio_shared, so the 0.18.0\n  // both-endpoints gate rejects the flag regardless.\n  person_holds_role: { forward_verb: 'holds', reverse_verb: 'held_by', classification: 'semantic', source_type: 'person', target_type: 'role' },\n  team_staffed_with_role: { forward_verb: 'staffed_with', reverse_verb: 'staffed_in', classification: 'hierarchy', source_type: 'team', target_type: 'role' },\n  team_targets_team_okr: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'team', target_type: 'team_okr' },\n  team_reflects_in_retrospective: { forward_verb: 'reflects_in', reverse_verb: 'reflects', classification: 'hierarchy', source_type: 'team', target_type: 'retrospective' },\n  team_depends_on_dependency: { forward_verb: 'depends_on', reverse_verb: 'dependency_of', classification: 'hierarchy', source_type: 'team', target_type: 'dependency' },\n  team_skilled_in_skill: { forward_verb: 'skilled_in', reverse_verb: 'skilled_by', classification: 'hierarchy', source_type: 'team', target_type: 'skill' },\n  team_practices_ceremony: { forward_verb: 'practices', reverse_verb: 'practiced_by', classification: 'hierarchy', source_type: 'team', target_type: 'ceremony' },\n  team_planned_via_capacity_plan: { forward_verb: 'planned_via', reverse_verb: 'plans', classification: 'hierarchy', source_type: 'team', target_type: 'capacity_plan' },\n  team_decides_decision: { forward_verb: 'decides', reverse_verb: 'decided_by', classification: 'hierarchy', source_type: 'team', target_type: 'decision' },\n  decision_references_decision: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'cross-domain', source_type: 'decision', target_type: 'decision' },\n  stakeholder_maps_to_persona: { forward_verb: 'maps_to', reverse_verb: 'mapped_by', classification: 'cross-domain', source_type: 'stakeholder', target_type: 'persona' },\n  // (0.35.0) The stakeholder-map relation: who cares about which outcome.\n  // Deliberately a verb-only edge and NOT a `kind: 'scale'` property on a\n  // generic `stakeholder_relates_to_node` — UPG edges are payload-free outside\n  // the gated `carries_properties` set, and the MAGNITUDE of the stake is\n  // already `influence` / `interest` on the stakeholder itself. The reverse\n  // reading is what makes the pair right: \"outcome matters_to stakeholder\".\n  // Sits beside `persona_pursues_outcome` (the persona twin) and\n  // `product_influenced_by_stakeholder`. Retires the manifest's denormalised\n  // `stake_in` string: the subtitle renders the target outcome's title.\n  stakeholder_invested_in_outcome: { forward_verb: 'invested_in', reverse_verb: 'matters_to', classification: 'cross-domain', source_type: 'stakeholder', target_type: 'outcome' },\n  team_okr_aligns_with_objective: { forward_verb: 'aligns_with', reverse_verb: 'aligned_by', classification: 'cross-domain', source_type: 'team_okr', target_type: 'objective' },\n  team_okr_aligns_with_key_result: { forward_verb: 'aligns_with', reverse_verb: 'aligned_by', classification: 'cross-domain', source_type: 'team_okr', target_type: 'key_result' },\n  ceremony_involves_team: { forward_verb: 'involves', reverse_verb: 'involved_in', classification: 'cross-domain', source_type: 'ceremony', target_type: 'team' },\n\n  // 6.2 Program Management Domain\n  product_managed_via_program: { forward_verb: 'managed_via', reverse_verb: 'manages', classification: 'hierarchy', source_type: 'product', target_type: 'program' },\n  program_contains_project: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'program', target_type: 'project' },\n  project_targets_milestone: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'project', target_type: 'milestone' },\n  // Portfolio Phase 2 (ratified 2026-08-14): a milestone that a PRODUCT owns\n  // outright, with no program/project above it. `milestone` had exactly one\n  // inbound edge spec-wide (`project_targets_milestone`) and `project` was its\n  // only declared parent, so a portfolio-grain milestone — which names a\n  // product, not a project — was inexpressible. This is the 0.23.0 epic-twin\n  // precedent: an existing leaf type gains a second, SHALLOWER parent, and the\n  // name, verbs and classification are the deeper edge's, inherited unchanged\n  // rather than invented.\n  //\n  // The mediated path was checked and rejected, not overlooked. The relation IS\n  // reachable as product —managed_via→ program —contains→ project —targets→\n  // milestone, but at three hops (past the 1-2-hop threshold), and the hop count\n  // is not the real objection: mediation forces `program` and `project` nodes\n  // into existence that the source data does not have.\n  //\n  // NOT cross_product_eligible: a milestone belongs to the graph of the product\n  // that owns it. `UPG_VALID_CHILDREN.product` gains 'milestone' in step, which\n  // the hierarchy-orphan guard requires.\n  product_targets_milestone: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'hierarchy', source_type: 'product', target_type: 'milestone' },\n  project_produces_deliverable: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'project', target_type: 'deliverable' },\n  program_tracked_via_risk_register: { forward_verb: 'tracked_via', reverse_verb: 'tracks', classification: 'hierarchy', source_type: 'program', target_type: 'risk_register' },\n  risk_register_contains_risk: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'risk_register', target_type: 'risk' },\n  program_changed_via_change_request: { forward_verb: 'changed_via', reverse_verb: 'changes', classification: 'hierarchy', source_type: 'program', target_type: 'change_request' },\n  program_resourced_via_resource_allocation: { forward_verb: 'resourced_via', reverse_verb: 'resources', classification: 'hierarchy', source_type: 'program', target_type: 'resource_allocation' },\n  program_reported_via_status_report: { forward_verb: 'reported_via', reverse_verb: 'reports', classification: 'hierarchy', source_type: 'program', target_type: 'status_report' },\n  program_contains_epic: { forward_verb: 'contains', reverse_verb: 'contained_in', classification: 'cross-domain', source_type: 'program', target_type: 'epic' },\n  project_implements_initiative: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'project', target_type: 'initiative' },\n  // WIDENED AT 0.33.0, renamed from project_delivers_epic. The epic-only\n  // endpoint could not hold a real tracker import: a Linear dry-run carried 651\n  // project memberships as `properties.linear_project_id` and emitted zero\n  // edges, because the default issue type an adapter produces is `task` and the\n  // only project edge could not reach it. Endpoint-polymorphic over the\n  // work-item set {feature, epic, user_story, task, bug} by the same\n  // construction as planning_cycle_schedules_work_item: the `work_item` token\n  // names the intended semantic domain, the endpoint is the `node` wildcard.\n  //\n  // NOT a `contains` verb, and UPG_VALID_CHILDREN.project is deliberately\n  // untouched. `contains` is this catalog's containment verb and every edge\n  // using it is classification: 'hierarchy', which under G2b obliges a matching\n  // UPG_VALID_CHILDREN pair. That map is Record<parent, child[]> of concrete\n  // type names, so a polymorphic endpoint can never discharge the obligation\n  // its own verb would create. A work item is CONTAINED once (by its epic or\n  // feature) and REFERENCED many times; the parent axis is containment and the\n  // project axis is a reference. Giving project a second containment claim over\n  // the same task is the two-trees problem.\n  //\n  // classification moves cross-domain -> semantic with the widening: pinned to\n  // project -> epic it was a cross-domain pair, and once the endpoint is the\n  // wildcard it is a reference relation between a planning container and\n  // arbitrary work. deliberate_only because project membership is authored,\n  // never inferred from co-occurrence.\n  project_delivers_work_item: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'semantic', source_type: 'project', target_type: 'node', deliberate_only: true },\n\n  // ── project as a first-class home for work (0.41.0, Captain-ratified) ──────\n  //\n  // Teams model in Linear, where an Initiative holds Projects and a Project\n  // holds Issues; UPG must express that natively or every sync leaves a reader\n  // guessing which node is which. `project_implements_initiative` already\n  // carries the upper relation (read from the project's side). These five carry\n  // the lower one, and the set is exactly what the Linear issue-type map\n  // produces: an issue becomes a feature, bug, task, user_story or epic.\n  //\n  // WHY THESE ARE CONTAINMENT AND `project_delivers_work_item` IS NOT.\n  // 0.33.0 widened `project_delivers_epic` into the polymorphic\n  // `project_delivers_work_item` and ruled, correctly, that it could not be a\n  // `contains` verb: containment obliges a `UPG_VALID_CHILDREN` pair keyed by\n  // CONCRETE type names, which a wildcard endpoint can never supply. That\n  // argument forecloses containment for the wildcard; it does not foreclose\n  // containment for concrete pairs, which is what these are. So this is not a\n  // reversal of that ruling — it is the half the wildcard could not reach.\n  //\n  // A KNOWN SHADOW PAIR, ACCEPTED DELIBERATELY (Captain, 2026-09-04). Both an\n  // authored `project_contains_task` and a `project_delivers_work_item` can\n  // name the same pair. That duplication is real and is taken on purpose, to\n  // avoid a migration on live `project_delivers_work_item` instances. The\n  // precedence is stated so it is never ambiguous: CONTAINMENT IS THE PARENT\n  // AXIS AND WINS; the polymorphic edge stays the reference for targets outside\n  // the concrete set. If a real graph is ever observed holding both for one\n  // pair, that is the signal to retire the polymorphic edge for these five\n  // types and migrate — the option deliberately not taken here.\n  project_contains_epic: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'project', target_type: 'epic' },\n  project_contains_feature: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'project', target_type: 'feature' },\n  project_contains_user_story: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'project', target_type: 'user_story' },\n  project_contains_task: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'project', target_type: 'task' },\n  project_contains_bug: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'project', target_type: 'bug' },\n\n  // ── project's strategic reach (0.41.0) ────────────────────────────────────\n  //\n  // The parity half. `initiative` and `project` are two granularities of the\n  // same idea, and teams pick one: Linear-shaped teams put the dated, owned,\n  // key-result-linked bet in a PROJECT, while the standard's `initiative`\n  // carried all the strategic reach and `project` reached milestone,\n  // deliverable and a wildcard. A team choosing the honest name for its\n  // granularity should not lose its connection to strategy.\n  //\n  // Mirrors of initiative's edges on the FORWARD verbs, so a reader moving\n  // between the two granularities is never re-learning the vocabulary. The\n  // mirror is deliberately not total, and the two places it stops are both\n  // correct rather than sloppy:\n  //\n  //   REVERSE VERBS. `strategic_theme_pursues_initiative` reverses to\n  //   `pursued_under`, which reads as membership in a theme's programme.\n  //   `strategic_theme_pursues_project` reverses to `pursued_by`, because a\n  //   project is the vehicle doing the pursuing, not a subdivision of the\n  //   theme. Same forward verb, different relationship on the way back.\n  //\n  //   CLASSIFICATION. Initiative's five are causal / cross-domain / hierarchy\n  //   / semantic; all five of these are `cross-domain`. That is domain\n  //   arithmetic, not inconsistency: `initiative` sits in `strategy` alongside\n  //   its targets, so a `cross-domain` classification there would be T1.7\n  //   same-domain debt, while `project` is `program_mgmt` and every target\n  //   here is `strategy`, so `cross-domain` is the measured truth and adds\n  //   nothing to that debt.\n  //\n  // CROSS-PRODUCT SCOPE, ruled deliberately (2026-09-04, raised by Troi during\n  // the 0.41.0 editorial pass). Three of initiative's carry\n  // `cross_product_eligible: true` and none of these do, which looks at first\n  // like reinstating at the portfolio seam the reach this change removes\n  // elsewhere. It is not: `key_result`, `outcome` and `strategic_theme` are\n  // all `portfolio_shared`, so these edges already resolve `provisional` and\n  // ARE authorable across graphs today, with a warning, not rejected. The\n  // difference is curated (hard-allow, silent) versus provisional (allowed,\n  // warned). Left provisional on purpose: the curated set is a ratified\n  // snapshot that grows on measured need, and no field evidence yet shows\n  // anyone authoring these across graphs. Promote to curated when it appears,\n  // which is a one-flag change per edge.\n  //\n  // Deliberately NOT mirrored: `initiative_enters_market_segment`,\n  // `_realises_value_proposition`, `_unlocks_revenue_stream` and\n  // `_raises_strategic_question`. A delivery-scoped project does not enter a\n  // market or unlock a revenue stream; that reach belongs to the coarser level,\n  // and copying it down would make the two types synonyms rather than\n  // granularities. `capability` needs no edge either: a project reaches it\n  // through the features it now contains (`capability_implemented_by_feature`),\n  // and `decision` already reaches a project through the polymorphic\n  // `decision_influences_node`.\n  project_advances_key_result: { forward_verb: 'advances', reverse_verb: 'advanced_by', classification: 'cross-domain', source_type: 'project', target_type: 'key_result' },\n  project_drives_outcome: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'project', target_type: 'outcome' },\n  project_assumes_assumption: { forward_verb: 'assumes', reverse_verb: 'assumed_by', classification: 'cross-domain', source_type: 'project', target_type: 'assumption' },\n  constraint_constrains_project: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'cross-domain', source_type: 'constraint', target_type: 'project' },\n  strategic_theme_pursues_project: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'cross-domain', source_type: 'strategic_theme', target_type: 'project' },\n  milestone_gates_release: { forward_verb: 'gates', reverse_verb: 'gated_by', classification: 'cross-domain', source_type: 'milestone', target_type: 'release' },\n  milestone_triggers_release: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'cross-domain', source_type: 'milestone', target_type: 'release' },\n  deliverable_ships_feature: { forward_verb: 'ships', reverse_verb: 'shipped_by', classification: 'cross-domain', source_type: 'deliverable', target_type: 'feature' },\n\n  // 6.3 Compliance Domain\n  product_constrained_by_compliance_requirement: { forward_verb: 'constrained_by', reverse_verb: 'constrains', classification: 'hierarchy', source_type: 'product', target_type: 'compliance_requirement' },\n  product_exposed_to_risk: { forward_verb: 'exposed_to', reverse_verb: 'exposes', classification: 'hierarchy', source_type: 'product', target_type: 'risk' },\n  product_bound_by_data_contract: { forward_verb: 'bound_by', reverse_verb: 'binds', classification: 'hierarchy', source_type: 'product', target_type: 'data_contract' },\n  product_audited_via_audit_log_policy: { forward_verb: 'audited_via', reverse_verb: 'audits', classification: 'hierarchy', source_type: 'product', target_type: 'audit_log_policy' },\n  product_governed_by_compliance_framework: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'hierarchy', source_type: 'product', target_type: 'compliance_framework' },\n  compliance_framework_mandates_compliance_requirement: { forward_verb: 'mandates', reverse_verb: 'mandated_by', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'compliance_requirement' },\n  compliance_framework_verified_by_security_audit: { forward_verb: 'verified_by', reverse_verb: 'verifies', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'security_audit' },\n  compliance_framework_requires_privacy_policy: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'privacy_policy' },\n  compliance_framework_requires_audit_log_policy: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'audit_log_policy' },\n  compliance_framework_identifies_risk: { forward_verb: 'identifies', reverse_verb: 'identified_by', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'risk' },\n  compliance_framework_governs_data_contract: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'data_contract' },\n  compliance_framework_applies_to_legal_entity: { forward_verb: 'applies_to', reverse_verb: 'subject_to', classification: 'hierarchy', source_type: 'compliance_framework', target_type: 'legal_entity' },\n  compliance_requirement_constrains_feature: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'cross-domain', source_type: 'compliance_requirement', target_type: 'feature' },\n  compliance_requirement_constrains_decision: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'cross-domain', source_type: 'compliance_requirement', target_type: 'decision' },\n  risk_manifests_as_technical_debt_item: { forward_verb: 'manifests_as', reverse_verb: 'manifested_by', classification: 'cross-domain', source_type: 'risk', target_type: 'technical_debt_item' },\n  // ── Risk exposure (0.35.0) ──────────────────────────────────────────────────\n  // Typed source, wildcard target: the 16th registered polymorphic family, and\n  // structurally the \"decision-to-anything\" construction with `risk` in the\n  // source slot. Both are `cross-domain`, so neither enters UPG_VALID_CHILDREN\n  // and neither can be walked as containment.\n  //\n  // Why wildcard rather than typed-per-target: what a risk puts at stake is\n  // genuinely unbounded (outcome, key_result, release, service, contract,\n  // launch, metric, feature), and so is what mitigates it (decision, feature,\n  // experiment, security_control, compliance_requirement). Enumerating either\n  // side balloons the catalogue across two open sets while the endpoint carries\n  // no structural role — the exact condition ARCHITECTURE.md admits polymorphism\n  // for. The typed `security_control_mitigates_threat` stays as the\n  // security-domain edge; `risk_mitigated_by_node` is the product generalisation.\n  //\n  // These two replace three manifest fields that were properties pretending to\n  // be relations: `scope_entities` (an entity-reference list) is\n  // risk_threatens_node, and `mitigation_actions` (a top-list of action\n  // strings) is risk_mitigated_by_node. The prose `mitigation?: string` stays.\n  risk_threatens_node: { forward_verb: 'threatens', reverse_verb: 'threatened_by', classification: 'cross-domain', source_type: 'risk', target_type: 'node' },\n  risk_mitigated_by_node: { forward_verb: 'mitigated_by', reverse_verb: 'mitigates', classification: 'cross-domain', source_type: 'risk', target_type: 'node' },\n  data_contract_governs_data_source: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'cross-domain', source_type: 'data_contract', target_type: 'data_source' },\n  compliance_framework_requires_security_control: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'cross-domain', source_type: 'compliance_framework', target_type: 'security_control' },\n  security_audit_validates_compliance_framework: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'security_audit', target_type: 'compliance_framework' },\n\n  // 6.4 Localisation & i18n Domain\n  product_localised_in_locale: { forward_verb: 'localised_in', reverse_verb: 'localises', classification: 'hierarchy', source_type: 'product', target_type: 'locale' },\n  product_configured_via_locale_config: { forward_verb: 'configured_via', reverse_verb: 'configures', classification: 'hierarchy', source_type: 'product', target_type: 'locale_config' },\n  locale_translated_via_translation_bundle: { forward_verb: 'translated_via', reverse_verb: 'translates', classification: 'hierarchy', source_type: 'locale', target_type: 'translation_bundle' },\n  locale_adapted_via_cultural_adaptation: { forward_verb: 'adapted_via', reverse_verb: 'adapts', classification: 'hierarchy', source_type: 'locale', target_type: 'cultural_adaptation' },\n  locale_priced_in_regional_pricing: { forward_verb: 'priced_in', reverse_verb: 'prices_for', classification: 'hierarchy', source_type: 'locale', target_type: 'regional_pricing' },\n  locale_configured_via_locale_config: { forward_verb: 'configured_via', reverse_verb: 'configures', classification: 'hierarchy', source_type: 'locale', target_type: 'locale_config' },\n  translation_bundle_contains_translation_key: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'translation_bundle', target_type: 'translation_key' },\n  screen_translated_via_translation_bundle: { forward_verb: 'translated_via', reverse_verb: 'translates', classification: 'cross-domain', source_type: 'screen', target_type: 'translation_bundle' },\n  cultural_adaptation_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'cultural_adaptation', target_type: 'persona' },\n\n  // 6.5 Partner & Ecosystem Management Domain\n  product_partnered_via_partner_program: { forward_verb: 'partnered_via', reverse_verb: 'partners', classification: 'hierarchy', source_type: 'product', target_type: 'partner_program' },\n  partner_program_tiers_as_partner_tier: { forward_verb: 'tiers_as', reverse_verb: 'tiered_by', classification: 'hierarchy', source_type: 'partner_program', target_type: 'partner_tier' },\n  product_exposed_via_api_ecosystem: { forward_verb: 'exposed_via', reverse_verb: 'exposes', classification: 'hierarchy', source_type: 'product', target_type: 'api_ecosystem' },\n  api_ecosystem_lists_marketplace_listing: { forward_verb: 'lists', reverse_verb: 'listed_in', classification: 'hierarchy', source_type: 'api_ecosystem', target_type: 'marketplace_listing' },\n  product_documented_via_developer_portal: { forward_verb: 'documented_via', reverse_verb: 'documents', classification: 'hierarchy', source_type: 'product', target_type: 'developer_portal' },\n  partner_program_includes_integration_partner: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'hierarchy', source_type: 'partner_program', target_type: 'integration_partner' },\n  partner_program_shares_revenue_via_partner_revenue_share: { forward_verb: 'shares_revenue_via', reverse_verb: 'shares', classification: 'hierarchy', source_type: 'partner_program', target_type: 'partner_revenue_share' },\n  partner_program_exposes_api_ecosystem: { forward_verb: 'exposes', reverse_verb: 'exposed_by', classification: 'hierarchy', source_type: 'partner_program', target_type: 'api_ecosystem' },\n  partner_program_documents_developer_portal: { forward_verb: 'documents', reverse_verb: 'documented_by', classification: 'hierarchy', source_type: 'partner_program', target_type: 'developer_portal' },\n  api_ecosystem_exposes_api_endpoint: { forward_verb: 'exposes', reverse_verb: 'exposed_through_ecosystem', classification: 'cross-domain', source_type: 'api_ecosystem', target_type: 'api_endpoint' },\n  marketplace_listing_extends_feature: { forward_verb: 'extends', reverse_verb: 'extended_by_listing', classification: 'cross-domain', source_type: 'marketplace_listing', target_type: 'feature' },\n  integration_partner_connects_external_api: { forward_verb: 'connects', reverse_verb: 'connected_by_partner', classification: 'cross-domain', source_type: 'integration_partner', target_type: 'external_api' },\n  developer_portal_documents_api_contract: { forward_verb: 'documents', reverse_verb: 'documented_in_portal', classification: 'cross-domain', source_type: 'developer_portal', target_type: 'api_contract' },\n  partner_tier_qualifies_integration_partner: { forward_verb: 'qualifies', reverse_verb: 'qualified_by_tier', classification: 'cross-domain', source_type: 'partner_tier', target_type: 'integration_partner' },\n  partner_revenue_share_governs_partner_tier: { forward_verb: 'governs', reverse_verb: 'governed_by_rev_share', classification: 'cross-domain', source_type: 'partner_revenue_share', target_type: 'partner_tier' },\n  marketplace_listing_references_help_video: { forward_verb: 'references', reverse_verb: 'referenced_by_listing', classification: 'cross-domain', source_type: 'marketplace_listing', target_type: 'help_video' },\n\n  // ── Part 7: Data & Analytics Domain ───────────────────────────────────────\n\n  product_ingests_from_data_source: { forward_verb: 'ingests_from', reverse_verb: 'ingested_by', classification: 'hierarchy', source_type: 'product', target_type: 'data_source' },\n  product_tracks_via_event_schema: { forward_verb: 'tracks_via', reverse_verb: 'tracks', classification: 'hierarchy', source_type: 'product', target_type: 'event_schema' },\n  product_visualised_in_dashboard: { forward_verb: 'visualised_in', reverse_verb: 'visualises', classification: 'hierarchy', source_type: 'product', target_type: 'dashboard' },\n  product_organised_into_data_domain: { forward_verb: 'organised_into', reverse_verb: 'organises', classification: 'hierarchy', source_type: 'product', target_type: 'data_domain' },\n  product_defined_by_glossary_term: { forward_verb: 'defined_by', reverse_verb: 'defines', classification: 'hierarchy', source_type: 'product', target_type: 'glossary_term' },\n  data_source_defines_metric: { forward_verb: 'defines', reverse_verb: 'defined_by', classification: 'hierarchy', source_type: 'data_source', target_type: 'metric' },\n  data_source_processed_via_data_pipeline: { forward_verb: 'processed_via', reverse_verb: 'processes', classification: 'hierarchy', source_type: 'data_source', target_type: 'data_pipeline' },\n  data_source_traced_via_data_lineage: { forward_verb: 'traced_via', reverse_verb: 'traces', classification: 'hierarchy', source_type: 'data_source', target_type: 'data_lineage' },\n  data_source_emits_event_schema: { forward_verb: 'emits', reverse_verb: 'emitted_by', classification: 'hierarchy', source_type: 'data_source', target_type: 'event_schema' },\n  metric_validated_by_data_quality_rule: { forward_verb: 'validated_by', reverse_verb: 'validates', classification: 'hierarchy', source_type: 'metric', target_type: 'data_quality_rule' },\n  data_domain_produces_data_product: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'hierarchy', source_type: 'data_domain', target_type: 'data_product' },\n  data_domain_contains_data_source: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'data_domain', target_type: 'data_source' },\n  data_domain_defines_glossary_term: { forward_verb: 'defines', reverse_verb: 'defined_in', classification: 'hierarchy', source_type: 'data_domain', target_type: 'glossary_term' },\n  data_domain_modelled_in_data_model: { forward_verb: 'modelled_in', reverse_verb: 'models', classification: 'hierarchy', source_type: 'data_domain', target_type: 'data_model' },\n  data_domain_visualised_in_dashboard: { forward_verb: 'visualised_in', reverse_verb: 'visualises', classification: 'hierarchy', source_type: 'data_domain', target_type: 'dashboard' },\n  dashboard_contains_report: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'dashboard', target_type: 'report' },\n  dashboard_contains_experiment_run: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'dashboard', target_type: 'experiment_run' },\n  metric_measures_metric: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'metric', target_type: 'metric' },\n  // (UPG-677) metric_measures_metric_cross_domain retired — byte-identical\n  // shadow of metric_measures_metric (the clean key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  // `experiment_tests_hypothesis` dropped, superseded by\n  // the canonical `experiment_run_validates_hypothesis` (causal) introduced\n  // in v0.2.6. Authors expressing \"this experiment tests this hypothesis\"\n  // should use the validates edge from the run side.\n  // `experiment_tests_experiment` was a near-duplicate of\n  // `experiment_tested_via_experiment` and is consolidated into the single\n  // canonical `experiment_run_tested_via_experiment_run` edge above.\n  event_schema_tracks_funnel_step: { forward_verb: 'tracks', reverse_verb: 'tracked_by', classification: 'cross-domain', source_type: 'event_schema', target_type: 'funnel_step' },\n  dashboard_tracks_metric: { forward_verb: 'tracks', reverse_verb: 'tracked_by', classification: 'cross-domain', source_type: 'dashboard', target_type: 'metric' },\n  data_product_serves_dashboard: { forward_verb: 'serves', reverse_verb: 'served_by', classification: 'cross-domain', source_type: 'data_product', target_type: 'dashboard' },\n  data_pipeline_feeds_data_product: { forward_verb: 'feeds', reverse_verb: 'fed_by', classification: 'cross-domain', source_type: 'data_pipeline', target_type: 'data_product' },\n\n  // ── Part 8: Portfolio & Workspace (Nucleus) ────────────────────────────────\n\n  // 8.1 Portfolio Hierarchy\n  organization_invests_via_portfolio: { forward_verb: 'invests_via', reverse_verb: 'invested_in_by', classification: 'hierarchy', source_type: 'organization', target_type: 'portfolio' },\n  organization_organised_into_product_area: { forward_verb: 'organised_into', reverse_verb: 'organised_by', classification: 'hierarchy', source_type: 'organization', target_type: 'product_area' },\n  portfolio_contains_product: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'portfolio', target_type: 'product' },\n  product_area_contains_product: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product_area', target_type: 'product' },\n  portfolio_contains_portfolio: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'portfolio', target_type: 'portfolio' },\n  product_area_contains_product_area: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product_area', target_type: 'product_area' },\n  // decision B: product_area groups features (the natural \"Studio area owns 6 features\" mental model)\n  product_area_contains_feature: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'product_area', target_type: 'feature' },\n  // (UPG-677) product_categorised_in_product_area retired — inverse of\n  // product_area_contains_product (the kept containment direction:\n  // product_area → product, matching the UPG parent→child convention). FLAG:\n  // the inverse \"product categorised in area\" read is preserved by the kept\n  // edge's reverse_verb (belongs_to). See UPG_EDGE_MIGRATIONS['0.9.9'].\n\n  // 8.2 Cross-Product Edges\n  // direct product-level shorthand edges for market-intelligence shapes.\n  // These are shortcuts: canonical deep paths go via competitive_analysis and gtm_strategy.\n  // Use these edges when the intermediate anchor node hasn't been authored yet.\n  product_has_competitor: { forward_verb: 'has', reverse_verb: 'is_competitor_of', classification: 'cross-domain', source_type: 'product', target_type: 'competitor' },\n  product_addresses_market_segment: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'product', target_type: 'market_segment' },\n  product_has_positioning: { forward_verb: 'has', reverse_verb: 'is_positioning_for', classification: 'cross-domain', source_type: 'product', target_type: 'positioning' },\n  product_has_feature_request: { forward_verb: 'has', reverse_verb: 'is_request_for', classification: 'cross-domain', source_type: 'product', target_type: 'feature_request' },\n  product_shares_persona_with_product: { forward_verb: 'shares_persona_with', reverse_verb: 'shares_persona_with', classification: 'semantic', source_type: 'product', target_type: 'product' },\n  product_shares_competitor_with_product: { forward_verb: 'shares_competitor_with', reverse_verb: 'shares_competitor_with', classification: 'semantic', source_type: 'product', target_type: 'product' },\n  product_shares_metric_with_product: { forward_verb: 'shares_metric_with', reverse_verb: 'shares_metric_with', classification: 'semantic', source_type: 'product', target_type: 'product' },\n  product_depends_on_product: { forward_verb: 'depends_on', reverse_verb: 'dependency_of', classification: 'semantic', source_type: 'product', target_type: 'product' },\n  product_cannibalises_product: { forward_verb: 'cannibalises', reverse_verb: 'cannibalised_by', classification: 'causal', source_type: 'product', target_type: 'product' },\n  product_succeeds_product: { forward_verb: 'succeeds', reverse_verb: 'succeeded_by', classification: 'causal', source_type: 'product', target_type: 'product' },\n\n  // 8.3 Workspace Edges\n  // Altitude anchors (WS3, 2026-07-05): a workspace scopes to exactly one of\n  // three legal altitudes — organization / product_area (\"plane\") / product —\n  // each a typed hierarchy edge, not a polymorphic `_node` wildcard. Per the\n  // enum-vs-polymorphism ADR (2026-06-16), this family fails universality\n  // (the anchor set is a closed altitude ladder, not \"any entity\") and is\n  // structural (it must resolve through `resolveContainmentEdge`/`get_tree`),\n  // so it stays enumerated — the same shape `feature`'s five typed parent\n  // edges already use. Same verb pair across all three altitudes. Neither new\n  // edge is cross_product_eligible: an org/plane-altitude workspace lives in\n  // the same portfolio-level `.upg` as its anchor, same as sibling containment\n  // edges (organization_organised_into_product_area, portfolio_contains_product).\n  organization_thinks_in_workspace: { forward_verb: 'thinks_in', reverse_verb: 'thinks_for', classification: 'hierarchy', source_type: 'organization', target_type: 'workspace' },\n  product_area_thinks_in_workspace: { forward_verb: 'thinks_in', reverse_verb: 'thinks_for', classification: 'hierarchy', source_type: 'product_area', target_type: 'workspace' },\n  product_thinks_in_workspace: { forward_verb: 'thinks_in', reverse_verb: 'thinks_for', classification: 'hierarchy', source_type: 'product', target_type: 'workspace' },\n  // Commit provenance (WS3, 2026-07-05): widened from the single-target\n  // `workspace_produced_decision` to the `node` wildcard — a workspace's\n  // commit loop can legitimately produce any entity type arranged in it\n  // (decision, feature, persona, ...), so per the same ADR test this family\n  // is universal + non-structural (provenance metadata, not the produced\n  // node's real containment edge) and collapses polymorphic, mirroring\n  // `decision_produces_node`. See UPG_EDGE_MIGRATIONS for the rename rule.\n  // Edge-provenance (which workspace produced a committed *edge*, not just a\n  // node) has no schema mechanism yet — deliberately deferred, see the WS3\n  // proposal doc, ripple map \"surprises\" #3.\n  workspace_produced_node: { forward_verb: 'produced', reverse_verb: 'produced_in', classification: 'causal', source_type: 'workspace', target_type: 'node' },\n  // Canvas arrangement: which entities are ON a workspace, and where. This is\n  // the edge `WorkspaceProperties`' docstring promised for months without the\n  // catalog having it; the promise is now true.\n  //\n  // Polymorphic per the enum-vs-polymorphism ADR (2026-06-16), on all three\n  // arms: universality holds (any entity can be dragged onto a canvas, with no\n  // principled stopping point), constraint value is nil (nobody could defend\n  // \"you may arrange features but not personas\"), and there is NO STRUCTURAL\n  // ROLE. That third arm is load-bearing rather than decorative.\n  // `classification: 'cross-domain'` is therefore mandatory, not cosmetic: it\n  // keeps the edge out of `UPG_VALID_CHILDREN` and `resolveContainmentEdge`, so\n  // `get_tree` never walks it and a canvas placement can never masquerade as\n  // containment. An arranged node keeps its real containment parent. Same\n  // posture as `framework_exercise_includes_node`.\n  //\n  // The alternative was putting the whole canvas snapshot in one opaque node\n  // property, which is cheaper and loses. A node id inside a blob is a foreign\n  // key held as a scalar (the exact thing P14 forbids), the placed entities\n  // become invisible to `get_node` and `query`, and a deleted node leaves a\n  // stale reference that `repair_dangling_edges` cannot see. As an edge, that\n  // guard is inherited for free. Only the furniture with no graph referent\n  // stays opaque, in `workspace.properties.canvas`.\n  //\n  // NOT cross_product_eligible: deliberate scope limit mirroring the WS3\n  // anchors, not an oversight.\n  workspace_arranges_node: { forward_verb: 'arranges', reverse_verb: 'arranged_in', classification: 'cross-domain', source_type: 'workspace', target_type: 'node', carries_properties: true, property_schema: WORKSPACE_ARRANGEMENT_EDGE_PROPERTY_SCHEMA },\n  // What a published composition SHOWS. Passes the same three-arm ADR test the\n  // same way, and carries no properties: a focus is a bare reference.\n  //\n  // It earns its place by making a composition legible to a tool that cannot\n  // parse the publishing tool's URLs. \"Which published views show this\n  // persona?\" is a LEARN question the graph exists to answer, and the edge is\n  // what makes a composition's graph references repairable when a focused node\n  // is deleted. Adding it in a later release would be a second blast-radius\n  // event on the same track.\n  //\n  // POPULATION IS BEST-EFFORT and an empty focus set is VALID: a composition\n  // whose member hrefs the writing tool cannot resolve to node ids is still a\n  // well-formed composition. That keeps the spec complete without blocking on\n  // app work, and it is why no check fires on an unfocused composition.\n  //\n  // NOT cross_product_eligible: a portfolio-level composition spanning several\n  // product graphs is conceivable but unevidenced. Same YAGNI call as above.\n  composition_focuses_node: { forward_verb: 'focuses', reverse_verb: 'focused_in', classification: 'cross-domain', source_type: 'composition', target_type: 'node' },\n  // What a capture is a picture OF (0.32.0). Polymorphic because anything in the\n  // graph can be rendered — a surface, a screen, a report, a canvas — and being\n  // captured carries no structural role, so the endpoint collapses to the\n  // wildcard rather than enumerating a list that would never finish.\n  //\n  // This edge is also where the preservation-is-not-permission rule lands for\n  // renditions: a consumer renders the captures the GRAPH says exist, never the\n  // ones some tool's opaque bag still remembers. A capture that was deleted is a\n  // node that was deleted, and the spec needs no second deletion vocabulary.\n  capture_renders_node: { forward_verb: 'renders', reverse_verb: 'rendered_by', classification: 'cross-domain', source_type: 'capture', target_type: 'node' },\n\n  // ── P14 edges (replacing foreign-key properties) ─────────────────────────\n  feature_addresses_job: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'feature', target_type: 'job' },\n  feature_drives_key_result: { forward_verb: 'drives', reverse_verb: 'driven_by', classification: 'cross-domain', source_type: 'feature', target_type: 'key_result' },\n  quote_relates_to_job: { forward_verb: 'relates_to', reverse_verb: 'evidenced_by_quote', classification: 'cross-domain', source_type: 'quote', target_type: 'job' },\n  // changelog is a historical record; features it references are\n  // owned by feature_area / theme / product. Relationship is semantic.\n  changelog_includes_feature: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'semantic', source_type: 'changelog', target_type: 'feature' },\n  ai_trace_spawns_ai_trace: { forward_verb: 'spawns', reverse_verb: 'spawned_by', classification: 'hierarchy', source_type: 'ai_trace', target_type: 'ai_trace' },\n\n  // ── P14 conformance edges (0.12.0) — promote orphan entity-reference scalars ──\n  // Each replaces a string property that named a first-class entity. The matching\n  // `UPGScalarToEdgeMigration['0.12.0']` rule losslessly mints/links + drops the\n  // scalar. See the P14 string-reference sweep.\n  business_model_guided_by_metric: { forward_verb: 'guided_by', reverse_verb: 'guides', classification: 'cross-domain', source_type: 'business_model', target_type: 'metric' },\n  vision_anchored_by_metric: { forward_verb: 'anchored_by', reverse_verb: 'anchors', classification: 'cross-domain', source_type: 'vision', target_type: 'metric' },\n  metric_fed_by_data_source: { forward_verb: 'fed_by', reverse_verb: 'feeds', classification: 'cross-domain', source_type: 'metric', target_type: 'data_source' },\n  hallucination_report_has_root_cause: { forward_verb: 'has_root_cause', reverse_verb: 'root_cause_of', classification: 'causal', source_type: 'hallucination_report', target_type: 'root_cause' },\n  model_comparison_compares_ai_model: { forward_verb: 'compares', reverse_verb: 'compared_in', classification: 'semantic', source_type: 'model_comparison', target_type: 'ai_model' },\n  launch_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'cross-domain', source_type: 'launch', target_type: 'metric' },\n  wireframe_depicts_screen: { forward_verb: 'depicts', reverse_verb: 'depicted_by', classification: 'semantic', source_type: 'wireframe', target_type: 'screen' },\n  service_level_indicator_measures_metric: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'service_level_indicator', target_type: 'metric' },\n  agent_definition_uses_ai_model: { forward_verb: 'uses', reverse_verb: 'used_by', classification: 'semantic', source_type: 'agent_definition', target_type: 'ai_model' },\n  privacy_policy_governs_compliance_requirement: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'semantic', source_type: 'privacy_policy', target_type: 'compliance_requirement' },\n  a11y_annotation_targets_design_component: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'a11y_annotation', target_type: 'design_component' },\n  metric_quality_assessment_considers_proxy_metric: { forward_verb: 'considers_proxy', reverse_verb: 'proxy_for', classification: 'semantic', source_type: 'metric_quality_assessment', target_type: 'metric' },\n  ai_experiment_based_on_ai_model: { forward_verb: 'based_on', reverse_verb: 'basis_for', classification: 'semantic', source_type: 'ai_experiment', target_type: 'ai_model' },\n  rebuttal_supported_by_evidence: { forward_verb: 'supported_by', reverse_verb: 'supports', classification: 'cross-domain', source_type: 'rebuttal', target_type: 'evidence' },\n  bug_observed_in_release: { forward_verb: 'observed_in', reverse_verb: 'exhibits', classification: 'semantic', source_type: 'bug', target_type: 'release' },\n  vulnerability_affects_library_dependency: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'vulnerability', target_type: 'library_dependency' },\n  a11y_issue_found_in_screen: { forward_verb: 'found_in', reverse_verb: 'site_of', classification: 'cross-domain', source_type: 'a11y_issue', target_type: 'screen' },\n  team_okr_cascades_from_team_okr: { forward_verb: 'cascades_from', reverse_verb: 'cascades_to', classification: 'semantic', source_type: 'team_okr', target_type: 'team_okr' },\n  agent_session_invoked_agent_skill: { forward_verb: 'invoked', reverse_verb: 'invoked_by', classification: 'semantic', source_type: 'agent_session', target_type: 'agent_skill' },\n  agent_task_uses_agent_skill: { forward_verb: 'uses', reverse_verb: 'used_by', classification: 'semantic', source_type: 'agent_task', target_type: 'agent_skill' },\n  participant_belongs_to_behavioral_segment: { forward_verb: 'belongs_to', reverse_verb: 'includes', classification: 'cross-domain', source_type: 'participant', target_type: 'behavioral_segment' },\n  classification_axis_owned_by_product: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'classification_axis', target_type: 'product' },\n\n  // ── Part 9: Cross-Layer Influence Edges ────────────────────────────────────\n\n  product_expressed_as_design_component: { forward_verb: 'expressed_as', reverse_verb: 'expresses', classification: 'cross-domain', source_type: 'product', target_type: 'design_component' },\n  product_manifests_in_design_component: { forward_verb: 'manifests_in', reverse_verb: 'manifested_by', classification: 'cross-domain', source_type: 'product', target_type: 'design_component' },\n  product_enables_flow_user_flow: { forward_verb: 'enables_flow', reverse_verb: 'flow_enabled_by', classification: 'cross-domain', source_type: 'product', target_type: 'user_flow' },\n  design_component_surfaces_insight_insight: { forward_verb: 'surfaces_insight', reverse_verb: 'insight_surfaced_by', classification: 'cross-domain', source_type: 'design_component', target_type: 'insight' },\n  design_component_specifies_for_service: { forward_verb: 'specifies_for', reverse_verb: 'specified_by', classification: 'cross-domain', source_type: 'design_component', target_type: 'service' },\n  design_token_tokenised_as_service: { forward_verb: 'tokenised_as', reverse_verb: 'tokenises', classification: 'cross-domain', source_type: 'design_token', target_type: 'service' },\n  design_component_requires_data_from_service: { forward_verb: 'requires_data_from', reverse_verb: 'provides_data_to', classification: 'cross-domain', source_type: 'design_component', target_type: 'service' },\n  service_implements_design_component: { forward_verb: 'implements', reverse_verb: 'implemented_by', classification: 'cross-domain', source_type: 'service', target_type: 'design_component' },\n  service_constrains_interaction_design_component: { forward_verb: 'constrains_interaction', reverse_verb: 'interaction_constrained_by', classification: 'cross-domain', source_type: 'service', target_type: 'design_component' },\n  service_enables_pattern_design_component: { forward_verb: 'enables_pattern', reverse_verb: 'pattern_enabled_by', classification: 'cross-domain', source_type: 'service', target_type: 'design_component' },\n  service_constrains_scope_product: { forward_verb: 'constrains_scope', reverse_verb: 'scope_constrained_by', classification: 'cross-domain', source_type: 'service', target_type: 'product' },\n  node_informs_node: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'semantic', source_type: 'node', target_type: 'node' },\n  node_constrains_node: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'semantic', source_type: 'node', target_type: 'node' },\n  node_inspires_node: { forward_verb: 'inspires', reverse_verb: 'inspired_by', classification: 'semantic', source_type: 'node', target_type: 'node' },\n  // Decision-Specific Edges\n  decision_influences_node: { forward_verb: 'influences', reverse_verb: 'influenced_by', classification: 'semantic', source_type: 'decision', target_type: 'node' },\n  decision_constrained_by_node: { forward_verb: 'constrained_by', reverse_verb: 'constrains', classification: 'semantic', source_type: 'decision', target_type: 'node' },\n  decision_superseded_by_decision: { forward_verb: 'superseded_by', reverse_verb: 'supersedes', classification: 'causal', source_type: 'decision', target_type: 'decision' },\n  decision_produces_node: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'causal', source_type: 'decision', target_type: 'node' },\n  // Design-Decision Cross-Domain Edges\n  decision_affects_design_component: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'decision', target_type: 'design_component' },\n  decision_affects_screen: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'decision', target_type: 'screen' },\n  decision_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'decision', target_type: 'decision' },\n  // Constraint edges: typed source = a `constraint` entity. The\n  // pre-existing polymorphic `node_constrains_node` (line above) stays for\n  // arbitrary constrain-relationships between any entities; these typed\n  // edges are what authors and renderers reach for when the source is a\n  // named Constraint node.\n  constraint_constrains_feature: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'cross-domain', source_type: 'constraint', target_type: 'feature' },\n  constraint_constrains_initiative: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'semantic', source_type: 'constraint', target_type: 'initiative' },\n  constraint_constrains_metric: { forward_verb: 'constrains', reverse_verb: 'constrained_by', classification: 'semantic', source_type: 'constraint', target_type: 'metric' },\n  constraint_owned_by_team: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'constraint', target_type: 'team' },\n\n  // ── Part 10: Research-to-User Cross-Domain Bridges ─────────────────────────\n\n  insight_validates_need: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'insight', target_type: 'need' },\n  insight_reveals_desired_outcome: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'insight', target_type: 'desired_outcome' },\n  insight_informs_job: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'insight', target_type: 'job' },\n  insight_characterises_persona: { forward_verb: 'characterises', reverse_verb: 'characterised_by', classification: 'cross-domain', source_type: 'insight', target_type: 'persona' },\n  // (UPG-677) insight_validates_need_cross_domain retired — byte-identical\n  // shadow of insight_validates_need (the clean key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  observation_reveals_need: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'observation', target_type: 'need' },\n  observation_characterises_persona: { forward_verb: 'characterises', reverse_verb: 'characterised_by', classification: 'cross-domain', source_type: 'observation', target_type: 'persona' },\n  quote_evidences_need: { forward_verb: 'evidences', reverse_verb: 'evidenced_by', classification: 'cross-domain', source_type: 'quote', target_type: 'need' },\n  quote_evidences_job: { forward_verb: 'evidences', reverse_verb: 'evidenced_by', classification: 'cross-domain', source_type: 'quote', target_type: 'job' },\n  insight_enriches_persona: { forward_verb: 'enriches', reverse_verb: 'enriched_by', classification: 'cross-domain', source_type: 'insight', target_type: 'persona' },\n  insight_validates_value_proposition: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'insight', target_type: 'value_proposition' },\n  insight_validates_strategic_pillar: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'insight', target_type: 'strategic_pillar' },\n  insight_surfaces_opportunity: { forward_verb: 'surfaces', reverse_verb: 'surfaced_by', classification: 'cross-domain', source_type: 'insight', target_type: 'opportunity' },\n  insight_informs_solution: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'insight', target_type: 'solution' },\n  insight_inspires_design_question: { forward_verb: 'inspires', reverse_verb: 'inspired_by', classification: 'cross-domain', source_type: 'insight', target_type: 'design_question' },\n  insight_inspires_design_concept: { forward_verb: 'inspires', reverse_verb: 'inspired_by', classification: 'cross-domain', source_type: 'insight', target_type: 'design_concept' },\n  observation_yields_insight: { forward_verb: 'yields', reverse_verb: 'yielded_by', classification: 'cross-domain', source_type: 'observation', target_type: 'insight' },\n  insight_refines_into_insight: { forward_verb: 'refines_into', reverse_verb: 'refined_from', classification: 'hierarchy', source_type: 'insight', target_type: 'insight' },\n  // (UPG-677) insight_informs_opportunity_cross_domain retired — byte-identical\n  // shadow of insight_informs_opportunity (the clean key). See\n  // UPG_EDGE_MIGRATIONS['0.9.9'].\n  insight_validates_persona: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'insight', target_type: 'persona' },\n  // Validation-to-Discovery Feedback Loops\n  learning_validates_opportunity: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'learning', target_type: 'opportunity' },\n  learning_validates_solution: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'learning', target_type: 'solution' },\n  learning_refines_hypothesis: { forward_verb: 'refines', reverse_verb: 'refined_by', classification: 'cross-domain', source_type: 'learning', target_type: 'hypothesis' },\n  learning_validates_need: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'learning', target_type: 'need' },\n  learning_validates_job: { forward_verb: 'validates', reverse_verb: 'validated_by', classification: 'cross-domain', source_type: 'learning', target_type: 'job' },\n  learning_informs_feature: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'learning', target_type: 'feature' },\n  evidence_supports_opportunity: { forward_verb: 'supports', reverse_verb: 'supported_by', classification: 'cross-domain', source_type: 'evidence', target_type: 'opportunity' },\n  // `evidence_supports_hypothesis` dropped, superseded by\n  // the canonical `hypothesis_evidence_supports_hypothesis_claim` edge.\n  // The legacy generic `evidence` entity remains valid for non-hypothesis\n  // evidence trails (e.g. learning → evidence chains in experiment runs);\n  // hypothesis-specific evidence now lives on its own dedicated entity.\n  experiment_run_tests_feature: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'feature' },\n  experiment_run_measures_metric: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'metric' },\n  experiment_run_guards_metric: { forward_verb: 'guards', reverse_verb: 'guarded_by', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'metric' },\n  experiment_run_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'experiment_run', target_type: 'metric' },\n  solution_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'hierarchy', source_type: 'solution', target_type: 'metric' },\n\n  // ── Cross-domain: Ownership ──────────────────────────────────────────────────\n  node_owned_by_team: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'node', target_type: 'team', cross_product_eligible: true },\n  node_owned_by_role: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'node', target_type: 'role' },\n  node_owned_by_stakeholder: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'node', target_type: 'stakeholder' },\n  node_owned_by_department: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'node', target_type: 'department', cross_product_eligible: true },\n  node_owned_by_person: { forward_verb: 'owned_by', reverse_verb: 'owns', classification: 'cross-domain', source_type: 'node', target_type: 'person' },\n  // ── Cross-domain: Assignment (0.32.0) ───────────────────────────────────────\n  // Assignment is NOT ownership, and 0.12.0 ruled otherwise. That ruling routed\n  // task.assignee and bug.assignee into node_owned_by_person, and it is\n  // superseded here rather than quietly widened, because the two differ in a way\n  // the field measures.\n  //\n  // ASSIGNMENT HAS A TIME INTERVAL AND OWNERSHIP DOES NOT. A shipped ops plane\n  // models assignment as a claim carrying claimed-at, released-at and a partial\n  // unique index enforcing one live claim; nothing in the spec gives ownership\n  // that shape. And a real 184-item board ran with 157 items (85%) unassigned\n  // while every one of them was owned in the ordinary sense. One edge meaning\n  // both cannot express \"owned by the team, assigned to nobody\", which is the\n  // modal state of a working board.\n  //\n  // Not cross_product_eligible, matching node_owned_by_person: an assignee is a\n  // person in this graph's own roster.\n  node_assigned_to_person: { forward_verb: 'assigned_to', reverse_verb: 'assigned', classification: 'cross-domain', source_type: 'node', target_type: 'person' },\n\n  // ── Cross-domain: Architecture (DDD) ─────────────────────────────────────────\n  // Service, domain_event, domain_entity, aggregate, read_model, api_contract,\n  // value_object, command, and data_model are DDD building blocks that all\n  // belong to a bounded context. Polymorphic because the relationship is\n  // universal across the DDD type family. Verbs follow DDD literature:\n  // aggregate belongs_to context, context contains aggregates.\n  node_belongs_to_bounded_context: { forward_verb: 'belongs_to', reverse_verb: 'contains', classification: 'cross-domain', source_type: 'node', target_type: 'bounded_context' },\n\n  // ── Cross-domain: Framework exercises ────────────────────────────────────────\n  // A framework_exercise is one run of a framework (MoSCoW, RICE, Kano, …) over a\n  // set of entities. It `includes` each entity it touches; the framework's\n  // per-entity result — a MoSCoW bucket, a RICE score, a canvas slot, a funnel\n  // stage — rides on this edge's `properties`, NOT on the entity node. A value\n  // that exists only within a specific exercise is a fact about the relationship,\n  // not the entity, so it lives on the edge (same principle as owner-as-edge).\n  // Polymorphic (`target_type: 'node'`): an exercise can include any entity type,\n  // which closes the feature-only limitation structurally. `carries_properties`\n  // opts this edge into the gated edge-property model. See ADR\n  // 2026-06-02-framework-exercises.\n  framework_exercise_includes_node: { forward_verb: 'includes', reverse_verb: 'included_in', classification: 'cross-domain', source_type: 'framework_exercise', target_type: 'node', carries_properties: true },\n\n  // ── New edges replacing deleted string properties ────────────────────\n\n  // Marketing\n  marketing_strategy_pursues_outcome: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'cross-domain', source_type: 'marketing_strategy', target_type: 'outcome' },\n  marketing_channel_feeds_acquisition_channel: { forward_verb: 'feeds', reverse_verb: 'fed_by', classification: 'cross-domain', source_type: 'marketing_channel', target_type: 'acquisition_channel' },\n\n  // Sales\n  deal_at_pipeline_stage: { forward_verb: 'at_stage', reverse_verb: 'contains_deal', classification: 'cross-domain', source_type: 'deal', target_type: 'pipeline_stage' },\n  subscription_subscribes_to_pricing_tier: { forward_verb: 'subscribes_to', reverse_verb: 'subscribed_by', classification: 'cross-domain', source_type: 'subscription', target_type: 'pricing_tier' },\n  lead_sourced_from_acquisition_channel: { forward_verb: 'sourced_from', reverse_verb: 'generated', classification: 'cross-domain', source_type: 'lead', target_type: 'acquisition_channel' },\n  account_partners_via_partnership: { forward_verb: 'partners_via', reverse_verb: 'partnered_with', classification: 'cross-domain', source_type: 'account', target_type: 'partnership' },\n\n  // Customer Success\n  customer_health_score_composed_of_metric: { forward_verb: 'composed_of', reverse_verb: 'composes', classification: 'cross-domain', source_type: 'customer_health_score', target_type: 'metric' },\n  service_level_agreement_measures_metric: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'service_level_agreement', target_type: 'metric' },\n\n  // Content\n  // (UPG-665) prompt_template_targets_ai_model retired — superseded by the\n  // containment edge ai_model_defines_prompt_template (the model owns its\n  // templates). See UPG_EDGE_MIGRATIONS['0.9.9'].\n\n  // Education\n  education_program_targets_persona: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'education_program', target_type: 'persona' },\n\n  // Programs\n  milestone_gates_deliverable: { forward_verb: 'gates', reverse_verb: 'gated_by', classification: 'cross-domain', source_type: 'milestone', target_type: 'deliverable' },\n\n  // Data\n  data_lineage_sourced_from_data_source: { forward_verb: 'sourced_from', reverse_verb: 'feeds_lineage', classification: 'cross-domain', source_type: 'data_lineage', target_type: 'data_source' },\n  data_lineage_feeds_data_source: { forward_verb: 'feeds', reverse_verb: 'fed_by_lineage', classification: 'cross-domain', source_type: 'data_lineage', target_type: 'data_source' },\n  data_pipeline_reads_from_data_source: { forward_verb: 'reads_from', reverse_verb: 'read_by', classification: 'cross-domain', source_type: 'data_pipeline', target_type: 'data_source' },\n  data_pipeline_writes_to_data_source: { forward_verb: 'writes_to', reverse_verb: 'written_by', classification: 'cross-domain', source_type: 'data_pipeline', target_type: 'data_source' },\n\n  // Compliance\n  audit_log_policy_tracks_event_schema: { forward_verb: 'tracks', reverse_verb: 'tracked_by', classification: 'cross-domain', source_type: 'audit_log_policy', target_type: 'event_schema' },\n\n  // Localisation\n  cultural_adaptation_targets_market_segment: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'cross-domain', source_type: 'cultural_adaptation', target_type: 'market_segment' },\n\n  // Feedback\n  feature_request_from_behavioral_segment: { forward_verb: 'from', reverse_verb: 'requested_by', classification: 'cross-domain', source_type: 'feature_request', target_type: 'behavioral_segment' },\n  feature_request_in_feature_area: { forward_verb: 'in_area', reverse_verb: 'has_request', classification: 'cross-domain', source_type: 'feature_request', target_type: 'feature_area' },\n  feedback_vote_from_behavioral_segment: { forward_verb: 'from', reverse_verb: 'voted_by', classification: 'cross-domain', source_type: 'feedback_vote', target_type: 'behavioral_segment' },\n\n  // AI\n  ai_experiment_uses_ai_model: { forward_verb: 'uses', reverse_verb: 'used_by', classification: 'cross-domain', source_type: 'ai_experiment', target_type: 'ai_model' },\n\n  // ── Intelligence-guide canonical edges ─────────────────────────\n  // These edges back up domain-guide patterns whose original references had\n  // drifted. Each is its own canonical graph contract, not an alias.\n\n  // Product Spec ↔ Validation\n  feature_tests_hypothesis: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'cross-domain', source_type: 'feature', target_type: 'hypothesis' },\n\n  // UX Design (internal hierarchy)\n  // screens aren't contained by journey_step or prototype. They are\n  // their own entities (owned by product / user_flow / screen itself).\n  // These edges describe rendering or referencing relationships, classification = semantic.\n  journey_step_shown_on_screen: { forward_verb: 'shown_on', reverse_verb: 'shows', classification: 'semantic', source_type: 'journey_step', target_type: 'screen' },\n  prototype_simulates_screen: { forward_verb: 'simulates', reverse_verb: 'simulated_in', classification: 'semantic', source_type: 'prototype', target_type: 'screen' },\n\n  // UX Design ↔ Validation\n  prototype_tests_hypothesis: { forward_verb: 'tests', reverse_verb: 'tested_by', classification: 'cross-domain', source_type: 'prototype', target_type: 'hypothesis' },\n\n  // Design System ↔ Brand\n  design_token_reflects_brand_colour: { forward_verb: 'reflects', reverse_verb: 'reflected_in', classification: 'cross-domain', source_type: 'design_token', target_type: 'brand_colour' },\n\n  // Brand (internal hierarchy)\n  brand_identity_signed_with_brand_logo: { forward_verb: 'signed_with', reverse_verb: 'signs', classification: 'hierarchy', source_type: 'brand_identity', target_type: 'brand_logo' },\n\n  // Go-To-Market ↔ Brand\n  messaging_aligns_with_brand_voice: { forward_verb: 'aligns_with', reverse_verb: 'voiced_via', classification: 'cross-domain', source_type: 'messaging', target_type: 'brand_voice' },\n\n  // Legal ↔ Data & Analytics\n  privacy_policy_governs_data_source: { forward_verb: 'governs', reverse_verb: 'governed_by_policy', classification: 'cross-domain', source_type: 'privacy_policy', target_type: 'data_source' },\n\n  // DevOps (causal SRE chain)\n  monitor_detects_symptom: { forward_verb: 'detects', reverse_verb: 'surfaced_by', classification: 'causal', source_type: 'monitor', target_type: 'symptom' },\n  symptom_triggers_incident: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'causal', source_type: 'symptom', target_type: 'incident' },\n\n  // ── (since v0.4.0) canonical replacements for narrative-string properties ──\n  // Each edge here replaces a string property on the source entity that\n  // was tagged `@deprecated since=\"0.4.0\" removeIn=\"0.5.0\"` in the\n  // corresponding domain file. Names follow the\n  // `subject_verb_object` catalog grammar; targets are existing entity\n  // types in `entity-catalog.ts`.\n  /** Replaces `LearningProperties.metric: string`. Links a learning to the metric it was observed on. */\n  learning_observed_on_metric: { forward_verb: 'observed_on', reverse_verb: 'observed_in', classification: 'cross-domain', source_type: 'learning', target_type: 'metric' },\n  /** Replaces `ModelComparisonProperties.winner: string`. Links a model comparison to the ai_model that won. */\n  model_comparison_winner_is_ai_model: { forward_verb: 'won_by', reverse_verb: 'wins', classification: 'cross-domain', source_type: 'model_comparison', target_type: 'ai_model' },\n  /** Replaces `DataProductProperties.consumers: string`. Links a data product to each consuming service (per JSDoc example values like `analytics-service`, `search-indexer`). */\n  data_product_consumed_by_service: { forward_verb: 'consumed_by', reverse_verb: 'consumes', classification: 'cross-domain', source_type: 'data_product', target_type: 'service' },\n  /** Replaces `ReportProperties.recipients: string`. Links a report to each receiving team (per JSDoc example values like `exec-team`, `product-leads`). */\n  report_distributed_to_team: { forward_verb: 'distributed_to', reverse_verb: 'receives', classification: 'cross-domain', source_type: 'report', target_type: 'team' },\n  /** Replaces `ServiceLevelAgreementProperties.customer: string`. Links an SLA to the account it covers (the existing JSDoc already hinted this was the canonical shape). */\n  service_level_agreement_covers_account: { forward_verb: 'covers', reverse_verb: 'covered_by_sla', classification: 'cross-domain', source_type: 'service_level_agreement', target_type: 'account' },\n\n  // ── v0.4.1: Cross-domain edge clusters ───────────────────────────────────\n  //\n  // Added 2026-05-16 after Wave 4 stress-test against a saturated Notion\n  // workspace surfaced 9 genuinely-missing cross-domain bridges. Clusters E\n  // and F flagged in the same stress-test were already complete in v0.4.0\n  // those rejections were Entopo runtime-snapshot drift, not spec gaps.\n\n  // Cluster A: Testing to Bug.\n  // test_suite_covers_feature / qa_session_targets_feature /\n  // eval_benchmark_measures_feature / test_case_validates_acceptance_criterion\n  // / test_*_produces_test_result already exist (v0.3.x). The one outstanding\n  // hop was regression-test ↔ bug; regression tests are written to guard\n  // against a specific known bug, distinct from `release_contains_bug`.\n  regression_test_addresses_bug: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'regression_test', target_type: 'bug' },\n\n  // Cluster B: DevOps cross-domain.\n  // service_level_objective_tracks_metric / monitor_watches_service /\n  // ci_pipeline_deploys_service / runbook_mitigates_incident /\n  // infrastructure_component_covered_by_on_call_rotation already exist.\n  // Two genuinely missing: an incident's impact on user-facing features\n  // (distinct from the SLO/postmortem bridges) and the bridge from a\n  // release strategy to the concrete deployments it governs.\n  incident_affects_feature: { forward_verb: 'affects', reverse_verb: 'affected_by', classification: 'cross-domain', source_type: 'incident', target_type: 'feature' },\n  release_strategy_used_by_deployment: { forward_verb: 'used_by', reverse_verb: 'uses', classification: 'cross-domain', source_type: 'release_strategy', target_type: 'deployment' },\n  // v0.8.2 (UPG-615): ITIL/ITSM incident management explicitly links an incident\n  // to the customer-facing support tickets/cases it spawns — when a service\n  // breaks, customers raise tickets; the incident is the cause, the ticket the\n  // effect. Closes the otherwise-unmediated \"Customer Support\" island in\n  // `playbook:operations-quality`, binding `support_ticket` to the incident/ops\n  // spine. Source: ITIL v4 incident management; DORA/SRE customer-facing impact.\n  incident_generates_support_ticket: { forward_verb: 'generates', reverse_verb: 'generated_by', classification: 'cross-domain', source_type: 'incident', target_type: 'support_ticket' },\n\n  // Cluster C: User Research linkage matrix.\n  // research_study → {participant, research_question, survey_response,\n  // interview_guide} containment edges already exist (49/49 in Wave 4).\n  // Missing: the lateral bridges from atoms collected during the study to\n  // the discovery-domain entities they evidence.\n  participant_voiced_quote: { forward_verb: 'voiced', reverse_verb: 'voiced_by', classification: 'cross-domain', source_type: 'participant', target_type: 'quote' },\n  // v0.7.2 (UPG-571 §1): personas are evidence-based abstractions of real participants; connects the isolated `participant` member to the users anchor.\n  participant_represents_persona: { forward_verb: 'represents', reverse_verb: 'represented_by', classification: 'cross-domain', source_type: 'participant', target_type: 'persona' },\n  research_question_addressed_by_insight: { forward_verb: 'addressed_by', reverse_verb: 'addresses', classification: 'cross-domain', source_type: 'research_question', target_type: 'insight' },\n  survey_response_evidences_insight: { forward_verb: 'evidences', reverse_verb: 'evidenced_by', classification: 'cross-domain', source_type: 'survey_response', target_type: 'insight' },\n\n  // Cluster D: Engineering finishing touches.\n  // feature_flag had only `service_toggles_feature_flag`; the user-visible\n  // gating relationship was missing. data_model ↔ database_schema is the\n  // logical-to-physical mapping (data_model is bounded-context-level;\n  // database_schema is the persisted shape). read_model → aggregate is the\n  // canonical CQRS projection direction (read_model projects from the\n  // write-side aggregate).\n  feature_flag_gates_feature: { forward_verb: 'gates', reverse_verb: 'gated_by', classification: 'cross-domain', source_type: 'feature_flag', target_type: 'feature' },\n  data_model_persisted_in_database_schema: { forward_verb: 'persisted_in', reverse_verb: 'persists', classification: 'cross-domain', source_type: 'data_model', target_type: 'database_schema' },\n  read_model_projects_aggregate: { forward_verb: 'projects', reverse_verb: 'projected_as', classification: 'cross-domain', source_type: 'read_model', target_type: 'aggregate' },\n\n  // ─── v0.5.5 (UPG-528 Part 2a): business-/GTM-canvas wiring ─────────────────\n  // The Part 1 slot-connectivity audit (Agent O2) surfaced 240 missing ordered\n  // pairs across 5 Tier-1 business/GTM canvases. Most are artifacts of the\n  // canvas declaring too many slot types, but ~29 represent real, named\n  // relationships from the canonical source literature (Osterwalder's BMC,\n  // Maurya's Lean Canvas, Patton's Opportunity Canvas, Strategyzer's Test\n  // Card + Learning Card, and GTM Playbook practice). Added here.\n  //\n  // Discipline applied: LOW-confidence pairs (e.g., cost_structure → persona,\n  // metric → solution, all hierarchy-reverse edges already covered by reverse\n  // traversal) are NOT added. See Part 2a report for the full rationale.\n\n  // Business Model Canvas: canonical Osterwalder relationships\n  // (the 9-block canvas has explicit named flows: VP ↔ segments, channels\n  // ↔ segments, activities/resources/partners produce VP, costs driven by\n  // activities/resources). These 15 edges close the BMC structural spine.\n  key_activity_delivers_value_proposition: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'causal', source_type: 'key_activity', target_type: 'value_proposition' },\n  key_activity_uses_key_resource: { forward_verb: 'uses', reverse_verb: 'used_by', classification: 'cross-domain', source_type: 'key_activity', target_type: 'key_resource' },\n  key_resource_enables_key_activity: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'cross-domain', source_type: 'key_resource', target_type: 'key_activity' },\n  partnership_performs_key_activity: { forward_verb: 'performs', reverse_verb: 'performed_by', classification: 'cross-domain', source_type: 'partnership', target_type: 'key_activity' },\n  partnership_provides_key_resource: { forward_verb: 'provides', reverse_verb: 'provided_by', classification: 'cross-domain', source_type: 'partnership', target_type: 'key_resource' },\n  customer_relationship_with_market_segment: { forward_verb: 'with', reverse_verb: 'maintained_by', classification: 'cross-domain', source_type: 'customer_relationship', target_type: 'market_segment' },\n  distribution_channel_reaches_market_segment: { forward_verb: 'reaches', reverse_verb: 'reached_by', classification: 'cross-domain', source_type: 'distribution_channel', target_type: 'market_segment' },\n  distribution_channel_delivers_value_proposition: { forward_verb: 'delivers', reverse_verb: 'delivered_by', classification: 'cross-domain', source_type: 'distribution_channel', target_type: 'value_proposition' },\n  value_proposition_addresses_market_segment: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'value_proposition', target_type: 'market_segment' },\n  revenue_stream_captured_from_market_segment: { forward_verb: 'captured_from', reverse_verb: 'yields_revenue_via', classification: 'cross-domain', source_type: 'revenue_stream', target_type: 'market_segment' },\n  cost_structure_driven_by_key_activity: { forward_verb: 'driven_by', reverse_verb: 'drives_cost_via', classification: 'causal', source_type: 'cost_structure', target_type: 'key_activity' },\n  cost_structure_driven_by_key_resource: { forward_verb: 'driven_by', reverse_verb: 'drives_cost_via', classification: 'causal', source_type: 'cost_structure', target_type: 'key_resource' },\n  value_proposition_yields_revenue_stream: { forward_verb: 'yields', reverse_verb: 'yielded_by', classification: 'causal', source_type: 'value_proposition', target_type: 'revenue_stream' },\n  // MEDIUM-confidence (verb-naming): relationships and partnerships *support*\n  // a VP but the \"support\" verb is one of several plausible choices\n  // (could be 'contributes_to' or 'shapes'). REVIEW: medium-confidence;\n  // surfaced by UPG-528 Part 2a; verify naming.\n  customer_relationship_supports_value_proposition: { forward_verb: 'supports', reverse_verb: 'supported_by', classification: 'cross-domain', source_type: 'customer_relationship', target_type: 'value_proposition' },\n  partnership_supports_value_proposition: { forward_verb: 'supports', reverse_verb: 'supported_by', classification: 'cross-domain', source_type: 'partnership', target_type: 'value_proposition' },\n\n  // Lean Canvas: Maurya's problem-solution-customer triangle. The catalog\n  // already has `opportunity_drives_solution` and `value_proposition_solves_\n  // need`, but the *direct* solution → need link (problem-solution fit) and\n  // capability → VP (the \"unfair advantage\" capability) are canonical Lean\n  // Startup vocabulary that should resolve in one hop.\n  solution_addresses_need: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'causal', source_type: 'solution', target_type: 'need' },\n  capability_enables_value_proposition: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'causal', source_type: 'capability', target_type: 'value_proposition' },\n  // Competitor → need closes the \"Existing Alternatives\" lean-canvas slot:\n  // a competitor exists *because* it addresses the same underlying need.\n  competitor_addresses_need: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'competitor', target_type: 'need' },\n\n  // GTM Playbook: the canonical flow (ICP → positioning → messaging → launch\n  // → sales). gtm_strategy already fans out to all six children. What's\n  // missing is the *lateral* dependencies: different ICPs need different\n  // positionings, messaging, and sales motions; messaging is the artifact\n  // that launches use and that sales motions weaponise.\n  ideal_customer_profile_informs_positioning: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'causal', source_type: 'ideal_customer_profile', target_type: 'positioning' },\n  ideal_customer_profile_shapes_messaging: { forward_verb: 'shapes', reverse_verb: 'shaped_by', classification: 'causal', source_type: 'ideal_customer_profile', target_type: 'messaging' },\n  ideal_customer_profile_shapes_sales_motion: { forward_verb: 'shapes', reverse_verb: 'shaped_by', classification: 'causal', source_type: 'ideal_customer_profile', target_type: 'sales_motion' },\n  messaging_used_in_launch: { forward_verb: 'used_in', reverse_verb: 'uses', classification: 'cross-domain', source_type: 'messaging', target_type: 'launch' },\n  messaging_enables_sales_motion: { forward_verb: 'enables', reverse_verb: 'enabled_by', classification: 'cross-domain', source_type: 'messaging', target_type: 'sales_motion' },\n\n  // Test Card + Learning Card (Strategyzer): canonical validation flow\n  // hypothesis → experiment_plan → experiment → experiment_run → evidence →\n  // learning → decision (UPG-664). The \"Test Design\" card is the\n  // `experiment_plan`; the plan designs the experiment\n  // (`experiment_plan_designs_experiment`), which is executed as run(s). The\n  // former `test_plan_ran_as_experiment_run` bridge was retired when `test_plan`\n  // re-homed to QA (UPG-678) — see UPG_EDGE_MIGRATIONS['0.9.9']. This block keeps\n  // the evidence → learning interpretation and learning → decision commitment.\n  evidence_interpreted_as_learning: { forward_verb: 'interpreted_as', reverse_verb: 'interpreted_from', classification: 'causal', source_type: 'evidence', target_type: 'learning' },\n  learning_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'causal', source_type: 'learning', target_type: 'decision' },\n\n  // Opportunity Canvas: Patton's \"Assumptions\" slot is meant to capture the\n  // riskiest beliefs about each of the other slots (problem, users, solution).\n  // The catalog already has `assumption_becomes_hypothesis` (the test-to-validate\n  // flow) and `initiative_assumes_assumption` (the owner side). Missing: the\n  // *subject* of the assumption: what is the assumption about?\n  // MEDIUM-confidence (verb-naming): \"concerns\" is one of several plausible\n  // verbs (could be 'about', 'applies_to', 'targets'). REVIEW: medium-confidence;\n  // surfaced by UPG-528 Part 2a; verify naming.\n  assumption_concerns_need: { forward_verb: 'concerns', reverse_verb: 'has_assumption', classification: 'semantic', source_type: 'assumption', target_type: 'need' },\n  assumption_concerns_persona: { forward_verb: 'concerns', reverse_verb: 'has_assumption', classification: 'semantic', source_type: 'assumption', target_type: 'persona' },\n  assumption_concerns_solution: { forward_verb: 'concerns', reverse_verb: 'has_assumption', classification: 'semantic', source_type: 'assumption', target_type: 'solution' },\n\n  // ─── v0.5.6 (UPG-528 Part 2b): design/UX canvas wiring ─────────────────────\n  // The Part 1 audit (Agent O2) also surfaced 75 missing ordered slot pairs\n  // across three Tier-1 design/UX canvases:\n  //   - Lean UX Canvas (Gothelf, 8 slots, 42 pairs, 36 null)\n  //   - Persona Canvas (Cooper/Pichler, 6 slots, 30 pairs, 20 null)\n  //   - Design Sprint (Knapp/GV, 5 slots, 20 pairs, 19 null)\n  // Of those 75, ~50 are slot-pair artifacts (no canonical relationship in the\n  // source literature (e.g. `outcome → persona`, `quote → desired_outcome`)\n  // or hierarchy-reverses already covered by reverse traversal of an existing\n  // edge. Part 2b adds 13 HIGH-confidence + 2 MEDIUM-confidence edges that map\n  // to explicitly-named relationships in the source literature.\n\n  // Lean UX Canvas: Gothelf's hypothesis template explicitly binds\n  // hypothesis → feature → persona → outcome (\"We believe [feature] for\n  // [persona] will result in [outcome]\"). The catalog already had\n  // `feature_tests_hypothesis` (the experiment-side reverse) and\n  // `experiment_run_validates_hypothesis`. Missing: the forward subject\n  // arrows from the hypothesis to its components.\n  hypothesis_targets_outcome: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'causal', source_type: 'hypothesis', target_type: 'outcome' },\n  hypothesis_concerns_persona: { forward_verb: 'concerns', reverse_verb: 'has_hypothesis', classification: 'semantic', source_type: 'hypothesis', target_type: 'persona' },\n  // Lean UX block 5 (Solutions) is paired with block 1 (Business Problem,\n  // expressed as `need`). Features address needs. Parallel to the existing\n  // `feature_addresses_job`; features address both jobs and needs.\n  feature_addresses_need: { forward_verb: 'addresses', reverse_verb: 'addressed_by', classification: 'cross-domain', source_type: 'feature', target_type: 'need' },\n  // Lean UX block 2 (Business Outcomes) and block 8 (Experiments) form the\n  // measurement loop. Parallel to `experiment_run_measures_metric`; outcomes\n  // are the higher-level business measure that experiments target.\n  experiment_run_measures_outcome: { forward_verb: 'measures', reverse_verb: 'measured_by', classification: 'cross-domain', source_type: 'experiment_run', target_type: 'outcome' },\n  // Persona pursues business/user outcome. The catalog has\n  // `persona_aspires_to_desired_outcome` (for the JTBD `desired_outcome`\n  // subtype) and `product_pursues_outcome`. Lean UX block 4 (User Outcomes\n  // & Benefits) directly ties persona to outcome. Use `pursues` to mirror\n  // `persona_pursues_job`; same verb, lateral within the user domain.\n  persona_pursues_outcome: { forward_verb: 'pursues', reverse_verb: 'pursued_by', classification: 'semantic', source_type: 'persona', target_type: 'outcome' },\n  // Completes the assumption-subject pattern from Part 2a (assumption concerns\n  // need / persona / solution). Lean UX block 7 (Assumptions) and Opportunity\n  // Canvas both let assumptions concern outcomes or features. MEDIUM-confidence\n  // (verb-naming): \"concerns\" inherits the Part 2a debate. REVIEW: medium-\n  // confidence; pattern-completion of UPG-528 Part 2a's `assumption_concerns_*`.\n  assumption_concerns_outcome: { forward_verb: 'concerns', reverse_verb: 'has_assumption', classification: 'semantic', source_type: 'assumption', target_type: 'outcome' },\n  assumption_concerns_feature: { forward_verb: 'concerns', reverse_verb: 'has_assumption', classification: 'semantic', source_type: 'assumption', target_type: 'feature' },\n\n  // Persona Canvas (Pichler/Cooper). The canvas has explicit slots for\n  // {persona, desired_outcome, need, observation, job, quote}. Most relationships\n  // were already in the catalog (`persona_pursues_job`, `persona_experiences_need`,\n  // `persona_aspires_to_desired_outcome`, `job_motivates_desired_outcome`,\n  // `observation_characterises_persona`, `observation_evidenced_by_quote`,\n  // `quote_evidences_need`, `observation_reveals_need`). Missing: the quote\n  // direction from the persona's mouth, the Ulwick need ↔ desired_outcome link,\n  // and the parallel \"observation reveals job\" edge.\n  //\n  // Quotes voice personas: Persona Canvas's Quotes slot is explicitly\n  // \"what the persona says\". Parallel to `observation_characterises_persona`\n  // but for verbal evidence. Cross-domain because quotes are research artifacts\n  // and persona is a user-domain entity.\n  quote_voices_persona: { forward_verb: 'voices', reverse_verb: 'voiced_by', classification: 'cross-domain', source_type: 'quote', target_type: 'persona' },\n  // Need ↔ desired_outcome: Ulwick's outcome-driven innovation. A need is\n  // measured by the desired outcomes that quantify its satisfaction. Causal\n  // because the need creates the outcome's existence as a measurable target.\n  // Reverse traversal closes `desired_outcome → need` via this single edge.\n  need_measured_by_desired_outcome: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'causal', source_type: 'need', target_type: 'desired_outcome' },\n  // Observation reveals job: parallel to `observation_reveals_need` (already\n  // in catalog). Persona Canvas's Behaviours slot (observations) explicitly\n  // surfaces jobs the persona performs. Same `reveals` verb maintains\n  // observation's surfacing-verb family (reveals_need, reveals_job, characterises_persona).\n  observation_reveals_job: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'observation', target_type: 'job' },\n\n  // Design Sprint (Knapp/GV). The five-day flow is\n  // design_question → design_concept → decision → user_flow → observation.\n  // The catalog already had `design_question_answered_by_design_concept`\n  // (Day 1 → Day 2). Missing: Days 3-5 closure.\n  //\n  // Day 3 Decide: the design question gets a resolution. Parallel to\n  // `design_question_answered_by_design_concept` but at the commitment level:\n  // a sprint exits with one decision per HMW question.\n  design_question_resolved_by_decision: { forward_verb: 'resolved_by', reverse_verb: 'resolves', classification: 'causal', source_type: 'design_question', target_type: 'decision' },\n  // Day 3 Decide picks the winning design_concept. Parallel structure to\n  // `decision_selects_*` family (no existing siblings in the catalog yet, but\n  // the verb is the sprint's canonical action: \"Decide\" = pick the sketch).\n  decision_selects_design_concept: { forward_verb: 'selects', reverse_verb: 'selected_by', classification: 'causal', source_type: 'decision', target_type: 'design_concept' },\n  // Day 5 Test: observations validate (or invalidate) the prototype's\n  // user_flow. Causal because the test produces the observations. Parallel\n  // to `experiment_run_validates_hypothesis`; observation is to user_flow\n  // what experiment_run is to hypothesis in the sprint world.\n  user_flow_validated_by_observation: { forward_verb: 'validated_by', reverse_verb: 'validates', classification: 'causal', source_type: 'user_flow', target_type: 'observation' },\n  // MEDIUM-confidence (polysemy with prototype): in a Design Sprint the\n  // prototype is often expressed as a user_flow, and `design_concept_realised_as_prototype`\n  // already exists. Adding `design_concept_realised_as_user_flow` widens the\n  // grammar; concepts can be prototypes OR flows depending on the sprint\n  // (low-fidelity flows are valid prototypes). REVIEW: medium-confidence;\n  // could be argued as redundant with prototype edge.\n  design_concept_realised_as_user_flow: { forward_verb: 'realised_as', reverse_verb: 'realises', classification: 'causal', source_type: 'design_concept', target_type: 'user_flow' },\n  // MEDIUM-confidence (subsumed by learning?): `learning_informs_decision`\n  // (Part 2a) already covers the synthesised-insight path. This adds the more\n  // direct observation → decision link, useful when a sprint observation\n  // immediately changes a follow-up commitment without intermediate learning\n  // synthesis. REVIEW: medium-confidence; potential duplication with\n  // learning_informs_decision through the synthesis layer.\n  observation_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'observation', target_type: 'decision' },\n\n  // ─── v0.5.7 (UPG-528 Part 2c): engineering + AI canvas wiring ──────────────\n  // The Part 1 audit (Agent O2) surfaced missing ordered slot pairs across\n  // four Tier-1 engineering + AI canvases:\n  //   - Bounded Context Canvas (Nick Tune / DDD Crew, 6 slots, 30 pairs, 24 null)\n  //   - LLM Evaluation Framework (NLP community, 6 slots, 30 pairs, 26 null)\n  //   - API Design First (OpenAPI Initiative, 5 unique slot types, 20 pairs, 19 null)\n  //   - Multi-Agent Orchestration (AutoGen/CrewAI/LangGraph, 6 slots, 30 pairs, 25 null)\n  // Many of these pairs were closed in v0.5.3 (Agent S: DDD/CQRS event chain)\n  // and earlier waves. The remaining gaps fall into two camps: real canonical\n  // relationships in the source literature (added here, 11 HIGH-confidence)\n  // versus slot-pair artifacts, hierarchy reverses, or paths mediated through\n  // another entity (NOT added; see Part 2c handoff report).\n\n  // Bounded Context Canvas: Tune's \"Business Decisions\" slot maps to\n  // `api_contract` (the loose framework mapping treats published contracts as\n  // the decisions a BC publishes). The contract level relationship exists in\n  // DDD literature (\"published language\") above the per-service exposure\n  // already in the catalog (`service_exposes_api_contract`). Adding the BC-\n  // level structural parent gives the contract two valid hierarchy parents\n  // (service AND bounded_context), matching DDD canon: a context's published\n  // language is the union of its services' contracts.\n  bounded_context_publishes_api_contract: { forward_verb: 'publishes', reverse_verb: 'published_by', classification: 'hierarchy', source_type: 'bounded_context', target_type: 'api_contract' },\n  // CQRS saga / process-manager pattern (Vernon, Young). An event handler can\n  // issue a new command in response to a domain event, closing the reactive\n  // loop the existing chain only covers in one direction\n  // (command_produces_domain_event). Without this, sagas can be recorded only\n  // by burying the link in node_informs_node. Causal because the event's\n  // arrival is the trigger; the issued command is the effect.\n  domain_event_triggers_command: { forward_verb: 'triggers', reverse_verb: 'triggered_by', classification: 'causal', source_type: 'domain_event', target_type: 'command' },\n\n  // LLM Evaluation Framework: the canvas presents Latency as `metric` and\n  // wires Accuracy (eval_benchmark), Coherence (eval_run), Cost\n  // (ai_cost_tracker), Safety (ai_guardrail) as the other dimensions.\n  // The existing chain covers ai_model → eval_benchmark → eval_run, plus\n  // ai_model → metric mediated through outcome. Missing: the direct outputs.\n  //\n  // Eval runs produce metric values: every benchmark execution writes a\n  // result row of (metric, value, timestamp) per (model, benchmark) pair.\n  // Causal because the run is what creates the metric reading; the metric\n  // exists as a definition before the run, but the value is produced.\n  eval_run_produces_metric: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'causal', source_type: 'eval_run', target_type: 'metric' },\n  // Benchmarks define their metric set. HELM, MLPerf, BIG-bench all specify\n  // which metrics constitute the benchmark (accuracy, BLEU, F1, latency).\n  // Hierarchy mirrors `data_source_defines_metric` (same verb pattern). Adds\n  // eval_benchmark as a valid hierarchy parent of metric; metric already has\n  // many parents (outcome, objective, key_result, solution, data_source).\n  eval_benchmark_defines_metric: { forward_verb: 'defines', reverse_verb: 'defined_by', classification: 'hierarchy', source_type: 'eval_benchmark', target_type: 'metric' },\n\n  // API Design First: the canvas threads contract → endpoint → review\n  // (decision) → mock (domain_entity) → implementation (data_flow). The\n  // existing chain covers api_contract → api_endpoint via Agent S's\n  // v0.5.1 work. Missing: the typed-payload edges and the design-decision\n  // attachment.\n  //\n  // Endpoints reference domain entities as request/response payloads.\n  // Semantic (not hierarchy) because endpoints don't contain entity\n  // definitions; they bind to them by name. Within engineering domain.\n  api_endpoint_references_domain_entity: { forward_verb: 'references', reverse_verb: 'referenced_by', classification: 'semantic', source_type: 'api_endpoint', target_type: 'domain_entity' },\n  // API design decisions (auth scheme, versioning policy, REST vs gRPC,\n  // pagination) are recorded against the contract during review. Cross-domain\n  // because decision lives in the strategy/outcomes domain and api_contract\n  // in engineering. Parallel to `bounded_context_decided_via_decision` but at\n  // the contract grain.\n  api_contract_records_decision: { forward_verb: 'records', reverse_verb: 'recorded_in', classification: 'cross-domain', source_type: 'api_contract', target_type: 'decision' },\n  // Data flows transport domain entities (DFD canonical). The arrow on a\n  // data-flow diagram carries a named payload. Causal because the flow\n  // moves the entity from one process node to another; without the flow\n  // the entity is local. Same engineering domain.\n  data_flow_transports_domain_entity: { forward_verb: 'transports', reverse_verb: 'transported_by', classification: 'causal', source_type: 'data_flow', target_type: 'domain_entity' },\n  // Endpoints participate in data flows (DFD nodes that emit/consume flows).\n  // Semantic because participation is associational membership, not\n  // containment (a flow is composed of many node-participations, not owned\n  // by one endpoint).\n  api_endpoint_participates_in_data_flow: { forward_verb: 'participates_in', reverse_verb: 'involves', classification: 'semantic', source_type: 'api_endpoint', target_type: 'data_flow' },\n\n  // Multi-Agent Orchestration: the canvas wires agent_definition →\n  // workflow_template → workflow_run → workflow_artifact with agent_hook and\n  // review_gate as cross-cutting concerns. The existing catalog covers the\n  // template-level structure (orchestrates / executed_as / gated_by). Missing:\n  // the runtime/execution facts that the canvas surfaces under \"Handoff Rules\"\n  // and \"Aggregation\".\n  //\n  // Agents produce artifacts as their direct output. Polysemic with\n  // `workflow_run_produces_workflow_artifact` (already in catalog); both are\n  // canonical: the artifact has a structural run-producer AND a logical\n  // agent-producer. Mirrors `aggregate_emits_domain_event` +\n  // `command_produces_domain_event` polysemy (UPG-517).\n  agent_definition_produces_workflow_artifact: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'causal', source_type: 'agent_definition', target_type: 'workflow_artifact' },\n  // Hooks fire during runs. The existing `agent_definition_triggered_via_agent_hook`\n  // covers the hook→agent registration; this adds the hook→run runtime\n  // attribution. Causal: the run is the execution context in which the\n  // hook actually fires.\n  agent_hook_fires_during_workflow_run: { forward_verb: 'fires_during', reverse_verb: 'fires_via', classification: 'causal', source_type: 'agent_hook', target_type: 'workflow_run' },\n  // Runs pass through review gates. The catalog has the template-level\n  // `workflow_template_gated_by_review_gate` (the gate is declared on the\n  // template). This adds the run-level traversal: the gate is a checkpoint\n  // the run actually traverses. Distinct enough from the template-level\n  // declaration to warrant its own edge: queries asking \"which runs blocked\n  // on this gate?\" need the run-level link.\n  workflow_run_passes_through_review_gate: { forward_verb: 'passes_through', reverse_verb: 'gates_run', classification: 'causal', source_type: 'workflow_run', target_type: 'review_gate' },\n\n  // ─── v0.5.8 (UPG-528 Part 2d): strategy + research + feedback canvas wiring ─\n  // The Part 1 audit (Agent O2), re-run on Agent W's v0.5.7 base, surfaced\n  // missing slot pairs across eight Tier-1 strategy / research / feedback\n  // canvases:\n  //   - McKinsey 7S (Peters & Waterman, 6 unique types, 30 pairs, 29 null)\n  //   - Strategy Diamond (Hambrick & Fredrickson, 5 types, 20 pairs, 15 null)\n  //   - Research Democratisation (ResearchOps, 5 types, 20 pairs, 20 null)\n  //   - Research Ops Framework (ResearchOps Community, 5 types, 20 pairs, 19 null)\n  //   - Usability Test Plan (Nielsen, 5 types, 20 pairs, 19 null)\n  //   - Behavioural Cohort Analysis (Amplitude/Mixpanel, 5 types, 20 pairs, 19 null)\n  //   - Customer Advisory Board (B2B canon, 5 types, 20 pairs, 19 null)\n  //   - Customer Effort Score (Dixon/Toman/DeLisi, 5 types, 20 pairs, 19 null)\n  // Part 2d adds HIGH-confidence edges that map to explicitly-named\n  // relationships in the source literature. Most remaining pairs are LOW-\n  // confidence: slot-pair artifacts (the 7S model is a \"they all interact\"\n  // diagram with no directional verbs), hierarchy reverses (the catalog has\n  // the forward edge, reverse traversal covers them), or mediated paths\n  // (e.g. participant → insight via observation/quote). Continues Part 2a/2b/2c\n  // discipline: quality of the catalog over score on the audit.\n\n  // ── McKinsey 7S (3 HIGH) ──────────────────────────────────────────────────\n  // 7S itself names no verbs between elements (\"alignment\", not causation).\n  // Edges added here are drawn from the adjacent strategy-cascade and SAFe\n  // literature where the verb IS named.\n  //\n  // Vision → strategic_theme: the standard strategy cascade\n  // (vision → mission → strategic_theme → objective). The catalog already has\n  // `vision_realised_through_mission` and `vision_guides_objective`. This\n  // closes the missing link between vision and themes: \"the vision guides\n  // which themes we pursue this year\". Causal because the vision shapes\n  // theme selection; mirrors `vision_guides_objective` verb family.\n  vision_guides_strategic_theme: { forward_verb: 'guides', reverse_verb: 'guided_by', classification: 'causal', source_type: 'vision', target_type: 'strategic_theme' },\n  // Strategic_theme → capability: SAFe canon. Themes require investment\n  // capabilities. Pairs with the existing `strategic_pillar → capability`\n  // hierarchy (pillars contain capabilities) and `capability_enables_value_stream`.\n  // Causal: themes drive capability investment decisions. Verb \"requires\"\n  // mirrors the well-used catalog family\n  // (hypothesis_requires_experiment_plan, business_model_requires_key_resource).\n  strategic_theme_requires_capability: { forward_verb: 'requires', reverse_verb: 'required_by', classification: 'causal', source_type: 'strategic_theme', target_type: 'capability' },\n  // Strategic_theme → value_stream: SAFe canon. Themes flow through value\n  // streams to delivery. Parallel to `strategic_pillar_delivers_value_stream`\n  // (hierarchy) at the pillar level; this is the theme-level lateral.\n  // Semantic because themes don't OWN value streams (the value stream is\n  // pillar-owned in SAFe), they flow through them. Verb \"flows_through\"\n  // mirrors `product_flows_through_data_flow`, `bounded_context_flows_through_data_flow`.\n  strategic_theme_flows_through_value_stream: { forward_verb: 'flows_through', reverse_verb: 'channels', classification: 'semantic', source_type: 'strategic_theme', target_type: 'value_stream' },\n\n  // ── Strategy Diamond (4 HIGH) ─────────────────────────────────────────────\n  // Hambrick & Fredrickson's diamond names five elements (Arenas, Vehicles,\n  // Differentiators, Staging, Economic Logic) but explicitly says they must\n  // be \"internally consistent\"; no directional verbs in the source. Edges\n  // added here come from the adjacent BMC + market-entry literature where\n  // the verb pair IS named. Several other null pairs from the audit are\n  // already covered by reverse traversal (market_segment → distribution_channel\n  // via `distribution_channel_reaches_market_segment`, etc.), explicitly\n  // NOT re-added in the forward direction.\n  //\n  // Initiative → market_segment: \"staging\" maps to initiatives; initiatives\n  // enter market segments (market-entry canon per Lafley/Martin, A.G. Ricci).\n  // Distinct from `product_addresses_market_segment` (product-level): the\n  // initiative is the unit of market entry. Cross-domain because initiative\n  // sits in Strategy and market_segment in Market Intelligence.\n  initiative_enters_market_segment: { forward_verb: 'enters', reverse_verb: 'entered_by', classification: 'cross-domain', source_type: 'initiative', target_type: 'market_segment' },\n  // Initiative → value_proposition: initiatives realise VPs. The diamond's\n  // \"Differentiators\" facet is realised by initiative-level work. Parallel\n  // to `solution_becomes_feature` (v0.5.4) but at the initiative level.\n  // Causal because the initiative's execution is what makes the VP real\n  // for customers. The reverse-direction `value_proposition → initiative`\n  // would be wrong: VPs don't launch initiatives; initiatives realise VPs.\n  initiative_realises_value_proposition: { forward_verb: 'realises', reverse_verb: 'realised_by', classification: 'causal', source_type: 'initiative', target_type: 'value_proposition' },\n  // Initiative → revenue_stream: initiatives unlock revenue streams. The\n  // diamond's \"Economic Logic\" facet wires initiatives to the revenue they\n  // generate. Causal because the initiative's success produces the revenue\n  // stream's growth (or its existence, net-new revenue streams). Distinct\n  // from `business_model_earns_via_revenue_stream` (hierarchical model →\n  // stream) and `subscription_drives_revenue_stream` (subscription product).\n  initiative_unlocks_revenue_stream: { forward_verb: 'unlocks', reverse_verb: 'unlocked_by', classification: 'causal', source_type: 'initiative', target_type: 'revenue_stream' },\n  // Distribution_channel → revenue_stream: BMC canon (Osterwalder's\n  // \"How does each Channel result in revenue?\" question is the direct\n  // channel-to-revenue link). Channels MONETISE the value proposition; the\n  // revenue stream is the monetisation. Causal because the channel's\n  // operation is what produces revenue. Distinct from\n  // `revenue_stream_captured_from_market_segment` (revenue ← market).\n  distribution_channel_generates_revenue_stream: { forward_verb: 'generates', reverse_verb: 'generated_by', classification: 'causal', source_type: 'distribution_channel', target_type: 'revenue_stream' },\n\n  // ── Research Democratisation (1 HIGH) ─────────────────────────────────────\n  // The framework's slots (tutorial, interview_guide, design_guideline,\n  // review_gate, insight) are PRACTICES, not entities with directional verbs\n  // in the literature. Most slot pairs are NOT canonical relationships.\n  // The single ResearchOps-named relationship is the insight-review gate.\n  //\n  // Review_gate → insight: ResearchOps canon. Insights pass through a\n  // review gate before publication to the insight repository\n  // (Hilliard, Tucker, ResearchOps Community guides). Hierarchy because\n  // the gate's job is to approve/reject the insight (gate OWNS the\n  // approval lifecycle). Parallel to `review_gate_approved_via_approval_record`\n  // (existing). Verb \"vets\" captures the validation semantics; reverse\n  // \"vetted_by\" reads as \"this insight was vetted by this review gate\".\n  review_gate_vets_insight: { forward_verb: 'vets', reverse_verb: 'vetted_by', classification: 'hierarchy', source_type: 'review_gate', target_type: 'insight' },\n\n  // ── Research Ops Framework (2 HIGH) ───────────────────────────────────────\n  // ReOps Community's 8 pillars are conceptual groupings, not verb-linked.\n  // Two pairs ARE named in the source literature:\n  //\n  // Research_plan → participant: ResearchOps governance. The plan defines\n  // recruitment criteria. The existing `research_study_enrolls_participant`\n  // is at the study (execution) level. This adds the plan (governance)\n  // level; research plans DECIDE who to recruit before the study runs.\n  // Causal because the plan's recruitment criteria produce the participant\n  // pool. Distinct from the enrollment edge: a plan can recruit and never\n  // run; a study only enrolls participants the plan recruited.\n  research_plan_recruits_participant: { forward_verb: 'recruits', reverse_verb: 'recruited_into', classification: 'causal', source_type: 'research_plan', target_type: 'participant' },\n  // Insight → design_guideline: standard research-to-design handoff. The\n  // insight informs the guideline. Parallel to `insight_inspires_design_concept`,\n  // `insight_inspires_design_question` (existing). Cross-domain because\n  // insight is in User Research and design_guideline is in Design System.\n  // This edge benefits multiple frameworks beyond ReOps (any research →\n  // design system pipeline).\n  insight_informs_design_guideline: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'insight', target_type: 'design_guideline' },\n\n  // ── Usability Test Plan (1 HIGH) ──────────────────────────────────────────\n  // NN/G's test plan format flows: question → recruit → tasks/scenarios →\n  // findings. Most pairs are mediated through research_study (which\n  // enrolls participants, captures observations, produces insights, all\n  // existing). The one direct, named edge is question → task.\n  //\n  // Research_question → task: the question DRIVES task design. In NN/G\n  // methodology \"the research questions generate the tasks we ask participants\n  // to perform\". Causal because the question is what produces the task.\n  // Distinct from `research_question_addressed_by_insight` (existing,\n  // question ← insight closure). The task uses the canonical `task` entity\n  // (sprint-task / user-task share semantics: \"thing to do\").\n  research_question_generates_task: { forward_verb: 'generates', reverse_verb: 'generated_by', classification: 'causal', source_type: 'research_question', target_type: 'task' },\n\n  // ── Behavioural Cohort Analysis (3 HIGH) ──────────────────────────────────\n  // Amplitude/Mixpanel canon: cohorts are DEFINED by behavior, MEASURED by\n  // metrics, COMPARED to find drivers. The three direct edges are all\n  // explicitly named in the source product-analytics literature.\n  //\n  // Cohort → behavioral_segment: Amplitude's \"Define a behavioural cohort\"\n  // workflow literally selects a behavioral_segment as the cohort criterion.\n  // The cohort entity is time-windowed group (signup date, retention\n  // metrics); behavioral_segment is the qualifying behavior. Semantic\n  // because the behavior doesn't CAUSE the cohort (the analyst selects it);\n  // it DEFINES which users qualify. Parallel to `cohort_represents_persona`\n  // (existing); both express \"what this cohort is\".\n  cohort_defined_by_behavioral_segment: { forward_verb: 'defined_by', reverse_verb: 'defines', classification: 'semantic', source_type: 'cohort', target_type: 'behavioral_segment' },\n  // Cohort → metric: cohort outcomes ARE metrics (retention_day_7,\n  // retention_day_30 are explicit properties on the cohort entity). The\n  // existing schema bakes this in; the edge makes it queryable as a graph\n  // relationship. Causal because the cohort's existence produces the\n  // metric reading (a metric exists in the abstract; the cohort produces a\n  // specific value). Mirrors `revenue_stream_measured_by_metric`.\n  cohort_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'causal', source_type: 'cohort', target_type: 'metric' },\n  // Behavioral_segment → metric: segments are evaluated against metric\n  // thresholds (the standard Amplitude/Mixpanel pattern). Causal because\n  // the metric reading distinguishes segment membership. Parallel to\n  // `cohort_measured_by_metric` above; both extend\n  // `metric_segmented_by_persona` (existing) into the cohort/segment world.\n  behavioral_segment_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'causal', source_type: 'behavioral_segment', target_type: 'metric' },\n\n  // ── Customer Advisory Board (3 HIGH) ──────────────────────────────────────\n  // B2B CAB canon (Stettler, Moore, Pragmatic Marketing playbooks) names\n  // three direct relationships: CABs CONVENE ceremonies, SURFACE research\n  // questions (the agenda), and OUTPUT initiatives (the action commitments).\n  //\n  // User_advisory_board → ceremony: CABs convene as quarterly meetings;\n  // each meeting is a ceremony entity. Hierarchy because the CAB OWNS\n  // its ceremonies (the board defines the cadence; ceremonies belong to\n  // it). Extends ceremony's hierarchy parents (previously only `team`).\n  // Verb \"convenes_as\" captures the meeting cadence semantic.\n  user_advisory_board_convenes_as_ceremony: { forward_verb: 'convenes_as', reverse_verb: 'convenes', classification: 'hierarchy', source_type: 'user_advisory_board', target_type: 'ceremony' },\n  // User_advisory_board → research_question: CAB agendas are structured\n  // around research questions the company wants strategic input on\n  // (Stettler's CAB playbook explicit pattern: \"prepare 3-5 strategic\n  // questions for the quarterly meeting\"). Cross-domain because the CAB\n  // is a feedback program and research_question is in UX Research. Verb\n  // \"surfaces\" mirrors `insight_surfaces_opportunity`.\n  user_advisory_board_surfaces_research_question: { forward_verb: 'surfaces', reverse_verb: 'surfaced_by', classification: 'cross-domain', source_type: 'user_advisory_board', target_type: 'research_question' },\n  // User_advisory_board → initiative: CAB outputs are commitments and\n  // direction for product initiatives, the explicit \"outcomes\" of any\n  // well-run CAB (Stettler, Moore). Cross-domain because CAB is in\n  // Feedback/VoC and initiative is in Strategy. Verb \"shapes\" captures\n  // the influence-not-ownership semantic: CABs don't OWN initiatives,\n  // they shape them.\n  user_advisory_board_shapes_initiative: { forward_verb: 'shapes', reverse_verb: 'shaped_by', classification: 'cross-domain', source_type: 'user_advisory_board', target_type: 'initiative' },\n\n  // ── Customer Effort Score (3 HIGH) ────────────────────────────────────────\n  // Dixon/Toman/DeLisi's \"Effortless Experience\" canon: CES is a metric\n  // collected via feedback programs, segments customers by effort score,\n  // surfaces themes for service improvement. Three direct edges are named\n  // in the source literature.\n  //\n  // Feedback_program → metric: CES, NPS, CSAT are all metrics collected\n  // via feedback programs. Causal because the program's execution\n  // produces the metric reading. Parallel to `feedback_program_runs_nps_campaign`\n  // (existing) but at the metric level (the campaign is the runtime; the\n  // metric is the recorded value).\n  feedback_program_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'causal', source_type: 'feedback_program', target_type: 'metric' },\n  // Metric → behavioral_segment: parallel to existing\n  // `metric_segmented_by_persona` (cross-domain): a metric's distribution\n  // segments users into behavioral groups (high-effort vs low-effort in\n  // CES; promoters/passives/detractors in NPS). Cross-domain because\n  // metric is in Strategy/Analytics and behavioral_segment is in Growth.\n  metric_segmented_by_behavioral_segment: { forward_verb: 'segmented_by', reverse_verb: 'segments', classification: 'cross-domain', source_type: 'metric', target_type: 'behavioral_segment' },\n  // Feedback_theme → insight: themes aggregate raw feedback into patterns;\n  // patterns ARE insights. Parallel to `observation_yields_insight` and\n  // `affinity_cluster_synthesises_insight`; feedback_theme is the\n  // feedback-domain analogue. Cross-domain because feedback_theme is in\n  // Feedback/VoC and insight is in UX Research.\n  feedback_theme_surfaces_insight: { forward_verb: 'surfaces', reverse_verb: 'surfaced_by', classification: 'cross-domain', source_type: 'feedback_theme', target_type: 'insight' },\n\n  // ── Cross-framework canonical research edges (2 HIGH) ─────────────────────\n  // Agent V (Part 2b) flagged research-discovery edges as broadly useful\n  // beyond any single framework. Two qualify here:\n  //\n  // Insight → quote: standard research synthesis canon. Insights are\n  // EVIDENCED by quotes. The catalog has `observation_evidenced_by_quote`\n  // (observation ← quote) but not the insight ← quote evidencing pattern.\n  // Hierarchy because the quote is structurally subordinate (the insight\n  // owns its evidencing quotes). Useful across usability-test-plan,\n  // research-democratisation, research-ops-framework, and any future\n  // research-synthesis pipeline.\n  insight_evidenced_by_quote: { forward_verb: 'evidenced_by', reverse_verb: 'evidences', classification: 'hierarchy', source_type: 'insight', target_type: 'quote' },\n  // Journey_step → observation: CX research canon. Journey steps are\n  // INSTRUMENTED with observations (think-aloud notes, behavioural events,\n  // pain-point captures at each step). Cross-domain because journey_step\n  // is in Experience Design and observation is in UX Research. Parallel\n  // to `journey_step_reveals_need` (existing); both express \"what\n  // research surfaces at this step\". Useful for any journey-based\n  // research method (CX mapping, service blueprint, behavioural cohort).\n  journey_step_yields_observation: { forward_verb: 'yields', reverse_verb: 'yielded_in', classification: 'cross-domain', source_type: 'journey_step', target_type: 'observation' },\n\n  // ── Part 11: F6 (UPG-672) dead-end & missing-bridge pass ────────────────────\n  // P-A (scored / synthesis / verdict leaves with 0 outbound) + P-D (missing\n  // forward bridges) from the 36-domain wiring audit. Every edge below closes a\n  // confirmed dead-end or missing direction. Naming respects the F2 prefix gate\n  // (key begins with its `source_type` as a whole token) and the F3 dup gate (no\n  // source→target pair already in the catalog). Verified against the catalog at\n  // build time; see the F6 commit body for the audit ledger references.\n\n  // ── F6: Priority 1 — both-sides-verified cross-domain bridges ──────────────\n  // data_classification ↔ privacy_policy (security SEC-3/L5 + legal). The\n  // classification leaf reached only data_source; it could not reach the policy\n  // that governs how it must be handled. A privacy_policy GOVERNS a data\n  // classification (sets retention / handling rules for that sensitivity tier).\n  data_classification_governed_by_privacy_policy: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'cross-domain', source_type: 'data_classification', target_type: 'privacy_policy' },\n  // design_component → a11y conformance (design_system DS-3 + accessibility A).\n  // The whole conformance DIRECTION was missing: a11y_issue → design_component\n  // existed (defect points back), but no component → standard/guideline link\n  // expressing \"this component CONFORMS TO this rule\". Both the testable\n  // standard and the human-readable guideline are valid conformance targets.\n  design_component_conforms_to_a11y_standard: { forward_verb: 'conforms_to', reverse_verb: 'governs_conformance_of', classification: 'cross-domain', source_type: 'design_component', target_type: 'a11y_standard' },\n  design_component_conforms_to_a11y_guideline: { forward_verb: 'conforms_to', reverse_verb: 'governs_conformance_of', classification: 'cross-domain', source_type: 'design_component', target_type: 'a11y_guideline' },\n  // feature_request → feature ship-closure (feedback + product_spec). A request\n  // could reach an opportunity but never the feature that ships it, so the loop\n  // from \"user asked\" to \"we built it\" had no closing edge. A feature_request\n  // BECOMES a feature when the team commits to building it.\n  feature_request_becomes_feature: { forward_verb: 'becomes', reverse_verb: 'originated_from', classification: 'cross-domain', source_type: 'feature_request', target_type: 'feature' },\n  // objective → outcome (OKR spine). objective reached key_result and metric but\n  // not the outcome it exists to move; the strategic spine was severed at its\n  // anchor (0 outbound to outcome). An objective ADVANCES an outcome. Intra-\n  // domain (both in strategy) and directional → causal.\n  objective_advances_outcome: { forward_verb: 'advances', reverse_verb: 'advanced_by', classification: 'causal', source_type: 'objective', target_type: 'outcome', cross_product_eligible: true },\n\n  // ── F6: Priority 2 — scored / synthesis / verdict dead-end leaves (P-A) ─────\n  // desired_outcome (Ulwick-scored: importance × satisfaction) had 0 outbound —\n  // the scores could not flow anywhere. An under-served desired_outcome REVEALS\n  // an opportunity, and is QUANTIFIED BY the metric that tracks its satisfaction.\n  desired_outcome_reveals_opportunity: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'desired_outcome', target_type: 'opportunity' },\n  desired_outcome_quantified_by_metric: { forward_verb: 'quantified_by', reverse_verb: 'quantifies', classification: 'cross-domain', source_type: 'desired_outcome', target_type: 'metric' },\n  // feasibility_study + design_sprint: discovery VERDICTS with 0 outbound — they\n  // could not reach the decision, solution, or learning they exist to produce.\n  // A study/sprint INFORMS a decision, RECOMMENDS a solution, and PRODUCES a\n  // learning. solution is intra-discovery (semantic); decision (strategy) and\n  // learning (validation) are cross-domain.\n  feasibility_study_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'feasibility_study', target_type: 'decision' },\n  feasibility_study_recommends_solution: { forward_verb: 'recommends', reverse_verb: 'recommended_by', classification: 'semantic', source_type: 'feasibility_study', target_type: 'solution' },\n  feasibility_study_produces_learning: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'cross-domain', source_type: 'feasibility_study', target_type: 'learning' },\n  design_sprint_informs_decision: { forward_verb: 'informs', reverse_verb: 'informed_by', classification: 'cross-domain', source_type: 'design_sprint', target_type: 'decision' },\n  design_sprint_recommends_solution: { forward_verb: 'recommends', reverse_verb: 'recommended_by', classification: 'semantic', source_type: 'design_sprint', target_type: 'solution' },\n  design_sprint_produces_learning: { forward_verb: 'produces', reverse_verb: 'produced_by', classification: 'cross-domain', source_type: 'design_sprint', target_type: 'learning' },\n  // affinity_cluster → observation (user_research). A cluster synthesised an\n  // insight but could not OWN the raw observations it groups; the cluster's\n  // membership was unrepresentable. Intra-domain ownership → hierarchy.\n  affinity_cluster_groups_observation: { forward_verb: 'groups', reverse_verb: 'grouped_in', classification: 'hierarchy', source_type: 'affinity_cluster', target_type: 'observation' },\n  // feedback_theme → opportunity (feedback). A theme validated needs and\n  // surfaced insights but could not point at the opportunity it implies — the\n  // theme could not become actionable discovery input.\n  feedback_theme_reveals_opportunity: { forward_verb: 'reveals', reverse_verb: 'revealed_by', classification: 'cross-domain', source_type: 'feedback_theme', target_type: 'opportunity' },\n  // competitor_feature → capability (market_intelligence). A competitor feature\n  // inspired our solution/feature but could not map to the capability it\n  // demonstrates — competitive capability benchmarking was unrepresentable.\n  competitor_feature_benchmarks_capability: { forward_verb: 'benchmarks', reverse_verb: 'benchmarked_by', classification: 'cross-domain', source_type: 'competitor_feature', target_type: 'capability' },\n  // switching_cost → competitor (user). A switching cost is the friction of\n  // leaving an incumbent, but the leaf had 0 outbound — it could not name the\n  // competitor it locks the user into. It LOCKS IN a competitor.\n  switching_cost_locks_in_competitor: { forward_verb: 'locks_in', reverse_verb: 'locked_in_by', classification: 'cross-domain', source_type: 'switching_cost', target_type: 'competitor' },\n\n  // ── F6: region tail — confirmed dead-end leaves across remaining domains ────\n  // test_result (testing) had 0 outbound — a failing result could not file the\n  // defect it found. A test_result REPORTS a bug.\n  test_result_reports_bug: { forward_verb: 'reports', reverse_verb: 'reported_by', classification: 'cross-domain', source_type: 'test_result', target_type: 'bug' },\n  // content_piece → social_post (content → marketing). Content reached messaging\n  // and campaigns but not the social post it is repurposed into — the atomisation\n  // step had no edge.\n  content_piece_repurposed_as_social_post: { forward_verb: 'repurposed_as', reverse_verb: 'repurposed_from', classification: 'cross-domain', source_type: 'content_piece', target_type: 'social_post' },\n  // translation_key (localisation) had 0 outbound — it could neither reach the\n  // content it localises nor the locale it targets. Both bridges close the leaf.\n  // translation_key → content_piece is cross-domain; → locale is intra-domain.\n  translation_key_localises_content_piece: { forward_verb: 'localises', reverse_verb: 'localised_by', classification: 'cross-domain', source_type: 'translation_key', target_type: 'content_piece' },\n  translation_key_targets_locale: { forward_verb: 'targets', reverse_verb: 'targeted_by', classification: 'semantic', source_type: 'translation_key', target_type: 'locale' },\n  // partner_revenue_share → revenue_stream (ecosystem → business_model). The\n  // share governed a partner tier but never fed the revenue stream it\n  // contributes to — partner economics could not roll up to the model.\n  partner_revenue_share_feeds_revenue_stream: { forward_verb: 'feeds', reverse_verb: 'fed_by', classification: 'cross-domain', source_type: 'partner_revenue_share', target_type: 'revenue_stream' },\n  // retrospective (team_org) had 0 outbound — its outputs (learnings, decisions/\n  // action items) could not leave the ceremony. A retrospective PRODUCES a\n  // learning and YIELDS a decision. Both targets cross-domain.\n  retrospective_produces_learning: { forward_verb: 'produces', reverse_verb: 'produced_in', classification: 'cross-domain', source_type: 'retrospective', target_type: 'learning' },\n  retrospective_yields_decision: { forward_verb: 'yields', reverse_verb: 'decided_in', classification: 'cross-domain', source_type: 'retrospective', target_type: 'decision' },\n  // status_report → milestone (program_mgmt). A report had 0 outbound; it could\n  // not name the milestone whose status it reports. Intra-domain → semantic.\n  status_report_reports_on_milestone: { forward_verb: 'reports_on', reverse_verb: 'reported_in', classification: 'semantic', source_type: 'status_report', target_type: 'milestone' },\n  // quote_document → deal (sales). A quote had 0 outbound; it could not advance\n  // the deal it prices. Intra-domain and directional → causal.\n  quote_document_advances_deal: { forward_verb: 'advances', reverse_verb: 'advanced_by', classification: 'causal', source_type: 'quote_document', target_type: 'deal' },\n  // data_quality_rule → data_source (data_analytics). A quality rule had 0\n  // outbound; it could not name the source it governs. Intra-domain → semantic.\n  data_quality_rule_governs_data_source: { forward_verb: 'governs', reverse_verb: 'governed_by', classification: 'semantic', source_type: 'data_quality_rule', target_type: 'data_source' },\n  // press_release → launch (marketing → go_to_market). A press release had 0\n  // outbound; it could not name the launch it announces.\n  press_release_announces_launch: { forward_verb: 'announces', reverse_verb: 'announced_by', classification: 'cross-domain', source_type: 'press_release', target_type: 'launch' },\n\n  // ── Foundations (0.9.12): registry-internal relationships between canonical\n  //    specifications and primitives. Product-to-foundation links (implements,\n  //    exposes, conforms_to) are portfolio cross-edges, not catalog edges.\n  specification_extends_specification: { forward_verb: 'extends', reverse_verb: 'extended_by', classification: 'hierarchy', source_type: 'specification', target_type: 'specification' },\n  specification_competes_with_specification: { forward_verb: 'competes_with', reverse_verb: 'competes_with', classification: 'semantic', source_type: 'specification', target_type: 'specification' },\n  primitive_defined_by_specification: { forward_verb: 'defined_by', reverse_verb: 'defines', classification: 'semantic', source_type: 'primitive', target_type: 'specification' },\n  primitive_composes_primitive: { forward_verb: 'composes', reverse_verb: 'composed_by', classification: 'hierarchy', source_type: 'primitive', target_type: 'primitive' },\n  // A canonical specification defines the operating lifecycle (mirrors primitive_defined_by_specification),\n  // so the lifecycle is governed rather than a standalone root (0.12.1 refinement).\n  operating_lifecycle_defined_by_specification: { forward_verb: 'defined_by', reverse_verb: 'defines', classification: 'semantic', source_type: 'operating_lifecycle', target_type: 'specification' },\n  operating_lifecycle_contains_operating_stage: { forward_verb: 'contains', reverse_verb: 'belongs_to', classification: 'hierarchy', source_type: 'operating_lifecycle', target_type: 'operating_stage' },\n  // Conformance (0.33.0, RE-OPENED). 0.33.0 planned to mint\n  // product_conforms_to_specification and feature_conforms_to_specification here.\n  // It does not, and the reason is a fact the design missed: the product-to-\n  // foundation links are NOT absent, they live one tier up. See\n  // UPG_CROSS_ONLY_EDGE_TYPES in shapes/document.ts, which has carried\n  // `product_implements_specification`, `product_exposes_specification` and\n  // `feature_conforms_to_specification` as portfolio-native cross-product edges\n  // since 0.9.12, exactly as the section comment above says. The tiers are\n  // disjoint by construction, so minting the same key here is a hard collision,\n  // and minting only the product half would split one question across two tiers\n  // under two near-synonymous names.\n  //\n  // What survives is the real gap, stated here rather than closed: a\n  // `specification` node held INSIDE a single product graph, with no portfolio,\n  // has no conformance edge, because the cross-only tier needs a registry target.\n  // Whether that case is closed by widening the tier or by a catalog edge under a\n  // non-colliding key is a design question and is banked, with its condition the\n  // first single-product graph that models a specification it conforms to.\n  // Stewardship: a registry specification is governed by a (registry-hostable) organization (0.9.13).\n  specification_governed_by_organization: { forward_verb: 'governed_by', reverse_verb: 'governs', classification: 'semantic', source_type: 'specification', target_type: 'organization' },\n  // Operating-lifecycle cross-edges (0.11.6): a product's journey phase realises a canonical\n  // operating stage (the cross-surface join key); a stage is measured by a rollup metric (loop close).\n  journey_phase_realises_operating_stage: { forward_verb: 'realises', reverse_verb: 'realised_by', classification: 'cross-domain', source_type: 'journey_phase', target_type: 'operating_stage', cross_product_eligible: true },\n  operating_stage_measured_by_metric: { forward_verb: 'measured_by', reverse_verb: 'measures', classification: 'cross-domain', source_type: 'operating_stage', target_type: 'metric' },\n\n  // ── OKR planning coverage (0.17.4) ──────────────────────────────────────────\n  // Reconciling the strategy graph against a live planning doc surfaced texture\n  // the objective — the node every OKR doc organises itself around — could not\n  // reach: cross-team dependencies and deferred (out-of-scope) work.\n\n  // objective ↔ dependency. Every OKR in the source doc carries a dependency\n  // table (\"which other team's work this depends on\"). `dependency` (team_org)\n  // already carries dependency_type / criticality / target_date; it was\n  // reachable only from `team`. An objective DEPENDS ON a dependency; the\n  // dependency BLOCKS the objective (explicit mirror, not left implicit).\n  // Cross-domain, not hierarchy: a dependency is parented under its owning team,\n  // so an objective references it laterally rather than containing it. Both are\n  // cross_product_eligible — a Studio objective can depend on a dependency owned\n  // by another team's graph within the portfolio (0.17.3 locked predicate).\n  objective_depends_on_dependency: { forward_verb: 'depends_on', reverse_verb: 'dependency_of', classification: 'cross-domain', source_type: 'objective', target_type: 'dependency', cross_product_eligible: true },\n  dependency_blocks_objective: { forward_verb: 'blocks', reverse_verb: 'blocked_by', classification: 'cross-domain', source_type: 'dependency', target_type: 'objective', cross_product_eligible: true },\n  // The RESOLVING side, distinct from the two blocking edges above.\n  // `dependency_blocks_objective` names an objective the dependency holds up (the\n  // waiting side); this names the objective whose completion CLEARS the\n  // dependency (the providing side). In a portfolio, a dependency in one\n  // product's graph points at the objective in another product's graph that\n  // delivers the awaited work, instead of recording it only in the free-text\n  // `resolution` property. cross_product_eligible — the resolving objective\n  // lives in another product's graph.\n  dependency_resolved_by_objective: { forward_verb: 'resolved_by', reverse_verb: 'resolves', classification: 'cross-domain', source_type: 'dependency', target_type: 'objective', cross_product_eligible: true },\n\n  // objective / initiative → strategic_question. A planning doc's \"Risks & Open\n  // Questions\" section names unresolved coordination questions the plan is\n  // exposed to (who owns a capability across teams after a reorg). The\n  // strategy-domain sibling of research_question / design_question. The question\n  // is raised under (contained by) the objective or initiative that surfaces it,\n  // so hierarchy — mirroring initiative_assumes_assumption. Within-graph: the\n  // question node is authored alongside its objective, so NOT\n  // cross_product_eligible (the cross-team nature lives in the question text, not\n  // in a cross-graph edge).\n  objective_raises_strategic_question: { forward_verb: 'raises', reverse_verb: 'raised_by', classification: 'hierarchy', source_type: 'objective', target_type: 'strategic_question' },\n  initiative_raises_strategic_question: { forward_verb: 'raises', reverse_verb: 'raised_by', classification: 'hierarchy', source_type: 'initiative', target_type: 'strategic_question' },\n\n  // objective → feature / capability (the defer / out-of-scope edge). Every OKR\n  // in the source doc carries an explicit \"Out of scope\" list, load-bearing for\n  // keeping a quarter from silently expanding (localization deferred to Q4,\n  // another team's feature work parked). Modelled as an edge to the real feature\n  // or capability parked for later, not a scalar exclusion string, so the parked\n  // work stays queryable and connected. The `deferred_to` edge property carries\n  // the temporal target. feature is product_spec (cross-domain); capability is\n  // intra-strategy (semantic). Both cross_product_eligible: deferring another\n  // product's feature or capability, authored in a different graph within the\n  // portfolio, fits the 0.17.3 locked predicate.\n  objective_defers_feature: { forward_verb: 'defers', reverse_verb: 'deferred_by', classification: 'cross-domain', source_type: 'objective', target_type: 'feature', carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true },\n  objective_defers_capability: { forward_verb: 'defers', reverse_verb: 'deferred_by', classification: 'semantic', source_type: 'objective', target_type: 'capability', carries_properties: true, property_schema: DEFER_EDGE_PROPERTY_SCHEMA, cross_product_eligible: true, deliberate_only: true },\n\n  // ── Enterprise GTM coordination batch (0.24.0, Track 1 Wave A) ───────────────\n  // The catalog modelled each go-to-market department's nouns but almost none of\n  // the handoffs between them, and the enterprise motion IS the handoffs (audit\n  // `2026-07-16-enterprise-gtm-coverage-audit.md`, §3). Sixteen additive edges\n  // wire the buying committee onto the deal, give the enablement lattice a demand\n  // side, close the pre-sale win/loss LEARN loop, make post-sale account-scoped,\n  // and complete the audience-projection lattice. None are hierarchy — every one\n  // is a lateral coordination link — so UPG_VALID_CHILDREN is untouched. Verbs\n  // are precedent-matched (cited per row); classification per the standard\n  // taxonomy. Two edges are portfolio-crossing by construction (a deal in a\n  // field-ops graph blocked by a feature in a product graph; a win/loss study in\n  // a research graph analysing a deal in another) → cross_product_eligible at\n  // mint, one line rather than a later migration (audit §7-addendum decision 6).\n\n  // Buying committee (F2). A contact was reachable only via account_contains_contact;\n  // it could not attach to the deal it influences. This is the substrate of every\n  // qualification framework (MEDDICC/SPICED) and of multi-threading. Semantic, not\n  // hierarchy: the contact is parented under its account (account_contains_contact),\n  // so a deal references it laterally, not by containment; and semantic, not\n  // cross-domain, because deal and contact are both in the sales domain (T1.7\n  // guardrail: a within-domain edge is not cross-domain). @example deal \"Northwind\n  // platform expansion\" involves contact \"VP Engineering\" (buying_role: 'economic_buyer').\n  deal_involves_contact: { forward_verb: 'involves', reverse_verb: 'involved_in', classification: 'semantic', source_type: 'deal', target_type: 'contact' },\n  // Enablement demand side (F3). GTM's objection→rebuttal→proof_point chain had\n  // supply but nothing consuming it in a deal context. Mirrors the positioning\n  // precedent (positioning_challenged_by_objection). @example deal \"Northwind\n  // platform expansion\" challenged_by objection \"no SOC 2 report yet\".\n  deal_challenged_by_objection: { forward_verb: 'challenged_by', reverse_verb: 'challenges', classification: 'cross-domain', source_type: 'deal', target_type: 'objection' },\n  // Enablement deployed in context (F3). Which battlecard was armed on which deal.\n  // Mirrors gtm_strategy_arms_with_competitive_battle_card. @example deal armed_with\n  // competitive_battle_card \"vs. Meridian Cloud\".\n  deal_armed_with_competitive_battle_card: { forward_verb: 'armed_with', reverse_verb: 'arms', classification: 'cross-domain', source_type: 'deal', target_type: 'competitive_battle_card' },\n  // Loss cause (F3). Gives competitive_battle_card.win_rate its derivation path —\n  // nothing in the graph could previously compute it. Causal (a directional\n  // outcome), mirroring lead_becomes_account. @example deal \"Sterling Data Systems\n  // renewal\" lost_to competitor \"Meridian Cloud\".\n  deal_lost_to_competitor: { forward_verb: 'lost_to', reverse_verb: 'won', classification: 'causal', source_type: 'deal', target_type: 'competitor' },\n  // Close mechanism (F4). MSA/SOW/order form reachable from the deal; contract\n  // previously bound only legal_entity and partnership. Mirrors\n  // deal_quoted_via_quote_document. @example deal closed_via contract \"Northwind MSA\".\n  deal_closed_via_contract: { forward_verb: 'closed_via', reverse_verb: 'closes', classification: 'cross-domain', source_type: 'deal', target_type: 'contract' },\n  // Pipeline blocker (F5). \"Which roadmap items unblock how much pipeline\"; plugs\n  // into change_blast_radius. Mirrors epic_affected_by_bug. cross_product_eligible:\n  // the deal lives in the field-ops graph, the blocking feature in the product\n  // graph. @example deal blocked_by feature \"SAML SSO\".\n  deal_blocked_by_feature: { forward_verb: 'blocked_by', reverse_verb: 'blocks', classification: 'cross-domain', source_type: 'deal', target_type: 'feature', cross_product_eligible: true },\n  // Win/loss LEARN loop (F3). Win/loss analysis is a research genre, not a new\n  // type — a research_study analyses the deal. Closes the pre-sale learning loop\n  // (the post-sale one already existed via support_ticket_reveals_need). Mirrors\n  // proof_point_derived_from_insight's provenance shape. cross_product_eligible:\n  // the study may live in a research graph distinct from the deal's field-ops\n  // graph. @example research_study \"Q3 competitive win/loss\" analyzes deal\n  // \"Sterling Data Systems renewal\".\n  research_study_analyzes_deal: { forward_verb: 'analyzes', reverse_verb: 'analyzed_by', classification: 'cross-domain', source_type: 'research_study', target_type: 'deal', cross_product_eligible: true },\n  // Account-scoped sensing (F5). Nearly every CS edge hung off product; only one\n  // scoped anything to an account. Mirrors product_supports_via_support_ticket.\n  // @example account \"Northwind Logistics\" raises support_ticket \"onboarding SSO\n  // blocker\".\n  account_raises_support_ticket: { forward_verb: 'raises', reverse_verb: 'raised_by', classification: 'cross-domain', source_type: 'account', target_type: 'support_ticket' },\n  // Account health (F5). Mirrors product_health_scored_via_customer_health_score.\n  // @example account health_scored_via customer_health_score \"Northwind Q3 health\".\n  account_health_scored_via_customer_health_score: { forward_verb: 'health_scored_via', reverse_verb: 'scores', classification: 'cross-domain', source_type: 'account', target_type: 'customer_health_score' },\n  // Account churn (F5). Churn lands on the account, not just the product. Mirrors\n  // product_loses_because_churn_reason. @example account lost_because churn_reason\n  // \"switched to incumbent suite\".\n  account_lost_because_churn_reason: { forward_verb: 'lost_because', reverse_verb: 'causes_churn_for', classification: 'cross-domain', source_type: 'account', target_type: 'churn_reason' },\n  // Onboarding / implementation (F5). Reuses the Program Management machinery\n  // (project/milestone/deliverable/status_report) for enterprise onboarding.\n  // Mirrors the operate-a-thing-via-a-plan shape of product_operated_via_playbook.\n  // @example account implements_via project \"Northwind rollout\".\n  account_implements_via_project: { forward_verb: 'implements_via', reverse_verb: 'implements', classification: 'cross-domain', source_type: 'account', target_type: 'project' },\n  // Renewal object-path (F5). A renewal is a deal of deal_type 'renewal'; this\n  // completes the lead→account→deal→subscription→deal cycle. Causal (a directional\n  // renewal event), mirroring quote_document_advances_deal. @example subscription\n  // \"Northwind annual\" renews_via deal \"Northwind FY27 renewal\".\n  subscription_renews_via_deal: { forward_verb: 'renews_via', reverse_verb: 'renews', classification: 'causal', source_type: 'subscription', target_type: 'deal' },\n  // Enterprise early access (F5, rider R1). An account participates in a beta\n  // program. Mirrors product_runs_beta_program's noun. @example account\n  // participates_in beta_program \"SSO private beta\".\n  account_participates_in_beta_program: { forward_verb: 'participates_in', reverse_verb: 'has_participant', classification: 'cross-domain', source_type: 'account', target_type: 'beta_program' },\n  // Security gate (F4, rider R2). The security questionnaire/review as a deal gate,\n  // reusing the Security noun rather than minting security_questionnaire. Mirrors\n  // service_level_agreement_covers_account's account↔security cross-domain shape.\n  // @example deal gated_by security_review \"Northwind vendor security assessment\".\n  deal_gated_by_security_review: { forward_verb: 'gated_by', reverse_verb: 'gates', classification: 'cross-domain', source_type: 'deal', target_type: 'security_review' },\n  // Audience-projection subject axis (Ruling 4, A15). messaging's only subject edge\n  // was positioning_communicated_via_messaging — messaging could not be ABOUT a\n  // feature, so audience-scoped feature projections were unexpressable at the root.\n  // Mirrors the positioning precedent. The rendered projection is NOT stored (views\n  // philosophy); this edge stores the atom the lens queries. @example feature \"SAML\n  // SSO\" communicated_via messaging \"SSO beta enablement one-pager\".\n  feature_communicated_via_messaging: { forward_verb: 'communicated_via', reverse_verb: 'communicates', classification: 'cross-domain', source_type: 'feature', target_type: 'messaging' },\n  // Launch coordination seam (Ruling 4, A16). launch had edges to\n  // release/feature/channel/campaign/metric/messaging but none to Program\n  // Management — the GTM readiness checklist (who builds the demo env, trains the\n  // SEs, by when) had no home. Reuses project/milestone/deliverable, the same move\n  // as account_implements_via_project. @example launch \"SSO GA\" coordinated_via\n  // project \"SSO launch readiness\".\n  launch_coordinated_via_project: { forward_verb: 'coordinated_via', reverse_verb: 'coordinates', classification: 'cross-domain', source_type: 'launch', target_type: 'project' },\n\n} satisfies Record<string, UPGEdgeDefinition>\n\n// ─── Polymorphic edge registry ──────────────────────────────────────\n\n/** The `UPGEdgeType` union derived from the registry above. Declared here (not\n *  in `shapes/edges.ts`) so the polymorphic list below can reference it\n *  without creating a cyclic import. */\ntype _UPGEdgeTypeLocal = keyof typeof UPG_EDGE_CATALOG\n\n// ─── Cross-product-eligible edges (derived) ─────────────────────────────────\n\n/**\n * The dual-registered cross-product edges, as a value-filtered union derived from\n * the `cross_product_eligible` flag (0.17.3). Because `UPG_EDGE_CATALOG` is declared\n * with `satisfies`, the literal `true` is preserved, so this conditional-type filter\n * stays exact as edges are flagged — flag one catalog entry and it appears here with\n * no other edit. This is the dual-registered half of `UPGCrossEdgeType`; the\n * portfolio-native half (edges with no within-graph catalog entry) is the explicit\n * `UPG_CROSS_ONLY_EDGE_TYPES` in `shapes/document.ts`.\n */\nexport type CrossProductEligibleEdgeType = {\n  [K in keyof typeof UPG_EDGE_CATALOG]: typeof UPG_EDGE_CATALOG[K] extends { cross_product_eligible: true } ? K : never\n}[keyof typeof UPG_EDGE_CATALOG]\n\n/**\n * Runtime list of catalog edges flagged `cross_product_eligible`, derived from the\n * catalog in declaration order. The runtime mirror of `CrossProductEligibleEdgeType`,\n * composed with `UPG_CROSS_ONLY_EDGE_TYPES` to build `UPG_CROSS_EDGE_TYPES`.\n */\nexport const UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES: readonly CrossProductEligibleEdgeType[] =\n  (Object.keys(UPG_EDGE_CATALOG) as _UPGEdgeTypeLocal[]).filter(\n    (k): k is CrossProductEligibleEdgeType =>\n      (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[k].cross_product_eligible === true,\n  )\n\n/**\n * True if this catalog edge is dual-registered as cross-product-eligible: a\n * within-graph edge whose endpoints may also live in different graphs within a\n * portfolio (0.17.3). Accepts any string for ergonomic call sites.\n *\n * @example\n * isCrossProductEligible('strategic_theme_contains_objective') // → true\n * isCrossProductEligible('feature_area_contains_feature')      // → false\n */\nexport function isCrossProductEligible(type: string): boolean {\n  const def = (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[type]\n  return def?.cross_product_eligible === true\n}\n\n// ─── Deliberate-only edges (derived) ────────────────────────────────────────\n\n/**\n * The deliberate-only edges, as a value-filtered union derived from the\n * `deliberate_only` flag (0.17.4). Same `satisfies`-preserved pattern as\n * `CrossProductEligibleEdgeType`: flag one catalog entry and it appears here with\n * no other edit. These edges must never be inferred from a generic parent nesting;\n * generic-inference chokepoints skip them.\n */\nexport type DeliberateOnlyEdgeType = {\n  [K in keyof typeof UPG_EDGE_CATALOG]: typeof UPG_EDGE_CATALOG[K] extends { deliberate_only: true } ? K : never\n}[keyof typeof UPG_EDGE_CATALOG]\n\n/**\n * Runtime list of catalog edges flagged `deliberate_only`, derived from the catalog\n * in declaration order. The single source of truth the SDK's auto-nest inference and\n * the import adapters' parentage resolvers consume, so a deliberate-only edge\n * self-excludes from every generic-inference path with one flag.\n */\nexport const UPG_DELIBERATE_ONLY_EDGE_TYPES: readonly DeliberateOnlyEdgeType[] =\n  (Object.keys(UPG_EDGE_CATALOG) as _UPGEdgeTypeLocal[]).filter(\n    (k): k is DeliberateOnlyEdgeType =>\n      (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[k].deliberate_only === true,\n  )\n\n/**\n * True if this catalog edge is deliberate-only: it must be authored explicitly and\n * is never inferred from a generic parent nesting (0.17.4). Accepts any string for\n * ergonomic call sites.\n *\n * @example\n * isDeliberateOnlyEdge('objective_defers_feature')   // → true\n * isDeliberateOnlyEdge('feature_area_contains_feature') // → false\n */\nexport function isDeliberateOnlyEdge(type: string): boolean {\n  const def = (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[type]\n  return def?.deliberate_only === true\n}\n\n/**\n * Canonical allow-list of edges that use the `'node'` wildcard endpoint.\n *\n * Sixteen semantic families are sanctioned. The count and the partition are\n * asserted in `spec-integrity.test.ts`, so this list cannot silently fall out\n * of step with the array below the way it did between 0.28.0 and 0.31.0:\n *\n * 1. **Universal semantic verbs**: any node can inform / constrain / inspire\n *    any other node. The meaning is deliberately abstract; consumers render\n *    them as plain relational signals.\n * 2. **Decision-to-anything**: a decision can influence, be constrained by,\n *    or produce any kind of node. Decisions cut across domains; binding the\n *    target would force a combinatorial explosion.\n * 3. **Universal ownership**: any node can be owned by a team, role,\n *    stakeholder, department, or person. Ownership is not per-entity-type.\n * 4. **Universal architecture references**: any node can belong to a bounded\n *    context (DDD building blocks span the type system).\n * 5. **Framework exercises**: a framework_exercise can include any entity type\n *    it scores. The technique is type-agnostic, so binding the target would\n *    re-weld frameworks to one entity type — the limitation this edge removes.\n * 6. **Universal classification**: any node can be classified against a\n *    classification_value. Classification schemes are type-agnostic.\n * 7. **Work-item issue links**: blocks/relates/duplicates spans the work-item\n *    set {feature, epic, user_story, task, bug} — endpoint-polymorphic over a\n *    bounded family, not the full type universe.\n * 8. **Workspace provenance** (WS3, 2026-07-05): a workspace's commit loop can\n *    produce any entity type arranged in it (decision, feature, persona, ...).\n *    Widened from the single-target `workspace_produced_decision`; see\n *    `UPG_EDGE_MIGRATIONS` for the rename rule.\n * 9. **Canvas arrangement and published-view focus**: any entity can be dragged\n *    onto a canvas or shown in a published view, and neither placement carries\n *    a structural role, so both collapse polymorphic rather than enumerating\n *    the type universe twice. Both are `cross-domain`, so neither enters\n *    `UPG_VALID_CHILDREN` and neither can be walked as containment.\n * 10. **Benchmark subject** (0.31.0): an eval measures a tool, a document, a\n *    check, an importer, a feature. Registered as OVER-WIDE by admission,\n *    because a benchmark measures a measurable thing rather than literally any\n *    node; the width is what it costs to avoid answering \"what is a tool in the\n *    graph\" as a side effect of building an eval harness. Reach for the typed\n *    `eval_benchmark_measures_feature` when the subject IS a feature.\n * 11. **Universal assignment** (0.32.0): any node can be assigned to a person,\n *    and assignment is deliberately NOT the ownership family above. Ownership is\n *    durable accountability; assignment is who is working on it now, with an\n *    interval and an exclusivity ownership does not have. A board that runs 85%\n *    unassigned while everything is owned cannot say so with one edge.\n * 12. **Capture subject** (0.32.0): anything in the graph can be rendered into a\n *    dated, hashed file. Being captured carries no structural role, so the\n *    endpoint collapses rather than enumerating a list that would never finish.\n * 13. **Cadence scheduling** (0.32.0): a planning_cycle schedules work across the\n *    same bounded {feature, epic, user_story, task, bug} family as family 7,\n *    and for the same reason. Widened from `planning_cycle_schedules_user_story`,\n *    whose story-only endpoint could not hold the `task` a tracker import\n *    actually produces; see `UPG_EDGE_MIGRATIONS` for the rename rule.\n * 14. **Project membership** (0.33.0): a project delivers work across the same\n *    bounded {feature, epic, user_story, task, bug} family as families 7 and 13.\n *    Widened from `project_delivers_epic`, whose epic-only endpoint left 651\n *    measured project memberships stranded on a vendor property because the\n *    type a tracker import actually produces is `task`. The verb stays\n *    `delivers` and NOT `contains`, because a containment verb would oblige a\n *    `UPG_VALID_CHILDREN` pair that a wildcard endpoint can never supply; the\n *    parent axis is containment and the project axis is a reference.\n * 15. **Document transclusion** (0.34.0): a document embeds a node's live value\n *    at a position in its prose. The only family whose target set is open by\n *    NATURE rather than by a bounded enumeration nobody wanted to write out:\n *    anything renderable can be embedded. Deliberately NOT merged with the\n *    nine-member `document_describes_*` family, which says the document is ABOUT\n *    a thing rather than that it renders it.\n * 16. **Risk exposure** (0.35.0): what a risk puts at stake, and what mitigates\n *    it. Deliberately mirrors family 2 (\"decision-to-anything\") with `risk` in\n *    the source slot, for the same reason: both target sets are open (outcome,\n *    key_result, release, service, contract, launch on one side; decision,\n *    feature, experiment, security_control on the other) and neither endpoint\n *    carries a structural role. Both `cross-domain`, so the containment tree is\n *    untouched. The typed `security_control_mitigates_threat` is NOT absorbed:\n *    it stays the security-domain edge, and this is the product generalisation.\n *\n * Adding a new polymorphic edge requires extending this array AND naming the\n * family it joins in `UPG_POLYMORPHIC_EDGE_FAMILIES` below, which the\n * spec-integrity regression test asserts against. That forces a conscious\n * decision and keeps consumers (MCP, Entopo, audit tools, the editorial gate)\n * able to enumerate the full set and attribute a wildcard edge to real types.\n */\nexport const UPG_POLYMORPHIC_EDGE_KEYS: readonly _UPGEdgeTypeLocal[] = [\n  // Universal semantic verbs\n  'node_informs_node',\n  'node_constrains_node',\n  'node_inspires_node',\n  // Decision-to-anything\n  'decision_influences_node',\n  'decision_constrained_by_node',\n  'decision_produces_node',\n  // Universal ownership\n  'node_owned_by_team',\n  'node_owned_by_role',\n  'node_owned_by_stakeholder',\n  'node_owned_by_department',\n  'node_owned_by_person',\n  // Universal architecture references\n  'node_belongs_to_bounded_context',\n  // Framework exercises (an exercise can include any entity type)\n  'framework_exercise_includes_node',\n  // Universal classification (any node classified against a classification_value)\n  'node_classified_as_classification_value',\n  // Benchmark subject (0.31.0): an eval measures a tool, a doc, a check, an\n  // importer, a feature. Over-wide by admission — see the definition's comment.\n  'eval_benchmark_measures_node',\n  // Work-item issue links (0.20.0): endpoint-polymorphic over the work-item set\n  // {feature, epic, user_story, task, bug}. The `work_item_` key names the\n  // intended semantic domain; the endpoints are the `node` wildcard.\n  'work_item_blocks_work_item',\n  'work_item_relates_to_work_item',\n  'work_item_duplicates_work_item',\n  // Workspace provenance (WS3, 2026-07-05): a workspace can produce any\n  // entity type arranged in it. Widened from workspace_produced_decision.\n  'workspace_produced_node',\n  // Canvas arrangement and published-view focus: any entity can be dragged\n  // onto a canvas or shown in a published view, and neither carries a\n  // structural role, so both collapse polymorphic rather than enumerating.\n  'workspace_arranges_node',\n  'composition_focuses_node',\n  // Universal assignment (0.32.0): who is working on this, as distinct from who\n  // owns it. Wildcard source for the same reason node_owned_by_person has one.\n  'node_assigned_to_person',\n  // Capture subject (0.32.0): anything in the graph can be rendered, and being\n  // rendered carries no structural role.\n  'capture_renders_node',\n  // Cadence scheduling (0.32.0, widened from planning_cycle_schedules_user_story):\n  // endpoint-polymorphic over the work-item set {feature, epic, user_story, task,\n  // bug}. The `work_item` key token names the intended semantic domain; the\n  // endpoint is the `node` wildcard.\n  'planning_cycle_schedules_work_item',\n  // Project membership (0.33.0, widened from project_delivers_epic):\n  // endpoint-polymorphic over the work-item set {feature, epic, user_story, task,\n  // bug}. Same construction and same reasoning as the cadence edge above.\n  'project_delivers_work_item',\n  // Document transclusion (0.34.0): a document embeds any renderable node's live\n  // value at a position in its prose. Open by nature rather than by an\n  // enumeration nobody wanted to write out.\n  'document_transcludes_node',\n  // Risk exposure (0.35.0): what a risk threatens, and what mitigates it.\n  // Typed source, wildcard target — the decision-to-anything construction with\n  // `risk` in the source slot. Both cross-domain, so containment is untouched.\n  'risk_threatens_node',\n  'risk_mitigated_by_node',\n] as const\n\n/**\n * The partition of `UPG_POLYMORPHIC_EDGE_KEYS` into named families.\n *\n * @remarks\n * WHY THIS IS AN EXPORT AND NOT A TEST LITERAL. It lived inside\n * `spec-integrity.test.ts` until 0.34.0, which made it unreachable by every\n * consumer that needs it, and there is now a real one: `check:editorial` matches\n * `source_type === type` and `target_type === type` LITERALLY when it derives an\n * entity's attached-edge set, so an edge whose endpoint is the `node` wildcard is\n * attributed to nobody. `project_delivers_work_item` moved zero fingerprints on\n * `task`, `bug`, `user_story` or `feature`. A gate cannot fix that without a map\n * from a wildcard key to the types the family actually ranges over, and duplicating\n * the map in the gate would recreate the drift the test was written to catch.\n *\n * THE MEMBER LIST IS THE KEYS, NOT THE TYPES. A family names which polymorphic\n * KEYS belong together. What a consumer does with that — which concrete entity\n * types to attribute a wildcard edge to — is its own decision, made against the\n * catalog. This export does not pretend to answer it.\n *\n * The prose list in the JSDoc above drifted once already: it still read \"Eight\n * semantic families\" after the ninth and tenth had shipped. `spec-integrity`\n * asserts this object against `UPG_POLYMORPHIC_EDGE_KEYS` in both directions, so\n * a new key fails until its author names the family it joins.\n */\nexport const UPG_POLYMORPHIC_EDGE_FAMILIES: Readonly<Record<string, readonly _UPGEdgeTypeLocal[]>> = {\n  'universal semantic verbs': ['node_informs_node', 'node_constrains_node', 'node_inspires_node'],\n  'decision-to-anything': ['decision_influences_node', 'decision_constrained_by_node', 'decision_produces_node'],\n  'universal ownership': [\n    'node_owned_by_team',\n    'node_owned_by_role',\n    'node_owned_by_stakeholder',\n    'node_owned_by_department',\n    'node_owned_by_person',\n  ],\n  'universal architecture references': ['node_belongs_to_bounded_context'],\n  'framework exercises': ['framework_exercise_includes_node'],\n  'universal classification': ['node_classified_as_classification_value'],\n  'work-item issue links': [\n    'work_item_blocks_work_item',\n    'work_item_relates_to_work_item',\n    'work_item_duplicates_work_item',\n  ],\n  'workspace provenance': ['workspace_produced_node'],\n  'canvas arrangement and published-view focus': ['workspace_arranges_node', 'composition_focuses_node'],\n  'benchmark subject': ['eval_benchmark_measures_node'],\n  // 0.32.0. Assignment is its OWN family and deliberately not a member of\n  // 'universal ownership': keeping them apart in this partition is the same\n  // ruling the edge itself makes, so a future author who merges them here is\n  // making that decision visibly rather than by tidying a list.\n  'universal assignment': ['node_assigned_to_person'],\n  'capture subject': ['capture_renders_node'],\n  'cadence scheduling': ['planning_cycle_schedules_work_item'],\n  // 0.33.0. Project membership is its own family and deliberately not a member\n  // of 'cadence scheduling', even though both range over the same work-item set:\n  // a cycle SCHEDULES work in time and a project REFERENCES the work it delivers,\n  // and merging them here would quietly assert those are one relation.\n  'project membership': ['project_delivers_work_item'],\n  // 0.34.0. Its own family and deliberately not merged with the nine-member\n  // `document_describes_*` set, which is not polymorphic at all: those are\n  // enumerated edges saying a document is ABOUT a thing. Transclusion says it\n  // RENDERS the thing, and the difference is the whole reason the edge exists.\n  'document transclusion': ['document_transcludes_node'],\n  // 0.35.0. Its own family and deliberately NOT merged into\n  // 'decision-to-anything', which it mirrors structurally. The two say different\n  // things: a decision INFLUENCES what it touches, a risk ENDANGERS what it\n  // threatens, and a partition that merged them on shape alone would assert\n  // those are one relation. Two members because exposure has two directions,\n  // and collapsing them would lose which way an edge points.\n  'risk exposure': ['risk_threatens_node', 'risk_mitigated_by_node'],\n} as const\n\nconst _POLY_KEY_SET = new Set<string>(UPG_POLYMORPHIC_EDGE_KEYS)\n\n/**\n * True if the edge uses the `'node'` wildcard at either endpoint. Derived\n * dynamically from `source_type`/`target_type`, not from the allow-list,\n * so an accidentally-added polymorphic edge still returns true and surfaces\n * via the invariant test rather than silently passing.\n *\n * @example\n * isPolymorphicEdge('node_owned_by_team')    // → true  (source is 'node' wildcard)\n * isPolymorphicEdge('persona_pursues_job')   // → false (both endpoints typed)\n */\nexport function isPolymorphicEdge(key: _UPGEdgeTypeLocal): boolean {\n  const def = UPG_EDGE_CATALOG[key]\n  return def.source_type === UPG_WILDCARD_ENDPOINT || def.target_type === UPG_WILDCARD_ENDPOINT\n}\n\n/**\n * True if the edge is in the registered polymorphic allow-list.\n *\n * @example\n * isRegisteredPolymorphicEdge('node_owned_by_team')    // → true\n * isRegisteredPolymorphicEdge('persona_pursues_job')   // → false\n */\nexport function isRegisteredPolymorphicEdge(key: _UPGEdgeTypeLocal): boolean {\n  return _POLY_KEY_SET.has(key)\n}\n\n/**\n * True if this edge type opts into the gated edge-property model\n * (`carries_properties: true` in its catalog definition). Only such edges may\n * carry `properties` on their instances; validators reject `properties` on any\n * other edge, keeping plain semantic edges payload-free.\n *\n * Accepts any string for ergonomic call sites (unknown types return false).\n *\n * @example\n * edgeCarriesProperties('framework_exercise_includes_node') // → true\n * edgeCarriesProperties('persona_pursues_job')              // → false\n */\nexport function edgeCarriesProperties(type: string): boolean {\n  const def = (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[type]\n  return def?.carries_properties === true\n}\n\n/**\n * The typed property schema for a `carries_properties` edge, or `undefined` if\n * the edge type declares none (it then accepts an unvalidated `properties` bag).\n * Writers use this to reject unknown keys; validators use it to range-check\n * typed values. 0.10.4.\n */\nexport function getEdgePropertySchema(type: string): PropertySchema | undefined {\n  const def = (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[type]\n  return def?.property_schema\n}\n","/**\n * UPG Lifecycles. Phase-and-state journeys for entity types with meaningful status.\n *\n * Phase is the universal vocabulary fixed by the spec. State carries granular\n * meaning within a phase. Tools add their own states via `lifecycle_extensions`\n * on the UPG document. Static types (persona, metric, quote) have no lifecycle.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type definitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** A lifecycle defines the valid phase-and-state journey for an entity type. */\nexport interface UPGLifecycle {\n  /** Which entity type this lifecycle governs. */\n  entity_type: string\n  /**\n   * Identifier of the reusable template this lifecycle was generated from\n   * (e.g. `'PUBLISHING'`, `'OPERATIONAL'`), if any.\n   *\n   * Hand-authored lifecycles leave this `undefined`. Template-derived\n   * lifecycles set it via `fromTemplate()` so render and audit tooling can\n   * group, label, and link templates without re-detecting them structurally.\n   */\n  template_id?: string\n  /** The universal phases, fixed by the spec and understood by all tools. */\n  phases: LifecyclePhase[]\n  /** Which phase a new entity of this type starts in. */\n  initial_phase: string\n  /**\n   * Phases representing completion: the end points of normal forward progression.\n   *\n   * A terminal phase MAY still declare `transitions_to` entries, which represent\n   * late-state transitions (e.g., `archived → draft` for republishing, `approved\n   * → deprecated` for late retirement, `parked → open` for reopen). These are\n   * legitimate domain moves and are NOT forward progression.\n   *\n   * Consumers treating terminals as \"complete\":\n   * - Dashboards / health scores: treat terminal phases as done for counting.\n   * - Status nudges: stop prompting once terminal is reached.\n   * - Transition gates: allow terminal → `transitions_to` targets as explicit\n   *   late-state moves; forward-progression gates should compare against the\n   *   authoring layer (e.g., \"moving a `done` task back to `todo` requires\n   *   reopening\").\n   */\n  terminal_phases: string[]\n}\n\n/**\n * The near-universal PM-tool status bucket a phase belongs to (0.25.1 feedback\n * 1ee70102) — the same six-bucket system Linear, Jira, Asana, and GitHub\n * Projects converge on. It exists for one job: mapping a graph entity's phases\n * onto an external tool's workflow-state categories WITHOUT re-deriving the\n * categorisation by trial and error inside the external tool's UI.\n *\n * Bucket semantics (assignment rules used across the catalog):\n * - `triage`     — raised/identified/proposed; awaiting an acceptance decision.\n * - `backlog`    — accepted or set aside deliberately; not scheduled (parked,\n *                  paused, deferred, vacant, off).\n * - `unstarted`  — committed/scheduled/ready; the work itself has not begun.\n * - `started`    — any in-flight phase, AND any ongoing steady-state phase\n *                  (active, live, production, mature): the entity is alive.\n * - `completed`  — reached an end through the process itself, even when the\n *                  outcome is negative (done, shipped, missed, failed,\n *                  closed_lost, expired): the outcome is recorded, the flow ran.\n * - `cancelled`  — deliberately ended without/before completion (won't-do,\n *                  duplicate, abandoned, rejected, terminated).\n *\n * Spelling note: the spec uses `cancelled` (its established phase-id spelling);\n * Linear's API spells the equivalent bucket `canceled`. Adapters map trivially.\n */\nexport type StatusCategory =\n  | 'triage'\n  | 'backlog'\n  | 'unstarted'\n  | 'started'\n  | 'completed'\n  | 'cancelled'\n\n/** A phase is one broad stage in the entity's lifecycle. */\nexport interface LifecyclePhase {\n  /** Machine-readable phase ID: the universal vocabulary.\n   * @example \"in_progress\" */\n  id: string\n  /** Which of the six near-universal PM-tool buckets this phase maps onto.\n   * See {@link StatusCategory} for the assignment rules.\n   * @example \"started\" */\n  status_category: StatusCategory\n  /** Human-readable label.\n   * @example \"In Progress\" */\n  label: string\n  /** What this phase means: guidance for agents and documentation.\n   * @example \"The solution is actively being built or tested.\" */\n  description: string\n  /**\n   * Which phases can follow this one: valid transitions at the phase level.\n   *\n   * On non-terminal phases: forward progression targets.\n   * On terminal phases: late-state / reopen / revive paths (optional; often empty).\n   *\n   * @example [\"shipped\", \"deferred\"]\n   */\n  transitions_to: string[]\n  /** Core states defined by the spec, always available in this phase.\n   * If omitted, the phase itself is the only state. No nesting needed. */\n  core_states?: LifecycleState[]\n}\n\n/** A state is a specific position within a phase. */\nexport interface LifecycleState {\n  /** Machine-readable state ID.\n   * @example \"in_review\" */\n  id: string\n  /** Human-readable label.\n   * @example \"In Review\" */\n  label: string\n  /** What this state means within the phase.\n   * @example \"Code complete, awaiting peer review before merge.\" */\n  description: string\n  /** Optional: which states within this phase can follow this one.\n   * If not defined, transition to any state in the next phase is valid. */\n  transitions_to?: string[]\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Product (root entity)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * product (Strategy domain)\n *\n * The root entity of a product graph. Stages cover the full arc from napkin\n * idea to end-of-life, mirroring `UPGProductStage` from shapes/document.ts\n * (the two must stay in sync; see compile-time assertion below).\n *\n * Transition rule: products generally move forward. Forward-skip\n * transitions are allowed from every earlier stage to any later stage; teams\n * routinely go `concept → beta` or `validation → launch` when conviction is\n * high. The one backward path declared is `maintenance → mature` (recovery)\n * which is rare but real. Any stage may also exit directly to `sunset`\n * (pivot or abandon).\n */\nconst PRODUCT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'product',\n  initial_phase: 'concept',\n  terminal_phases: ['sunset'],\n  phases: [\n    {\n      id: 'concept',\n      status_category: 'triage',\n      label: 'Concept',\n      description:\n        'Napkin idea. Problem shape and solution sketch, pre-validation.',\n      transitions_to: ['validation', 'build', 'beta', 'launch', 'growth', 'mature', 'sunset'],\n    },\n    {\n      id: 'validation',\n      status_category: 'started',\n      label: 'Validation',\n      description:\n        'Testing demand. User conversations and experiments pressure-test assumptions before build commits.',\n      transitions_to: ['build', 'beta', 'launch', 'growth', 'mature', 'sunset'],\n    },\n    {\n      id: 'build',\n      status_category: 'started',\n      label: 'Build',\n      description:\n        'Actively developing v1. Core functionality is being authored, pre-user.',\n      transitions_to: ['beta', 'launch', 'growth', 'mature', 'sunset'],\n    },\n    {\n      id: 'beta',\n      status_category: 'started',\n      label: 'Beta',\n      description:\n        'Early users, iterating. Feature-complete enough to learn from, still changing weekly.',\n      transitions_to: ['launch', 'growth', 'mature', 'maintenance', 'sunset'],\n    },\n    {\n      id: 'launch',\n      status_category: 'started',\n      label: 'Launch',\n      description:\n        'Generally available. Announced to the target audience, open past beta access.',\n      transitions_to: ['growth', 'mature', 'maintenance', 'sunset'],\n    },\n    {\n      id: 'growth',\n      status_category: 'started',\n      label: 'Growth',\n      description:\n        'Scaling users and revenue. Product fit validated; focus is acquisition, retention, expansion.',\n      transitions_to: ['mature', 'maintenance', 'sunset'],\n    },\n    {\n      id: 'mature',\n      status_category: 'started',\n      label: 'Mature',\n      description:\n        'Stable. Growth levelled; investment weights toward optimisation, efficiency, and durability.',\n      transitions_to: ['maintenance', 'sunset'],\n    },\n    {\n      id: 'maintenance',\n      status_category: 'started',\n      label: 'Maintenance',\n      description:\n        'Sustaining. Minimal investment keeps the product running for existing users. Can transition back to `mature` on a strategic revival.',\n      transitions_to: ['mature', 'sunset'],\n    },\n    {\n      id: 'sunset',\n      status_category: 'completed',\n      label: 'Sunset',\n      description:\n        'Winding down or retired. Existing users are being migrated or offboarded.',\n      transitions_to: [],\n    },\n  ],\n}\n\n// Runtime guard for PRODUCT_LIFECYCLE ↔ UPGProductStage coherence lives in\n// src/__tests__/spec-integrity.test.ts (\"Lifecycle integrity → product\n// lifecycle phases match UPGProductStage\"). A type-level assertion would need\n// PRODUCT_LIFECYCLE's phase ids preserved as literals, but the UPGLifecycle\n// annotation widens them; the runtime test is the simpler contract.\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Discovery & Validation\n// ─────────────────────────────────────────────────────────────────────────────\n\n\n/**\n * need (Users & Needs domain)\n *\n * A need's maturity reflects how well it is understood and prioritised.\n * `raw` needs have been captured but not yet validated with evidence.\n * `prioritized` is terminal; the need is ready to inform opportunity framing.\n */\nconst NEED_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'need',\n  initial_phase: 'raw',\n  terminal_phases: ['prioritized'],\n  phases: [\n    {\n      id: 'raw',\n      status_category: 'triage',\n      label: 'Raw',\n      description:\n        'Captured from an interview, observation, or support ticket. Articulation may be rough; may duplicate an existing need.',\n      transitions_to: ['validated'],\n    },\n    {\n      id: 'validated',\n      status_category: 'started',\n      label: 'Validated',\n      description:\n        'Corroborated by multiple data points or targeted research. The team agrees it is a real, recurring need.',\n      transitions_to: ['prioritized'],\n    },\n    {\n      id: 'prioritized',\n      status_category: 'completed',\n      label: 'Prioritized',\n      description:\n        'Ranked against other needs. Ready to inform opportunity definition and solution exploration.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * opportunity (Discovery domain)\n *\n * An opportunity moves from identification through validation.\n * `deferred` is not terminal; an opportunity can always be revisited.\n * The lifecycle reflects the confidence the team has in pursuing it.\n */\nconst OPPORTUNITY_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'opportunity',\n  initial_phase: 'identified',\n  terminal_phases: [],\n  phases: [\n    {\n      id: 'identified',\n      status_category: 'triage',\n      label: 'Identified',\n      description:\n        'A problem worth solving has been named. Sources include needs, insights, market trends, or competitive signals. Sizing and validation come next.',\n      transitions_to: ['validated', 'deferred'],\n    },\n    {\n      id: 'validated',\n      status_category: 'started',\n      label: 'Validated',\n      description:\n        'Research and evidence support pursuit. The problem is real, frequent, and painful enough to justify investment.',\n      transitions_to: ['deferred'],\n    },\n    {\n      id: 'deferred',\n      status_category: 'backlog',\n      label: 'Deferred',\n      description:\n        'Acknowledged but parked. Capacity, priority, or strategic timing reasons. Can be reopened.',\n      transitions_to: ['identified'],\n    },\n  ],\n}\n\n/**\n * solution (Discovery domain)\n *\n * A solution's lifecycle tracks its journey from proposal through delivery.\n * `shipped` is the primary terminal phase. `deferred` is not terminal; a\n * solution can be reopened. This mirrors the canonical example in the lifecycle\n * design doc.\n */\nconst SOLUTION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'solution',\n  initial_phase: 'proposed',\n  terminal_phases: ['shipped'],\n  phases: [\n    {\n      id: 'proposed',\n      status_category: 'triage',\n      label: 'Proposed',\n      description:\n        'Identified as a possible response to an opportunity. Pre-commitment, pre-feasibility.',\n      transitions_to: ['in_progress', 'deferred'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'A team is actively building, testing, or refining the solution.',\n      transitions_to: ['shipped', 'deferred'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'Delivered to users. Live in the product.',\n      transitions_to: ['deferred'],\n    },\n    {\n      id: 'deferred',\n      status_category: 'backlog',\n      label: 'Deferred',\n      description:\n        'Acknowledged but parked. Capacity, priority, or a change in direction. Can be reopened.',\n      transitions_to: ['proposed'],\n    },\n  ],\n}\n\n\n\n/**\n * experiment_plan (Validation domain, v0.2.6 split 1)\n *\n * Plan-shape lifecycle. An `experiment_plan` is a planning artefact: it\n * captures intent (method, success criteria, target metric, projected\n * reach/impact, ownership, planned dates) before the actual run exists.\n * Once a plan is `approved` and a run begins, an `experiment_run` is\n * spawned and linked back via `experiment_plan_ran_as_experiment_run`.\n *\n * Plans are not the place where evidence accrues; that lives on the\n * paired `experiment_run`.\n *\n * Initial: `drafted`. Terminals: `cancelled` (plan never ran, abandoned)\n * and `approved` (plan ran or is running; the run carries forward\n * progress; a plan stays `approved` even after its runs complete).\n */\nconst EXPERIMENT_PLAN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'experiment_plan',\n  initial_phase: 'drafted',\n  terminal_phases: ['approved', 'cancelled'],\n  phases: [\n    {\n      id: 'drafted',\n      status_category: 'unstarted',\n      label: 'Drafted',\n      description:\n        'The plan is being written. Method, success criteria, target metric, projected reach/impact, ownership, and planned dates are being defined. Not yet approved.',\n      transitions_to: ['scheduled', 'cancelled'],\n    },\n    {\n      id: 'scheduled',\n      status_category: 'unstarted',\n      label: 'Scheduled',\n      description:\n        'The plan is approved and slotted for execution. Resources committed; awaiting start date.',\n      transitions_to: ['approved', 'cancelled'],\n    },\n    {\n      id: 'approved',\n      status_category: 'completed',\n      label: 'Approved',\n        description:\n        'Past scheduling: at least one run has started or completed against this plan. The plan is now a stable design artefact; future updates create a new plan.',\n      transitions_to: [],\n    },\n    {\n      id: 'cancelled',\n      status_category: 'cancelled',\n      label: 'Cancelled',\n      description:\n        'The plan was abandoned before any run started. Reason should be documented in description or via an attached decision.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * research_plan (Validation domain)\n *\n * A research plan is a planning artefact that precedes an experiment or study.\n * It moves from draft through active execution to completion or abandonment.\n */\nconst RESEARCH_PLAN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'research_plan',\n  initial_phase: 'draft',\n  terminal_phases: ['completed', 'abandoned'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The plan is being written. Research question, suggested methods, and evidence threshold are being defined. Not yet approved for execution.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The plan has been approved and is being executed. Research sessions are underway or scheduled.',\n      transitions_to: ['completed', 'abandoned'],\n    },\n    {\n      id: 'completed',\n      status_category: 'completed',\n      label: 'Completed',\n      description:\n        'The planned research has been carried out and learnings have been captured. The plan is a historical record.',\n      transitions_to: [],\n    },\n    {\n      id: 'abandoned',\n      status_category: 'cancelled',\n      label: 'Abandoned',\n      description:\n        'Not executed: changing priorities, a decision no longer needing validation, or resource constraints.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * feedback_program (Customer Feedback domain)\n *\n * A feedback program is a sustained effort to collect structured signals\n * from customers. It moves from planning to active operation.\n * `retired` is terminal; a retired program can be replaced by a new one.\n */\nconst FEEDBACK_PROGRAM_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'feedback_program',\n  initial_phase: 'planning',\n  terminal_phases: ['retired'],\n  phases: [\n    {\n      id: 'planning',\n      status_category: 'unstarted',\n      label: 'Planning',\n      description:\n        'The program is being designed. Goals, audience, collection method, and cadence are being defined. No feedback is being collected yet.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The program is running. Feedback is being collected and processed on the defined cadence.',\n      transitions_to: ['paused', 'retired'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'Collection has been temporarily suspended. The program will resume.',\n      transitions_to: ['active', 'retired'],\n    },\n    {\n      id: 'retired',\n      status_category: 'completed',\n      label: 'Retired',\n      description:\n        'The program has ended. It is no longer collecting feedback. Historical data is preserved.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * feature_request (Customer Feedback domain)\n *\n * A feature request progresses from submission through triage, planning,\n * and delivery. `shipped` is the positive terminal; `wont_do` is the negative\n * terminal. `new` and `under_review` represent the triage funnel.\n */\nconst FEATURE_REQUEST_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'feature_request',\n  initial_phase: 'new',\n  terminal_phases: ['shipped', 'wont_do'],\n  phases: [\n    {\n      id: 'new',\n      status_category: 'triage',\n      label: 'New',\n      description:\n        'The request has been submitted. It has not yet been reviewed by the product team.',\n      transitions_to: ['under_review'],\n    },\n    {\n      id: 'under_review',\n      status_category: 'triage',\n      label: 'Under Review',\n      description:\n        'The request is being triaged. The product team is assessing feasibility, demand, and strategic fit.',\n      transitions_to: ['planned', 'wont_do'],\n    },\n    {\n      id: 'planned',\n      status_category: 'unstarted',\n      label: 'Planned',\n      description:\n        'The request has been accepted and is on the roadmap. It is scheduled for a future release cycle.',\n      transitions_to: ['in_progress', 'wont_do'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'Work on fulfilling the request is actively underway.',\n      transitions_to: ['shipped'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The requested capability has been delivered to users.',\n      transitions_to: [],\n    },\n    {\n      id: 'wont_do',\n      status_category: 'cancelled',\n      label: \"Won't Do\",\n      description:\n        'Declined: strategic misalignment, infeasibility, or insufficient demand.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * beta_program (Customer Feedback domain)\n *\n * A beta program recruits users to test a feature before general availability.\n * `graduated` means the feature shipped to GA. `closed` means the beta ended\n * without graduating.\n */\nconst BETA_PROGRAM_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'beta_program',\n  initial_phase: 'recruiting',\n  terminal_phases: ['graduated', 'closed'],\n  phases: [\n    {\n      id: 'recruiting',\n      status_category: 'started',\n      label: 'Recruiting',\n      description:\n        'The program is accepting applications. Beta participants are being identified and onboarded.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'Beta participants have access and are using the feature. Feedback is being collected.',\n      transitions_to: ['graduated', 'closed'],\n    },\n    {\n      id: 'graduated',\n      status_category: 'completed',\n      label: 'Graduated',\n      description:\n        'The beta was successful and the feature has progressed to general availability.',\n      transitions_to: [],\n    },\n    {\n      id: 'closed',\n      status_category: 'completed',\n      label: 'Closed',\n      description:\n        'The beta ended without graduating to GA. The feature was deprioritised, pivoted, or missed exit criteria.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * user_advisory_board (Customer Feedback domain)\n *\n * A user advisory board (UAB) convenes a group of representative customers\n * to provide strategic feedback. It moves from formation through active\n * engagement. `retired` is terminal.\n */\nconst USER_ADVISORY_BOARD_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'user_advisory_board',\n  initial_phase: 'recruiting',\n  terminal_phases: ['retired'],\n  phases: [\n    {\n      id: 'recruiting',\n      status_category: 'started',\n      label: 'Recruiting',\n      description:\n        'Members are being identified and invited. The board is not yet convened.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The board is convened and meeting regularly. Members are providing strategic input.',\n      transitions_to: ['paused', 'retired'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'Board activities are temporarily suspended. Membership is retained and sessions will resume.',\n      transitions_to: ['active', 'retired'],\n    },\n    {\n      id: 'retired',\n      status_category: 'completed',\n      label: 'Retired',\n      description:\n        'The board has been disbanded. Members are no longer engaged in an advisory capacity.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy & Product Specification\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * objective (Strategy domain)\n *\n * An objective is an OKR-style goal for a planning period. `achieved` is the\n * positive terminal. `deferred` is not terminal; an objective can be carried\n * forward to the next planning period.\n */\nconst OBJECTIVE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'objective',\n  initial_phase: 'draft',\n  terminal_phases: ['achieved', 'missed'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The objective is being written. Key results have not yet been attached or approved.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The objective is in the current planning period. Key results are being measured and progress is tracked.',\n      transitions_to: ['achieved', 'missed', 'deferred'],\n    },\n    {\n      id: 'achieved',\n      status_category: 'completed',\n      label: 'Achieved',\n      description:\n        'The objective was met or exceeded within the planning period.',\n      transitions_to: [],\n    },\n    {\n      id: 'missed',\n      status_category: 'completed',\n      label: 'Missed',\n      description:\n        'The planning period ended without achieving the objective. Learnings inform the next cycle.',\n      transitions_to: [],\n    },\n    {\n      id: 'deferred',\n      status_category: 'backlog',\n      label: 'Deferred',\n      description:\n        'The objective was not completed this period and is being carried forward. Can be reopened as active.',\n      transitions_to: ['active'],\n    },\n  ],\n}\n\n/**\n * key_result (Strategy domain)\n *\n * A key result measures progress toward an objective. Health states\n * (`on_track`, `at_risk`, `behind`) are concurrent during the tracking period.\n * Any health state can transition to `achieved` when the target is hit.\n */\nconst KEY_RESULT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'key_result',\n  initial_phase: 'on_track',\n  terminal_phases: ['achieved'],\n  phases: [\n    {\n      id: 'on_track',\n      status_category: 'started',\n      label: 'On Track',\n      description:\n        'Current measured value is progressing at a rate that should reach the target by the deadline.',\n      transitions_to: ['at_risk', 'behind', 'achieved'],\n    },\n    {\n      id: 'at_risk',\n      status_category: 'started',\n      label: 'At Risk',\n      description:\n        'Progress is slowing. Without intervention, the target may not be reached by the deadline.',\n      transitions_to: ['on_track', 'behind', 'achieved'],\n    },\n    {\n      id: 'behind',\n      status_category: 'started',\n      label: 'Behind',\n      description:\n        'Unlikely to reach the target at the current rate. The team needs to reassess strategy or accept a miss.',\n      transitions_to: ['on_track', 'at_risk', 'achieved'],\n    },\n    {\n      id: 'achieved',\n      status_category: 'completed',\n      label: 'Achieved',\n      description:\n        'The target value has been reached or exceeded.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * strategic_theme (Strategy domain)\n *\n * A strategic theme is a sustained area of focus across planning periods.\n * `completed` is terminal. `paused` allows temporary suspension without closing.\n */\nconst STRATEGIC_THEME_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'strategic_theme',\n  initial_phase: 'active',\n  terminal_phases: ['completed'],\n  phases: [\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The theme is a current organisational focus. Initiatives and objectives are being run under it.',\n      transitions_to: ['completed', 'paused'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'The theme is deprioritised for this period but is not being retired. It will resume.',\n      transitions_to: ['active', 'completed'],\n    },\n    {\n      id: 'completed',\n      status_category: 'completed',\n      label: 'Completed',\n      description:\n        'The theme has run its course. The focus area has been addressed or superseded by a new theme.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * initiative (Strategy domain)\n *\n * An initiative is a time-bounded programme of work. `completed` and\n * `abandoned` are both terminal. `cancelled` is a formal close with a\n * decision record.\n */\nconst INITIATIVE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'initiative',\n  initial_phase: 'proposed',\n  terminal_phases: ['completed', 'abandoned'],\n  phases: [\n    {\n      id: 'proposed',\n      status_category: 'triage',\n      label: 'Proposed',\n      description:\n        'The initiative has been put forward but not yet approved for resourcing. Business case is being evaluated.',\n      transitions_to: ['in_progress', 'abandoned'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'The initiative has been approved and work is underway. Teams are executing against it.',\n      transitions_to: ['completed', 'abandoned'],\n    },\n    {\n      id: 'completed',\n      status_category: 'completed',\n      label: 'Completed',\n      description:\n        'The initiative has achieved its goals and been formally closed.',\n      transitions_to: [],\n    },\n    {\n      id: 'abandoned',\n      status_category: 'cancelled',\n      label: 'Abandoned',\n      description:\n        'Stopped before completion: changing strategy, resource constraints, or learning that the goal is no longer relevant.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * strategic_pillar (Strategy domain)\n *\n * A strategic pillar is a foundational commitment that shapes the product\n * strategy. `sunset` is terminal.\n */\nconst STRATEGIC_PILLAR_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'strategic_pillar',\n  initial_phase: 'proposed',\n  terminal_phases: ['sunset'],\n  phases: [\n    {\n      id: 'proposed',\n      status_category: 'triage',\n      label: 'Proposed',\n      description:\n        'The pillar has been articulated but not yet ratified by leadership as a strategic commitment.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The pillar is a live strategic commitment. Decisions, themes, and initiatives are aligned to it.',\n      transitions_to: ['sunset'],\n    },\n    {\n      id: 'sunset',\n      status_category: 'completed',\n      label: 'Sunset',\n      description:\n        'Retired: achieved, superseded by a new direction, or no longer reflects strategic reality.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * strategic_question (Strategy domain)\n *\n * Open -> resolved. A strategic_question is an unresolved coordination or\n * ownership question a plan is exposed to (who owns a capability across teams,\n * where a boundary falls after a reorg). It is settled once the plan gains an\n * answer, captured in the `resolution` property. Mirrors research_question's\n * open->answered loop but stays in strategy-domain vocabulary. `resolved` can\n * reopen if the answer unravels.\n */\nconst STRATEGIC_QUESTION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'strategic_question',\n  initial_phase: 'open',\n  terminal_phases: ['resolved'],\n  phases: [\n    { id: 'open', status_category: 'triage', label: 'Open', description: 'The question has been raised but not yet answered. The plan is exposed to it.', transitions_to: ['resolved'] },\n    { id: 'resolved', status_category: 'completed', label: 'Resolved', description: 'The question has been answered; the resolution is captured. The plan is no longer exposed to it. May reopen if the answer unravels.', transitions_to: ['open'] },\n  ],\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy / OKR\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * outcome (Strategy domain)\n *\n * The measurable result a strategy aims to drive. Resolves the earlier\n * forward-ref (\"goal → measuring → achieved / abandoned\"). An outcome\n * starts as `identified`, enters `measuring` once instrumentation is in\n * place, then settles to `achieved` or `abandoned`. Abandoned outcomes\n * may resume measurement if the team revisits them.\n */\nconst OUTCOME_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'outcome',\n  initial_phase: 'identified',\n  terminal_phases: ['achieved', 'abandoned'],\n  phases: [\n    { id: 'identified', status_category: 'triage', label: 'Identified', description: 'The outcome has been named: the team agrees on what success looks like, but is not yet measuring it.', transitions_to: ['measuring', 'abandoned'] },\n    { id: 'measuring', status_category: 'started', label: 'Measuring', description: 'Instrumentation is live. Progress is being tracked against the outcome.', transitions_to: ['achieved', 'abandoned'] },\n    { id: 'achieved', status_category: 'completed', label: 'Achieved', description: 'The outcome was reached. Captured for the record; no further pursuit required.', transitions_to: [] },\n    { id: 'abandoned', status_category: 'cancelled', label: 'Abandoned', description: 'Pursuit was stopped. Strategy shifted, the outcome lost relevance, or the cost outweighed value. May resume to `measuring` if the team revisits it.', transitions_to: ['measuring'] },\n  ],\n}\n\n/**\n * vision (Strategy domain)\n *\n * Visions evolve over time. Drafting → ratified (in force) → revised\n * (a new version is in force, this one is recorded as a milestone) →\n * archived. Revised visions can return to drafting for further iteration.\n */\nconst VISION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'vision',\n  initial_phase: 'drafting',\n  terminal_phases: ['ratified', 'revised', 'archived'],\n  phases: [\n    { id: 'drafting', status_category: 'started', label: 'Drafting', description: 'Vision is being authored or rewritten. Not yet adopted.', transitions_to: ['ratified', 'archived'] },\n    { id: 'ratified', status_category: 'completed', label: 'Ratified', description: 'The current, in-force vision. The team has aligned around it.', transitions_to: ['revised', 'archived'] },\n    { id: 'revised', status_category: 'completed', label: 'Revised', description: 'Superseded by a newer vision but kept as a recorded milestone. May reopen to drafting if revisited.', transitions_to: ['drafting'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'No longer in force. Retained for historical reference.', transitions_to: ['drafting'] },\n  ],\n}\n\n/**\n * mission (Strategy domain)\n *\n * Missions are more stable than visions; they describe the enduring\n * purpose. Drafting → active → archived. Reopen path lets a retired\n * mission be revived (e.g. when a sunset product is brought back).\n */\nconst MISSION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'mission',\n  initial_phase: 'drafting',\n  terminal_phases: ['active', 'archived'],\n  phases: [\n    { id: 'drafting', status_category: 'started', label: 'Drafting', description: 'Mission is being authored or rewritten. Not yet adopted.', transitions_to: ['active', 'archived'] },\n    { id: 'active', status_category: 'started', label: 'Active', description: 'The current, in-force mission. Guides product and organisational decisions.', transitions_to: ['archived'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'No longer in force. May reopen to drafting if the team revisits.', transitions_to: ['drafting'] },\n  ],\n}\n\n/**\n * capability (Strategy domain)\n *\n * A capability is an organisational competency. Planned → building →\n * operational → retired. Operational is the \"achieved\" terminal;\n * retired covers end-of-life. Reopen from retired allows reinvestment.\n */\nconst CAPABILITY_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'capability',\n  initial_phase: 'planned',\n  terminal_phases: ['operational', 'retired'],\n  phases: [\n    { id: 'planned', status_category: 'unstarted', label: 'Planned', description: 'Capability has been identified as needed but development has not started.', transitions_to: ['building', 'retired'] },\n    { id: 'building', status_category: 'started', label: 'Building', description: 'Active development: people, processes, or systems are being put in place.', transitions_to: ['operational', 'retired'] },\n    { id: 'operational', status_category: 'started', label: 'Operational', description: 'Capability is in place and functioning. The organisation can rely on it.', transitions_to: ['retired'] },\n    { id: 'retired', status_category: 'completed', label: 'Retired', description: 'No longer maintained. May reopen to building if the capability is reinvested in.', transitions_to: ['building'] },\n  ],\n}\n\n/**\n * feature_area (Product Specification domain)\n *\n * A feature area is a structural grouping of features. It follows a\n * simple maturity lifecycle from planning through active use to deprecation.\n */\nconst FEATURE_AREA_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'feature_area',\n  initial_phase: 'planned',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'planned',\n      status_category: 'unstarted',\n      label: 'Planned',\n      description:\n        'The feature area has been defined as an organising concept but no features have been built under it yet.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The feature area contains live features and is actively being developed.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The feature area is no longer being developed. It may still exist in the product but no new features are being added.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * feature (Product Specification domain)\n *\n * A feature tracks its journey from conception to delivery and eventual\n * archival. `archived` is terminal.\n */\nconst FEATURE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'feature',\n  initial_phase: 'proposed',\n  terminal_phases: ['archived'],\n  phases: [\n    {\n      id: 'proposed',\n      status_category: 'triage',\n      label: 'Proposed',\n      description:\n        'The feature has been suggested and is under consideration. It is not yet on the roadmap.',\n      transitions_to: ['in_progress', 'archived'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'The feature is actively being designed and built.',\n      transitions_to: ['shipped'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The feature is live in the product and available to users.',\n      transitions_to: ['archived'],\n    },\n    {\n      id: 'archived',\n      status_category: 'completed',\n      label: 'Archived',\n      description:\n        'The feature has been removed from the product or superseded. It is retained as a historical record.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n// `user_story` (re-canonicalised from `story_statement` at v0.7.0/UPG-571) is\n// the templated \"As X, I want Y so Z\" promise, a stable design artefact, NOT a\n// state machine. It is lifecycle-free (declared in `UPG_LIFECYCLE_FREE_TYPES`\n// below): a promise either holds or is superseded. The paired `task` carries the\n// WORK_ITEM lifecycle (todo → in_progress → in_review → done) and implements the\n// statement via `task_implements_user_story`.\n//\n// (Pre-v0.2.7 the bundled `user_story` had its own draft → ready → in_progress →\n// done lifecycle, which conflated statement-shape state with task-shape state.\n// The v0.2.7 split moved that lifecycle onto the task; the statement became\n// lifecycle-free.)\n\n/**\n * release (Product Specification domain)\n *\n * A release tracks the delivery of a versioned bundle of features.\n * `shipped` is terminal.\n */\nconst RELEASE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'release',\n  initial_phase: 'planned',\n  terminal_phases: ['shipped'],\n  phases: [\n    {\n      id: 'planned',\n      status_category: 'unstarted',\n      label: 'Planned',\n      description:\n        'The release is defined and scheduled. Features are scoped but not all completed.',\n      transitions_to: ['in_progress'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'Features are being built. The release is open for development.',\n      transitions_to: ['shipped'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The release has been deployed to production and is available to users.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n\n/**\n * roadmap_item (Product Specification domain)\n *\n * A roadmap item tracks a planned deliverable over time. `deferred` is not\n * terminal; items can be rescheduled.\n */\nconst ROADMAP_ITEM_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'roadmap_item',\n  initial_phase: 'planned',\n  terminal_phases: ['shipped'],\n  phases: [\n    {\n      id: 'planned',\n      status_category: 'unstarted',\n      label: 'Planned',\n      description:\n        'The item is on the roadmap and scheduled for a future period.',\n      transitions_to: ['in_progress', 'deferred'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'Work on this roadmap item is underway.',\n      transitions_to: ['shipped', 'deferred'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The roadmap item has been delivered.',\n      transitions_to: [],\n    },\n    {\n      id: 'deferred',\n      status_category: 'backlog',\n      label: 'Deferred',\n      description:\n        'The item has been pushed to a later period. It remains on the roadmap.',\n      transitions_to: ['planned'],\n    },\n  ],\n}\n\n/**\n * ip_asset (Legal domain)\n *\n * An IP asset (patent, trademark, copyright, trade secret) follows a\n * legal filing lifecycle. `expired` and `abandoned` are both terminal.\n * Note: copyright has no filing phase; it may start at `pending` or `granted`.\n */\nconst IP_ASSET_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'ip_asset',\n  initial_phase: 'filed',\n  terminal_phases: ['expired', 'abandoned'],\n  phases: [\n    {\n      id: 'filed',\n      status_category: 'started',\n      label: 'Filed',\n      description:\n        'The IP application has been submitted to the relevant authority. Acknowledgement of filing is pending.',\n      transitions_to: ['pending', 'abandoned'],\n    },\n    {\n      id: 'pending',\n      status_category: 'started',\n      label: 'Pending',\n      description:\n        'The application has been acknowledged and is under examination by the relevant authority.',\n      transitions_to: ['granted', 'abandoned'],\n    },\n    {\n      id: 'granted',\n      status_category: 'completed',\n      label: 'Granted',\n      description:\n        'The IP right has been formally granted. Protection is in force.',\n      transitions_to: ['expired', 'abandoned'],\n    },\n    {\n      id: 'expired',\n      status_category: 'completed',\n      label: 'Expired',\n      description:\n        'The IP protection period has ended naturally.',\n      transitions_to: [],\n    },\n    {\n      id: 'abandoned',\n      status_category: 'cancelled',\n      label: 'Abandoned',\n      description:\n        'Abandoned: non-payment of renewal fees, withdrawal of the application, or a decision to stop defending it.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * contract (Legal domain)\n *\n * A contract moves through drafting, review, execution, and expiry.\n * `expired` and `terminated` are both terminal.\n */\nconst CONTRACT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'contract',\n  initial_phase: 'draft',\n  terminal_phases: ['expired', 'terminated'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The contract is being written. Terms are not yet agreed by all parties.',\n      transitions_to: ['in_review'],\n    },\n    {\n      id: 'in_review',\n      status_category: 'started',\n      label: 'In Review',\n      description:\n        'The draft is under review by legal counsel or the counterparty. Negotiations may be ongoing.',\n      transitions_to: ['signed', 'draft'],\n    },\n    {\n      id: 'signed',\n      status_category: 'completed',\n      label: 'Signed',\n      description:\n        'All parties have signed. The contract is executed and legally binding, but the effective period may not have started yet.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The contract is in its effective period. Obligations are in force.',\n      transitions_to: ['expired', 'terminated'],\n    },\n    {\n      id: 'expired',\n      status_category: 'completed',\n      label: 'Expired',\n      description:\n        'The contract has reached its end date naturally.',\n      transitions_to: [],\n    },\n    {\n      id: 'terminated',\n      status_category: 'cancelled',\n      label: 'Terminated',\n      description:\n        'Ended before natural expiry: mutual agreement, breach, or exercise of a termination clause.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * design_concept (Experience Design domain)\n *\n * A design concept progresses through refinement to selection or rejection.\n * The `refined` phase is optional; some concepts move directly from sketch to\n * a decision. Both `selected` and `rejected` are terminal.\n */\nconst DESIGN_CONCEPT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'design_concept',\n  initial_phase: 'sketched',\n  terminal_phases: ['selected', 'rejected'],\n  phases: [\n    {\n      id: 'sketched',\n      status_category: 'started',\n      label: 'Sketched',\n      description:\n        'The concept has been captured in early, rough form. It is an idea worth exploring but has not been refined or evaluated.',\n      transitions_to: ['refined', 'selected', 'rejected'],\n    },\n    {\n      id: 'refined',\n      status_category: 'started',\n      label: 'Refined',\n      description:\n        'The concept has been developed with more detail. It is being compared to other concepts in the selection process.',\n      transitions_to: ['selected', 'rejected'],\n    },\n    {\n      id: 'selected',\n      status_category: 'completed',\n      label: 'Selected',\n      description:\n        'This concept has been chosen to move forward into prototyping or implementation.',\n      transitions_to: [],\n    },\n    {\n      id: 'rejected',\n      status_category: 'cancelled',\n      label: 'Rejected',\n      description:\n        'This concept was evaluated and not selected. It is retained as a record of design exploration.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * brand_identity (Experience Design domain)\n *\n * A brand identity evolves through maturity stages from exploration to a\n * fully articulated system. `mature` is terminal.\n */\nconst BRAND_IDENTITY_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'brand_identity',\n  initial_phase: 'exploratory',\n  terminal_phases: ['mature'],\n  phases: [\n    {\n      id: 'exploratory',\n      status_category: 'started',\n      label: 'Exploratory',\n      description:\n        'The brand is in early formation. Names, values, visual directions, and positioning are being explored without commitment.',\n      transitions_to: ['defined'],\n    },\n    {\n      id: 'defined',\n      status_category: 'started',\n      label: 'Defined',\n      description:\n        'Core brand elements have been decided. Name, values, visual identity, and voice are articulated. The brand is being applied but may still be evolving.',\n      transitions_to: ['mature'],\n    },\n    {\n      id: 'mature',\n      status_category: 'completed',\n      label: 'Mature',\n      description:\n        'The brand identity is fully articulated and consistently applied. Guidelines are documented and followed across all touchpoints.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * screen (Experience Design domain)\n *\n * UPG-690 Q3 (0.21.0): screen was `fromTemplate('screen', MATURITY_TEMPLATE)`\n * (alpha/beta/ga/deprecated) with a shadow `screen_status` property carrying\n * the entity's actual build-pipeline state (draft/in_design/built/shipped/\n * deprecated). MATURITY answers \"how proven is this design surface as a\n * concept\"; that's not the axis teams track for a screen. What teams actually\n * track is where the screen sits in the build pipeline: has it been designed,\n * built, and shipped. This lifecycle promotes that pipeline to the primary\n * phase chain and collapses `screen_status` onto base `status`\n * (UPG_PROPERTY_MIGRATIONS['0.21.0']). `deprecated` is terminal.\n */\nconst SCREEN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'screen',\n  initial_phase: 'draft',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The screen is a rough idea: named and scoped, but not yet worked in a design tool.',\n      transitions_to: ['in_design'],\n    },\n    {\n      id: 'in_design',\n      status_category: 'started',\n      label: 'In Design',\n      description:\n        'The screen is being designed: wireframes, mockups, or prototypes are in progress. May fall back to `draft` if the approach is rethought from scratch.',\n      transitions_to: ['built', 'draft'],\n    },\n    {\n      id: 'built',\n      status_category: 'started',\n      label: 'Built',\n      description:\n        'The screen has been implemented in code. It exists in a build but is not yet live for users. May return to `in_design` if implementation surfaces a design gap.',\n      transitions_to: ['shipped', 'in_design'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The screen is live in production and reachable by users.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The screen has been retired. It is no longer reachable, or is being phased out in favour of a replacement.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * surface (Experience Design domain)\n *\n * The same build-pipeline chain as `screen`, deliberately. A surface is the\n * same kind of artefact one level finer: a place that gets named, designed,\n * implemented, shipped, and eventually retired. Adopting SCREEN_LIFECYCLE's\n * phases verbatim means a screen and the surfaces inside it report progress on\n * one shared vocabulary, so \"which parts of this screen are still in design?\"\n * is answerable without translating between two ladders. MATURITY\n * (alpha/beta/ga) was rejected for `screen` in UPG-690 Q3 for the same reason\n * it is rejected here: it measures how proven a concept is, not where the thing\n * sits in the pipeline. Retirement pairs with `surface_supersedes_surface`,\n * which names the replacement.\n */\nconst SURFACE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'surface',\n  initial_phase: 'draft',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The surface is a rough idea: named and scoped, but not yet worked in a design tool. Its occupants and arbitration rule are usually still undecided.',\n      transitions_to: ['in_design'],\n    },\n    {\n      id: 'in_design',\n      status_category: 'started',\n      label: 'In Design',\n      description:\n        'The surface is being designed: its dimensions, occupants, and arbitration rule are being settled. May fall back to `draft` if the approach is rethought from scratch.',\n      transitions_to: ['built', 'draft'],\n    },\n    {\n      id: 'built',\n      status_category: 'started',\n      label: 'Built',\n      description:\n        'The surface has been implemented in code. It exists in a build but is not yet live for users. May return to `in_design` if implementation surfaces a layout or contention gap.',\n      transitions_to: ['shipped', 'in_design'],\n    },\n    {\n      id: 'shipped',\n      status_category: 'completed',\n      label: 'Shipped',\n      description:\n        'The surface is live in production and reachable by users. Its occupants are the real guest list.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The surface has been retired. Its occupants have moved elsewhere, or a replacement has taken the place; record the replacement with `surface_supersedes_surface`.',\n      transitions_to: [],\n    },\n  ],\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Engineering & Operations\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * service (Engineering domain)\n *\n * A service progresses through deployment stages from development to production.\n * `deprecated` is terminal.\n */\nconst SERVICE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'service',\n  initial_phase: 'development',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'development',\n      status_category: 'started',\n      label: 'Development',\n      description:\n        'The service is being built. It is not available in any shared environment.',\n      transitions_to: ['staging'],\n    },\n    {\n      id: 'staging',\n      status_category: 'started',\n      label: 'Staging',\n      description:\n        'The service is deployed to a staging environment for integration testing and pre-release validation.',\n      transitions_to: ['production', 'development'],\n    },\n    {\n      id: 'production',\n      status_category: 'started',\n      label: 'Production',\n      description:\n        'The service is live and serving real users.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The service is being phased out. A successor service is in place or the capability is no longer needed.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * deployment (Engineering domain)\n *\n * A deployment has a binary outcome lifecycle. It either succeeds or fails.\n * Both `success` and `failure` are terminal; deployments are immutable events.\n * A new deployment is created for retries.\n */\nconst DEPLOYMENT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'deployment',\n  initial_phase: 'rolling',\n  terminal_phases: ['success', 'failure'],\n  phases: [\n    {\n      id: 'rolling',\n      status_category: 'started',\n      label: 'Rolling',\n      description:\n        'The deployment is in progress. Instances are being updated. Not all traffic has shifted yet.',\n      transitions_to: ['success', 'failure'],\n    },\n    {\n      id: 'success',\n      status_category: 'completed',\n      label: 'Success',\n      description:\n        'The deployment completed successfully. All instances are running the new version.',\n      transitions_to: [],\n    },\n    {\n      id: 'failure',\n      status_category: 'completed',\n      label: 'Failure',\n      description:\n        'The deployment failed or was rolled back. The previous version is restored.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * feature_flag (Engineering domain)\n *\n * A feature flag controls rollout. It starts off, graduates through partial\n * rollout, and can be fully enabled or rolled back. `on` is the positive terminal.\n */\nconst FEATURE_FLAG_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'feature_flag',\n  initial_phase: 'off',\n  terminal_phases: ['on'],\n  phases: [\n    {\n      id: 'off',\n      status_category: 'backlog',\n      label: 'Off',\n      description:\n        'The flag is disabled. The associated feature or code path is not active for any users.',\n      transitions_to: ['rollout', 'on'],\n    },\n    {\n      id: 'rollout',\n      status_category: 'started',\n      label: 'Rollout',\n      description:\n        'The flag is partially enabled. A percentage of users or a target segment has access.',\n      transitions_to: ['on', 'off'],\n    },\n    {\n      id: 'on',\n      status_category: 'completed',\n      label: 'On',\n      description:\n        'The flag is fully enabled for all users. The feature is live. The flag can be cleaned up.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * investigation (Engineering domain)\n *\n * An investigation is a structured enquiry into a problem. `resolved` and\n * `abandoned` are both terminal.\n */\nconst INVESTIGATION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'investigation',\n  initial_phase: 'open',\n  terminal_phases: ['resolved', 'abandoned'],\n  phases: [\n    {\n      id: 'open',\n      status_category: 'triage',\n      label: 'Open',\n      description:\n        'The investigation has been opened. A problem has been identified but not yet actively worked.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The investigation is being actively worked. Evidence is being gathered and hypotheses are being tested.',\n      transitions_to: ['paused', 'resolved', 'abandoned'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'On hold: awaiting additional data, unblocking conditions, or reprioritisation.',\n      transitions_to: ['active', 'abandoned'],\n    },\n    {\n      id: 'resolved',\n      status_category: 'completed',\n      label: 'Resolved',\n      description:\n        'Root cause has been identified and documented. The investigation is closed.',\n      transitions_to: [],\n    },\n    {\n      id: 'abandoned',\n      status_category: 'cancelled',\n      label: 'Abandoned',\n      description:\n        'Closed without resolution: the problem could not be reproduced, was deemed not worth pursuing, or became moot.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * external_api (Engineering domain)\n *\n * An external API has availability states that affect dependent services.\n * `unavailable` is terminal; applied when a third-party API is permanently shut down.\n */\nconst EXTERNAL_API_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'external_api',\n  initial_phase: 'beta',\n  terminal_phases: ['unavailable'],\n  phases: [\n    {\n      id: 'beta',\n      status_category: 'started',\n      label: 'Beta',\n      description:\n        'The API is available for early access or testing. It may be unstable and subject to breaking changes.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The API is stable and in production use. The provider guarantees availability per their SLA.',\n      transitions_to: ['deprecated', 'unavailable'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'started',\n      label: 'Deprecated',\n      description:\n        'The provider has announced end-of-life. The API still works but a migration to a successor is required.',\n      transitions_to: ['unavailable'],\n    },\n    {\n      id: 'unavailable',\n      status_category: 'completed',\n      label: 'Unavailable',\n      description:\n        'The API is no longer accessible. Any dependent service is broken until migrated.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * database_schema (Engineering domain)\n *\n * A database schema cycles between stable and pending-migration states.\n * `failed` is a temporary terminal that blocks until the issue is fixed\n * (which produces a new migration, restoring to `pending`).\n */\nconst DATABASE_SCHEMA_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'database_schema',\n  initial_phase: 'current',\n  terminal_phases: [],\n  phases: [\n    {\n      id: 'current',\n      status_category: 'started',\n      label: 'Current',\n      description:\n        'The schema is up to date with the applied migrations. No pending changes.',\n      transitions_to: ['pending'],\n    },\n    {\n      id: 'pending',\n      status_category: 'unstarted',\n      label: 'Pending',\n      description:\n        'A migration is queued and ready to run. The schema will change when it is applied.',\n      transitions_to: ['current', 'failed'],\n    },\n    {\n      id: 'failed',\n      status_category: 'completed',\n      label: 'Failed',\n      description:\n        'A migration failed during application. The schema is in an inconsistent state and requires remediation before further changes can be applied.',\n      transitions_to: ['pending'],\n    },\n  ],\n}\n\n/**\n * incident (DevOps & Platform domain)\n *\n * An incident has a response lifecycle. `resolved` is the primary terminal.\n * `mitigated` is a secondary terminal used when a compensating control is in\n * place but the root cause has not been permanently fixed.\n */\nconst INCIDENT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'incident',\n  initial_phase: 'detected',\n  terminal_phases: ['resolved', 'mitigated'],\n  phases: [\n    {\n      id: 'detected',\n      status_category: 'triage',\n      label: 'Detected',\n      description:\n        'Identified by an alert, a user report, or direct observation. Response has not yet started.',\n      transitions_to: ['triaged'],\n    },\n    {\n      id: 'triaged',\n      status_category: 'triage',\n      label: 'Triaged',\n      description:\n        'The incident has been assessed for severity and impact. An on-call responder is assigned and is actively working it.',\n      transitions_to: ['contained'],\n    },\n    {\n      id: 'contained',\n      status_category: 'started',\n      label: 'Contained',\n      description:\n        'Immediate user impact stopped via rollback, circuit breaker, or another emergency measure. Root cause fix is still pending.',\n      transitions_to: ['resolved', 'mitigated'],\n    },\n    {\n      id: 'resolved',\n      status_category: 'completed',\n      label: 'Resolved',\n      description:\n        'Root cause has been identified and fixed. The system is back to normal. A postmortem is recommended.',\n      transitions_to: [],\n    },\n    {\n      id: 'mitigated',\n      status_category: 'completed',\n      label: 'Mitigated',\n      description:\n        'A compensating control is in place and user impact is stopped, but the root cause remains unfixed. A follow-up investigation or fix is required.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * security_control (Security domain)\n *\n * A security control progresses from planning through implementation and\n * verification. `verified` is terminal.\n */\nconst SECURITY_CONTROL_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'security_control',\n  initial_phase: 'planned',\n  terminal_phases: ['verified'],\n  phases: [\n    {\n      id: 'planned',\n      status_category: 'unstarted',\n      label: 'Planned',\n      description:\n        'The control has been identified as required but implementation has not started.',\n      transitions_to: ['in_progress'],\n    },\n    {\n      id: 'in_progress',\n      status_category: 'started',\n      label: 'In Progress',\n      description:\n        'The control is being implemented.',\n      transitions_to: ['implemented'],\n    },\n    {\n      id: 'implemented',\n      status_category: 'started',\n      label: 'Implemented',\n      description:\n        'The control is in place. It has not yet been independently tested or verified.',\n      transitions_to: ['verified', 'in_progress'],\n    },\n    {\n      id: 'verified',\n      status_category: 'completed',\n      label: 'Verified',\n      description:\n        'The control has been tested and confirmed effective. It provides the intended security assurance.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * data_pipeline (Data & Analytics domain)\n *\n * A data pipeline moves from construction through active operation.\n * `deprecated` is terminal. `failed` is a blocking operational state\n * that must be resolved before the pipeline returns to `active`.\n */\nconst DATA_PIPELINE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'data_pipeline',\n  initial_phase: 'building',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'building',\n      status_category: 'started',\n      label: 'Building',\n      description:\n        'The pipeline is under construction. It is not yet processing real data.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The pipeline is running and processing data on its defined schedule.',\n      transitions_to: ['paused', 'failed', 'deprecated'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'Deliberately suspended: maintenance, cost control, or upstream data unavailability.',\n      transitions_to: ['active', 'deprecated'],\n    },\n    {\n      id: 'failed',\n      status_category: 'started',\n      label: 'Failed',\n      description:\n        'The pipeline has errored and is not processing data. Intervention is required to restore it.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The pipeline is being retired. It is no longer maintained and will be shut down.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * ai_model (AI & Machine Learning domain)\n *\n * An AI model progresses through a deployment lifecycle from evaluation to\n * retirement. All stages can transition to `retired` for emergency removal.\n */\nconst AI_MODEL_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'ai_model',\n  initial_phase: 'evaluating',\n  terminal_phases: ['retired'],\n  phases: [\n    {\n      id: 'evaluating',\n      status_category: 'started',\n      label: 'Evaluating',\n      description:\n        'The model is being assessed for quality, cost, safety, and fit. Eval runs are being analysed. No production traffic.',\n      transitions_to: ['staging', 'retired'],\n    },\n    {\n      id: 'staging',\n      status_category: 'started',\n      label: 'Staging',\n      description:\n        'The model has passed evaluation and is deployed to a staging environment for integration testing.',\n      transitions_to: ['production', 'evaluating', 'retired'],\n    },\n    {\n      id: 'production',\n      status_category: 'started',\n      label: 'Production',\n      description:\n        'The model is serving live product traffic.',\n      transitions_to: ['deprecated', 'retired'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'started',\n      label: 'Deprecated',\n      description:\n        'A successor model is in production. This model is being phased out. Traffic is being migrated.',\n      transitions_to: ['retired'],\n    },\n    {\n      id: 'retired',\n      status_category: 'completed',\n      label: 'Retired',\n      description:\n        'The model is fully decommissioned. No traffic. Historical records are preserved.',\n      transitions_to: [],\n    },\n  ],\n}\n\n\n/**\n * workflow_run (Agentic Workflows domain)\n *\n * A workflow run is a single execution of a workflow template. `blocked` is a\n * waiting state when a review_gate is pending. `cancelled` can occur from any\n * non-terminal state.\n */\nconst WORKFLOW_RUN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'workflow_run',\n  initial_phase: 'pending',\n  terminal_phases: ['completed', 'failed', 'cancelled'],\n  phases: [\n    {\n      id: 'pending',\n      status_category: 'unstarted',\n      label: 'Pending',\n      description:\n        'The run has been queued and is awaiting execution. Resources or dependencies are being provisioned.',\n      transitions_to: ['running', 'cancelled'],\n    },\n    {\n      id: 'running',\n      status_category: 'started',\n      label: 'Running',\n      description:\n        'The workflow is actively executing its steps.',\n      transitions_to: ['blocked', 'completed', 'failed', 'cancelled'],\n    },\n    {\n      id: 'blocked',\n      status_category: 'started',\n      label: 'Blocked',\n      description:\n        'Execution is paused at a review_gate awaiting human or automated approval before proceeding.',\n      transitions_to: ['running', 'cancelled'],\n    },\n    {\n      id: 'completed',\n      status_category: 'completed',\n      label: 'Completed',\n      description:\n        'All steps executed successfully. Outputs are available.',\n      transitions_to: [],\n    },\n    {\n      id: 'failed',\n      status_category: 'completed',\n      label: 'Failed',\n      description:\n        'The run encountered an unrecoverable error and stopped. Partial outputs may be available.',\n      transitions_to: [],\n    },\n    {\n      id: 'cancelled',\n      status_category: 'cancelled',\n      label: 'Cancelled',\n      description:\n        'The run was deliberately stopped before completion.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * agent_definition (Agentic Workflows domain)\n *\n * An agent definition has an operational lifecycle from testing through active\n * service to retirement. `retired` is terminal.\n */\nconst AGENT_DEFINITION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'agent_definition',\n  initial_phase: 'testing',\n  terminal_phases: ['retired'],\n  phases: [\n    {\n      id: 'testing',\n      status_category: 'started',\n      label: 'Testing',\n      description:\n        'The agent is being validated in a controlled environment. Sessions are not running against real product data.',\n      transitions_to: ['active', 'disabled'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The agent is operational and creating sessions on demand.',\n      transitions_to: ['paused', 'disabled', 'retired'],\n    },\n    {\n      id: 'paused',\n      status_category: 'backlog',\n      label: 'Paused',\n      description:\n        'The agent is temporarily suspended. It is not creating new sessions but its configuration is preserved.',\n      transitions_to: ['active', 'retired'],\n    },\n    {\n      id: 'disabled',\n      status_category: 'backlog',\n      label: 'Disabled',\n      description:\n        'Turned off: bug, policy change, or safety concern. Can be re-enabled after remediation.',\n      transitions_to: ['testing', 'active', 'retired'],\n    },\n    {\n      id: 'retired',\n      status_category: 'completed',\n      label: 'Retired',\n      description:\n        'The agent has been permanently decommissioned. Sessions are no longer created from this definition.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * agent_session (Agentic Workflows domain)\n *\n * An agent session is a single interaction period. All terminal states are\n * final; sessions do not restart. A new session is created instead.\n */\nconst AGENT_SESSION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'agent_session',\n  initial_phase: 'active',\n  terminal_phases: ['completed', 'crashed', 'timed_out'],\n  phases: [\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The session is running. The agent is processing input and producing output.',\n      transitions_to: ['completed', 'crashed', 'timed_out'],\n    },\n    {\n      id: 'completed',\n      status_category: 'completed',\n      label: 'Completed',\n      description:\n        'The session ended normally. The task was completed or the conversation was concluded.',\n      transitions_to: [],\n    },\n    {\n      id: 'crashed',\n      status_category: 'completed',\n      label: 'Crashed',\n      description:\n        'The session terminated unexpectedly due to an unhandled error or infrastructure failure.',\n      transitions_to: [],\n    },\n    {\n      id: 'timed_out',\n      status_category: 'completed',\n      label: 'Timed Out',\n      description:\n        'The session exceeded its maximum allowed duration and was automatically terminated.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * review_gate (Agentic Workflows domain)\n *\n * A review gate is a checkpoint in a workflow that requires approval.\n * `approved` and `bypassed` are terminal. `rejected` can be re-submitted.\n */\nconst REVIEW_GATE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'review_gate',\n  initial_phase: 'pending',\n  terminal_phases: ['approved', 'bypassed'],\n  phases: [\n    {\n      id: 'pending',\n      status_category: 'unstarted',\n      label: 'Pending',\n      description:\n        'The gate is awaiting review. The workflow is blocked until a decision is made.',\n      transitions_to: ['approved', 'rejected', 'bypassed'],\n    },\n    {\n      id: 'approved',\n      status_category: 'completed',\n      label: 'Approved',\n      description:\n        'The gate has been passed. The workflow continues.',\n      transitions_to: [],\n    },\n    {\n      id: 'rejected',\n      status_category: 'cancelled',\n      label: 'Rejected',\n      description:\n        'The gate was not passed. The workflow is blocked and the submitter must address the feedback before re-submitting.',\n      transitions_to: ['pending'],\n    },\n    {\n      id: 'bypassed',\n      status_category: 'cancelled',\n      label: 'Bypassed',\n      description:\n        'Deliberately overridden without normal review by an authorised person in an emergency. Create an audit trail entry.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * test_suite (Quality Assurance domain)\n *\n * A test suite moves from authoring through active use to deprecation.\n * `deprecated` is terminal; superseded test suites are not deleted but\n * are no longer run as part of CI.\n */\nconst TEST_SUITE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'test_suite',\n  initial_phase: 'draft',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The test suite is being authored. It is not yet part of any CI or QA process.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The suite is running in CI or scheduled QA processes.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The suite is no longer being run. It may be superseded by a newer suite or the tested functionality may have been removed.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * test_case (Quality Assurance domain)\n *\n * A test case moves from authoring through active use to deprecation.\n * `deprecated` is terminal.\n */\nconst TEST_CASE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'test_case',\n  initial_phase: 'draft',\n  terminal_phases: ['deprecated'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The test case is being written. Preconditions, steps, and expected results are being defined.',\n      transitions_to: ['active'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The test case is included in one or more test suites and is being executed.',\n      transitions_to: ['deprecated'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'completed',\n      label: 'Deprecated',\n      description:\n        'The test case is no longer executed. The feature it covered may have changed or been removed.',\n      transitions_to: [],\n    },\n  ],\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Phase B hand-authored lifecycles\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Research + Validation ────────────────────────────────────────────────────\n\n/**\n * insight (UX Research domain)\n *\n * Insights synthesise observations into product knowledge. proposed\n * (raw synthesis) → validated (cross-checked) → applied (drove a\n * decision) → retired (superseded). Validated and applied are both\n * \"settled\" terminals; retired is end-of-life.\n */\nconst INSIGHT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'insight',\n  initial_phase: 'proposed',\n  terminal_phases: ['applied', 'retired'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'A pattern has been synthesised from observations. Not yet cross-checked.', transitions_to: ['validated', 'retired'] },\n    { id: 'validated', status_category: 'started', label: 'Validated', description: 'The insight has been cross-checked against additional evidence. Believed reliable.', transitions_to: ['applied', 'retired'] },\n    { id: 'applied', status_category: 'completed', label: 'Applied', description: 'The insight drove a product decision. Captured for the record.', transitions_to: ['retired'] },\n    { id: 'retired', status_category: 'completed', label: 'Retired', description: 'Superseded by newer insight, or no longer relevant. May reopen to proposed if revisited.', transitions_to: ['proposed'] },\n  ],\n}\n\n/**\n * research_question (UX Research domain)\n *\n * Open → researching → answered or parked. Mirrors the DISCOVERY template\n * shape but stays hand-authored because the question→answer loop has\n * domain-specific semantics distinct from generic discovery.\n */\nconst RESEARCH_QUESTION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'research_question',\n  initial_phase: 'open',\n  terminal_phases: ['answered', 'parked'],\n  phases: [\n    { id: 'open', status_category: 'triage', label: 'Open', description: 'Question has been articulated. Research has not started.', transitions_to: ['researching', 'parked'] },\n    { id: 'researching', status_category: 'started', label: 'Researching', description: 'Active investigation. Methods are being run, evidence is being gathered.', transitions_to: ['answered', 'parked'] },\n    { id: 'answered', status_category: 'completed', label: 'Answered', description: 'Question has been resolved. Findings captured in linked insights.', transitions_to: [] },\n    { id: 'parked', status_category: 'backlog', label: 'Parked', description: 'Set aside due to capacity, priority, or dependency. May reopen to researching.', transitions_to: ['researching'] },\n  ],\n}\n\n/**\n * interview_guide (UX Research domain)\n *\n * Drafting → ready → in_use → archived. Has an `in_use` working state\n * between ready and archived because guides circulate through multiple\n * studies before retirement.\n */\nconst INTERVIEW_GUIDE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'interview_guide',\n  initial_phase: 'drafting',\n  terminal_phases: ['archived'],\n  phases: [\n    { id: 'drafting', status_category: 'started', label: 'Drafting', description: 'Guide is being authored or revised. Not yet ready for use.', transitions_to: ['ready'] },\n    { id: 'ready', status_category: 'unstarted', label: 'Ready', description: 'Guide is approved for use. May be picked up by a study.', transitions_to: ['in_use', 'drafting'] },\n    { id: 'in_use', status_category: 'started', label: 'In Use', description: 'Currently being run in one or more research_study entities.', transitions_to: ['ready', 'archived'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'Retired from active use. May reopen to drafting if revived.', transitions_to: ['drafting'] },\n  ],\n}\n\n/**\n * test_plan (Validation domain)\n *\n * Drafted → executing → completed or cancelled. Plans get cancelled\n * mid-execution when the underlying assumption changes; that's a real\n * outcome, not a failure to complete.\n */\nconst TEST_PLAN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'test_plan',\n  initial_phase: 'drafted',\n  terminal_phases: ['completed', 'cancelled'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Plan has been authored. Not yet started.', transitions_to: ['executing', 'cancelled'] },\n    { id: 'executing', status_category: 'started', label: 'Executing', description: 'Tests are running according to the plan.', transitions_to: ['completed', 'cancelled'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'All tests in the plan have run. Outcomes captured in linked test_result entities.', transitions_to: ['executing'] },\n    { id: 'cancelled', status_category: 'cancelled', label: 'Cancelled', description: 'Plan was abandoned mid-flight: assumption changed, priorities shifted, or the underlying code went away.', transitions_to: [] },\n  ],\n}\n\n\n// ── AI workflow ──────────────────────────────────────────────────────────────\n\n\n/**\n * ai_dataset (AI domain)\n *\n * Datasets evolve through collection and curation, then get versioned\n * for reproducibility. Versioned is \"settled and citable\"; archived is\n * end-of-life. May reopen for further collection.\n */\nconst AI_DATASET_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'ai_dataset',\n  initial_phase: 'collecting',\n  terminal_phases: ['versioned', 'archived'],\n  phases: [\n    { id: 'collecting', status_category: 'started', label: 'Collecting', description: 'Examples are being gathered. Schema and labelling rules may still be in flux.', transitions_to: ['curated', 'archived'] },\n    { id: 'curated', status_category: 'started', label: 'Curated', description: 'Examples have been cleaned, deduped, and labelled. Ready for versioning.', transitions_to: ['versioned', 'collecting'] },\n    { id: 'versioned', status_category: 'completed', label: 'Versioned', description: 'A specific cut has been pinned and is citable. New collection continues in a successor version.', transitions_to: ['archived'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'No longer in active use. May reopen to collecting if revived.', transitions_to: ['collecting'] },\n  ],\n}\n\n/**\n * ai_guardrail (AI domain)\n *\n * Three terminals: guardrails settle to active, relaxed, or removed.\n * Each is a recognised steady state with different operational meaning,\n * so all three are terminal rather than waypoints to a single \"closed\"\n * terminal.\n */\nconst AI_GUARDRAIL_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'ai_guardrail',\n  initial_phase: 'proposed',\n  terminal_phases: ['active', 'relaxed', 'removed'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'Guardrail has been suggested. Not yet enforced.', transitions_to: ['active', 'removed'] },\n    { id: 'active', status_category: 'started', label: 'Active', description: 'Guardrail is enforced as designed. Currently the steady state.', transitions_to: ['relaxed', 'removed'] },\n    { id: 'relaxed', status_category: 'started', label: 'Relaxed', description: 'Guardrail is enforced more loosely than originally specified. Captured separately because the looser form has different implications.', transitions_to: ['active', 'removed'] },\n    { id: 'removed', status_category: 'cancelled', label: 'Removed', description: 'Guardrail is no longer enforced. May reopen to active if reinstated.', transitions_to: ['active'] },\n  ],\n}\n\n\n/**\n * model_comparison (AI domain)\n *\n * Mirrors test plan shape. Planned → running → published or archived.\n * Comparisons are reproducible reports; published is the citable\n * terminal. May reopen for re-runs when models update.\n */\nconst MODEL_COMPARISON_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'model_comparison',\n  initial_phase: 'planned',\n  terminal_phases: ['published', 'archived'],\n  phases: [\n    { id: 'planned', status_category: 'unstarted', label: 'Planned', description: 'Comparison has been scoped: models, criteria, and methodology are agreed.', transitions_to: ['running', 'archived'] },\n    { id: 'running', status_category: 'started', label: 'Running', description: 'Models are being evaluated against the chosen criteria.', transitions_to: ['published', 'archived'] },\n    { id: 'published', status_category: 'completed', label: 'Published', description: 'Results are written up and citable. Drives downstream model selection.', transitions_to: ['archived', 'planned'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'Superseded by newer comparison. May reopen to planned if re-run.', transitions_to: ['planned'] },\n  ],\n}\n\n/**\n * prompt_version (AI domain)\n *\n * Drafted → testing → active → deprecated. Active means \"in production\";\n * deprecated means \"still works but a successor exists.\" Testing is the\n * vetting state before promotion to active.\n */\nconst PROMPT_VERSION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'prompt_version',\n  initial_phase: 'drafted',\n  terminal_phases: ['active', 'deprecated'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Prompt has been authored. Not yet evaluated.', transitions_to: ['testing', 'deprecated'] },\n    { id: 'testing', status_category: 'started', label: 'Testing', description: 'Running through eval benchmarks. Results inform whether to promote.', transitions_to: ['active', 'drafted', 'deprecated'] },\n    { id: 'active', status_category: 'started', label: 'Active', description: 'In production use.', transitions_to: ['deprecated'] },\n    { id: 'deprecated', status_category: 'completed', label: 'Deprecated', description: 'Superseded by a successor version. Still available for backwards-compat. May reopen to testing if reinstated.', transitions_to: ['testing'] },\n  ],\n}\n\n/**\n * eval_benchmark (AI domain)\n *\n * Drafted → running → published → deprecated. Published is the citable\n * terminal; deprecated covers \"this benchmark no longer reflects what\n * we measure.\" Reopen path lets retired benchmarks be revived.\n */\nconst EVAL_BENCHMARK_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'eval_benchmark',\n  initial_phase: 'drafted',\n  terminal_phases: ['published', 'deprecated'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Benchmark questions and scoring rubric are being designed.', transitions_to: ['running', 'deprecated'] },\n    { id: 'running', status_category: 'started', label: 'Running', description: 'Benchmark is being executed against models or prompt versions.', transitions_to: ['published', 'deprecated'] },\n    { id: 'published', status_category: 'completed', label: 'Published', description: 'Results are citable. Benchmark is part of the standard eval rotation.', transitions_to: ['deprecated', 'running'] },\n    { id: 'deprecated', status_category: 'completed', label: 'Deprecated', description: 'Benchmark no longer reflects what the team measures. May reopen to drafted if revisited.', transitions_to: ['drafted'] },\n  ],\n}\n\n// ── Business Model ──────────────────────────────────────────────────────────\n\n/**\n * business_model (Business Model domain)\n *\n * Drafted → testing → validated / invalidated / pivoted. Three terminals\n * because pivoting is structurally different from validation success or\n * failure; a pivoted model became something else, not failed.\n */\nconst BUSINESS_MODEL_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'business_model',\n  initial_phase: 'drafted',\n  terminal_phases: ['validated', 'invalidated', 'pivoted'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Model has been articulated. Not yet tested in market.', transitions_to: ['testing', 'invalidated'] },\n    { id: 'testing', status_category: 'started', label: 'Testing', description: 'Model is being tested against real customers and revenue. Evidence is accumulating.', transitions_to: ['validated', 'invalidated', 'pivoted'] },\n    { id: 'validated', status_category: 'completed', label: 'Validated', description: 'Model holds up under real customer behaviour. Forms the operating basis.', transitions_to: ['testing', 'pivoted'] },\n    { id: 'invalidated', status_category: 'completed', label: 'Invalidated', description: 'Model failed to hold up. May reopen to drafted for a new attempt.', transitions_to: ['drafted'] },\n    { id: 'pivoted', status_category: 'cancelled', label: 'Pivoted', description: 'Model became something structurally different. Captured as a milestone before the new model takes over.', transitions_to: [] },\n  ],\n}\n\n\n/**\n * revenue_stream (Business Model domain)\n *\n * Mirrors product lifecycle pattern. Proposed → piloting → live →\n * sunset. Live is the operational terminal; sunset covers\n * decommissioning. Reopen from sunset to piloting if revived.\n */\nconst REVENUE_STREAM_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'revenue_stream',\n  initial_phase: 'proposed',\n  terminal_phases: ['live', 'sunset'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'Stream has been hypothesised. Not yet built or sold.', transitions_to: ['piloting', 'sunset'] },\n    { id: 'piloting', status_category: 'started', label: 'Piloting', description: 'Stream is being trialled with a limited audience. Pricing and packaging may still be in flux.', transitions_to: ['live', 'sunset'] },\n    { id: 'live', status_category: 'started', label: 'Live', description: 'Stream is generally available and generating revenue.', transitions_to: ['sunset'] },\n    { id: 'sunset', status_category: 'completed', label: 'Sunset', description: 'Stream is being wound down. May reopen to piloting if revived.', transitions_to: ['piloting'] },\n  ],\n}\n\n// ── Customer Success ─────────────────────────────────────────────────────────\n\n\n\n/**\n * customer_health_score (Customer Success domain)\n *\n * Dynamic state machine: health flows back and forth between\n * monitoring, at_risk, critical until terminal. Recovered and churned\n * are both terminal but represent opposite outcomes; recovered may\n * reopen to monitoring if conditions degrade again.\n */\nconst CUSTOMER_HEALTH_SCORE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'customer_health_score',\n  initial_phase: 'monitoring',\n  terminal_phases: ['recovered', 'churned'],\n  phases: [\n    { id: 'monitoring', status_category: 'started', label: 'Monitoring', description: 'Customer is healthy. Score is being tracked passively.', transitions_to: ['at_risk', 'churned', 'recovered'] },\n    { id: 'at_risk', status_category: 'started', label: 'At Risk', description: 'Signals indicate trouble. Customer Success has flagged the account for attention.', transitions_to: ['monitoring', 'critical', 'churned', 'recovered'] },\n    { id: 'critical', status_category: 'started', label: 'Critical', description: 'Customer is on the verge of churning. Active intervention is underway.', transitions_to: ['at_risk', 'recovered', 'churned'] },\n    { id: 'recovered', status_category: 'completed', label: 'Recovered', description: 'Customer health has returned to monitoring. Captured as a milestone. May reopen to monitoring naturally.', transitions_to: ['monitoring'] },\n    { id: 'churned', status_category: 'cancelled', label: 'Churned', description: 'Customer left. Captured for analysis; reopen would mean a new customer relationship.', transitions_to: [] },\n  ],\n}\n\n/**\n * playbook (Customer Success domain)\n *\n * Drafted → tested → live → retired. Live is the operational terminal;\n * retired covers superseded playbooks. Reopen from retired allows\n * revival; tested → drafted allows iteration after live testing.\n */\nconst PLAYBOOK_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'playbook',\n  initial_phase: 'drafted',\n  terminal_phases: ['live', 'retired'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Playbook is being authored. Not yet tested with customers.', transitions_to: ['tested', 'retired'] },\n    { id: 'tested', status_category: 'started', label: 'Tested', description: 'Playbook has been run through pilot customers. Adjustments may follow.', transitions_to: ['live', 'drafted'] },\n    { id: 'live', status_category: 'started', label: 'Live', description: 'Playbook is in active use across the customer success team.', transitions_to: ['retired', 'tested'] },\n    { id: 'retired', status_category: 'completed', label: 'Retired', description: 'Playbook no longer in use. May reopen to drafted if revived.', transitions_to: ['drafted'] },\n  ],\n}\n\n// ── Team & Organisation ─────────────────────────────────────────────────────\n\n/**\n * team_okr (Team & Organisation domain)\n *\n * Drafted → committed → in_progress → completed or missed. Missed reopens\n * to in_progress when teams carry forward objectives across cycles.\n */\nconst TEAM_OKR_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'team_okr',\n  initial_phase: 'drafted',\n  terminal_phases: ['completed', 'missed'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'OKR is being authored. Not yet committed to.', transitions_to: ['committed'] },\n    { id: 'committed', status_category: 'unstarted', label: 'Committed', description: 'Team has agreed to pursue the OKR. Cycle has not yet started.', transitions_to: ['in_progress', 'drafted'] },\n    { id: 'in_progress', status_category: 'started', label: 'In Progress', description: 'Cycle is underway. Progress is being tracked.', transitions_to: ['completed', 'missed'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'OKR was achieved within the cycle.', transitions_to: [] },\n    { id: 'missed', status_category: 'completed', label: 'Missed', description: 'OKR was not achieved. May reopen to in_progress if carried forward.', transitions_to: ['in_progress'] },\n  ],\n}\n\n/**\n * retrospective (Team & Organisation domain)\n *\n * Two terminals: `completed` is the meeting itself; `actions_tracked` is\n * the follow-up state when retro actions are still being executed.\n * Tracking both keeps \"did the retro happen?\" separate from \"did we\n * actually do anything about it?\"\n */\nconst RETROSPECTIVE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'retrospective',\n  initial_phase: 'scheduled',\n  terminal_phases: ['completed', 'actions_tracked'],\n  phases: [\n    { id: 'scheduled', status_category: 'unstarted', label: 'Scheduled', description: 'Retro is on the calendar. Not yet held.', transitions_to: ['in_progress', 'completed'] },\n    { id: 'in_progress', status_category: 'started', label: 'In Progress', description: 'Retro is being held.', transitions_to: ['completed'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'Meeting is done. Action items captured but not yet tracked to closure.', transitions_to: ['actions_tracked'] },\n    { id: 'actions_tracked', status_category: 'completed', label: 'Actions Tracked', description: 'Retro action items have been completed or explicitly dropped. Full loop closed.', transitions_to: [] },\n  ],\n}\n\n/**\n * dependency (Team & Organisation domain)\n *\n * Identified → blocked → in_progress → resolved. Reopen from resolved\n * covers regressions where the dependency reappears.\n */\nconst DEPENDENCY_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'dependency',\n  initial_phase: 'identified',\n  terminal_phases: ['resolved'],\n  phases: [\n    { id: 'identified', status_category: 'triage', label: 'Identified', description: 'Dependency has been named. Not yet evaluated for impact.', transitions_to: ['blocked', 'in_progress', 'resolved'] },\n    { id: 'blocked', status_category: 'started', label: 'Blocked', description: 'Dependency is currently blocking work. Awaiting upstream action.', transitions_to: ['in_progress', 'resolved'] },\n    { id: 'in_progress', status_category: 'started', label: 'In Progress', description: 'Active work is happening to resolve the dependency.', transitions_to: ['blocked', 'resolved'] },\n    { id: 'resolved', status_category: 'completed', label: 'Resolved', description: 'Dependency is no longer blocking. May reopen to blocked if regression.', transitions_to: ['blocked'] },\n  ],\n}\n\n/**\n * role (Team & Organisation domain)\n *\n * Both `filled` and `vacant` are terminals; the role exists in either\n * state. Proposed and open are working states before settling. Reopen\n * from vacant to open is the typical hiring re-trigger.\n */\nconst ROLE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'role',\n  initial_phase: 'proposed',\n  terminal_phases: ['filled', 'vacant'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'Role has been described but not yet posted or staffed.', transitions_to: ['open', 'vacant'] },\n    { id: 'open', status_category: 'started', label: 'Open', description: 'Role is actively being recruited for.', transitions_to: ['filled', 'vacant'] },\n    { id: 'filled', status_category: 'completed', label: 'Filled', description: 'Role is staffed. May reopen to open if the position becomes vacant again.', transitions_to: ['vacant'] },\n    { id: 'vacant', status_category: 'backlog', label: 'Vacant', description: 'Role exists but is unfilled. May reopen to open to start recruiting.', transitions_to: ['open'] },\n  ],\n}\n\n/**\n * capacity_plan (Team & Organisation domain)\n *\n * Drafted → committed → in_flight → completed or revised. Revised\n * reopens to drafted for the next iteration of the plan.\n */\nconst CAPACITY_PLAN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'capacity_plan',\n  initial_phase: 'drafted',\n  terminal_phases: ['completed', 'revised'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Plan is being authored. Not yet agreed.', transitions_to: ['committed', 'revised'] },\n    { id: 'committed', status_category: 'unstarted', label: 'Committed', description: 'Plan has been agreed by stakeholders. Cycle has not yet started.', transitions_to: ['in_flight', 'revised'] },\n    { id: 'in_flight', status_category: 'started', label: 'In Flight', description: 'Cycle is underway. Capacity is being consumed.', transitions_to: ['completed', 'revised'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'Cycle is done. Plan executed as agreed.', transitions_to: [] },\n    { id: 'revised', status_category: 'completed', label: 'Revised', description: 'Plan was changed mid-flight. May reopen to drafted for the next iteration.', transitions_to: ['drafted'] },\n  ],\n}\n\n// ── Product & Growth ────────────────────────────────────────────────────────\n\n/**\n * variant (Growth domain)\n *\n * A/B-test variant. Three terminals (winning, losing, retired) because\n * each carries different downstream meaning (winning rolls out, losing\n * informs the next test, retired covers tests that ran inconclusively).\n */\nconst VARIANT_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'variant',\n  initial_phase: 'proposed',\n  terminal_phases: ['winning', 'losing', 'retired'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'Variant has been designed. Not yet running.', transitions_to: ['live', 'retired'] },\n    { id: 'live', status_category: 'started', label: 'Live', description: 'Variant is being shown to users as part of an active test.', transitions_to: ['winning', 'losing', 'retired'] },\n    { id: 'winning', status_category: 'completed', label: 'Winning', description: 'Variant beat the control. Captured for the record before rollout.', transitions_to: ['retired'] },\n    { id: 'losing', status_category: 'completed', label: 'Losing', description: 'Variant did not beat the control. Captured for the record.', transitions_to: ['retired'] },\n    { id: 'retired', status_category: 'completed', label: 'Retired', description: 'Variant is no longer running. May reopen to proposed if revisited in a future test.', transitions_to: ['proposed'] },\n  ],\n}\n\n/**\n * growth_campaign (Growth domain)\n *\n * Drafted → planning → live → completed or paused. Paused → live reopen\n * covers campaigns that resume after a temporary halt.\n */\nconst GROWTH_CAMPAIGN_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'growth_campaign',\n  initial_phase: 'drafted',\n  terminal_phases: ['completed', 'paused'],\n  phases: [\n    { id: 'drafted', status_category: 'unstarted', label: 'Drafted', description: 'Campaign concept exists. Not yet planned for launch.', transitions_to: ['planning', 'paused'] },\n    { id: 'planning', status_category: 'unstarted', label: 'Planning', description: 'Campaign creative, channels, and timing are being finalised.', transitions_to: ['live', 'paused'] },\n    { id: 'live', status_category: 'started', label: 'Live', description: 'Campaign is running across channels.', transitions_to: ['completed', 'paused'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'Campaign ran to completion. Outcomes captured.', transitions_to: [] },\n    { id: 'paused', status_category: 'backlog', label: 'Paused', description: 'Campaign was halted before completion. May reopen to live if resumed.', transitions_to: ['live'] },\n  ],\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Lifecycle Templates\n//\n// Reusable lifecycle patterns. Entity types that share the same progression\n// get a lifecycle generated from the template; no hand-authoring needed.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Create a lifecycle from a template for a specific entity type. */\nfunction fromTemplate(\n  entityType: string,\n  template: Omit<UPGLifecycle, 'entity_type'>,\n): UPGLifecycle {\n  return { entity_type: entityType, ...template }\n}\n\n/** Publishing: draft → review → published → archived */\nconst PUBLISHING_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'PUBLISHING',\n  initial_phase: 'draft',\n  terminal_phases: ['archived'],\n  phases: [\n    { id: 'draft', status_category: 'started', label: 'Draft', description: 'Being authored or revised. Not visible externally.', transitions_to: ['review'] },\n    { id: 'review', status_category: 'started', label: 'In Review', description: 'Under editorial or stakeholder review before publishing.', transitions_to: ['draft', 'published'] },\n    { id: 'published', status_category: 'completed', label: 'Published', description: 'Live and visible to the intended audience.', transitions_to: ['archived', 'draft'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'No longer current. Retained for historical reference.', transitions_to: ['draft'] },\n  ],\n}\n\n/** Operational: planning → active → completed → paused → sunset */\nconst OPERATIONAL_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'OPERATIONAL',\n  initial_phase: 'planning',\n  terminal_phases: ['completed', 'sunset'],\n  phases: [\n    { id: 'planning', status_category: 'unstarted', label: 'Planning', description: 'Being designed or scoped. Not yet started.', transitions_to: ['active'] },\n    { id: 'active', status_category: 'started', label: 'Active', description: 'Currently running or in operation.', transitions_to: ['paused', 'completed', 'sunset'] },\n    { id: 'paused', status_category: 'backlog', label: 'Paused', description: 'Temporarily halted. Can be resumed.', transitions_to: ['active', 'sunset'] },\n    { id: 'completed', status_category: 'completed', label: 'Completed', description: 'Finished successfully. Outcomes captured.', transitions_to: [] },\n    { id: 'sunset', status_category: 'completed', label: 'Sunset', description: 'Winding down or discontinued.', transitions_to: [] },\n  ],\n}\n\n/** Approval: proposed → reviewing → approved → rejected; approved → deprecated */\nconst APPROVAL_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'APPROVAL',\n  initial_phase: 'proposed',\n  // `deprecated` is a legitimate terminal; once something has been deprecated\n  // it does not normally progress anywhere. Transitions *out* of terminals\n  // (rejected → proposed, approved → deprecated) are late-state moves per the\n  // UPGLifecycle.terminal_phases contract.\n  terminal_phases: ['approved', 'rejected', 'deprecated'],\n  phases: [\n    { id: 'proposed', status_category: 'triage', label: 'Proposed', description: 'Submitted for consideration. Awaiting review.', transitions_to: ['reviewing'] },\n    { id: 'reviewing', status_category: 'started', label: 'Reviewing', description: 'Under active review by approvers.', transitions_to: ['approved', 'rejected', 'proposed'] },\n    { id: 'approved', status_category: 'completed', label: 'Approved', description: 'Accepted and ready for implementation.', transitions_to: ['deprecated'] },\n    { id: 'rejected', status_category: 'cancelled', label: 'Rejected', description: 'Not accepted. Reasons should be documented.', transitions_to: ['proposed'] },\n    { id: 'deprecated', status_category: 'completed', label: 'Deprecated', description: 'Previously approved but no longer current.', transitions_to: [] },\n  ],\n}\n\n/**\n * Work item: backlog → todo → in_progress → in_review → done, with a\n * `cancelled` off-ramp.\n *\n * `cancelled` (0.25.1 feedback 25db13af): work items get cancelled or closed as\n * duplicate/won't-do in source tools constantly, and `workflow_state_category`\n * needs a canonical phase to bucket those states into — parity with the\n * closed/wont_fix terminals the support-flow lifecycles already have. Reachable\n * from every non-terminal phase; `cancelled → todo` is the reopen path (a\n * late-state move per the `terminal_phases` contract, not forward progression).\n *\n * `backlog` (0.32.0): before this the template reached four of the six\n * {@link StatusCategory} buckets — `triage` and `backlog` were both unreachable\n * — and the consequence was measurable rather than theoretical. Importing a\n * 1,032-issue tracker, a source \"Backlog\" state normalised to a phase this\n * template does not have, and the importer omits what it cannot map rather than\n * approximating it, so roughly 195 issues arrived carrying NO status. The\n * largest single group of work on a real board had nowhere to land.\n *\n * NO `triage` PHASE, deliberately. The `triage` bucket stays reachable through\n * INCIDENT (`open`, `triaged`) and DISCOVERY, which is where triage is actually\n * practised. A task nobody has accepted is a task in `backlog`; adding a triage\n * phase for a state the evidence does not show in use would be minting dead\n * schema. Revisit on a field graph with a populated triage state.\n *\n * `initial_phase` DELIBERATELY STAYS `todo`. Moving it to `backlog` would change\n * what every existing graph's next node means, which is not an additive change\n * however additive the diff looks.\n *\n * TWO DIFFERENT SETS ARE BOTH CALLED \"WORK ITEM\", AND THEY ARE NOT THE SAME SET.\n * They overlap in exactly two members, so reasoning from one to the other is\n * wrong most of the time:\n *\n *   THIS LIFECYCLE (8 types): `task`, `epic`, `deliverable`, `milestone`,\n *   `success_milestone`, `invoice`, `lead`, `agent_task`. These are the types\n *   whose states are the phases below. `agent_skill` and `agent_hook` left this\n *   set at 0.33.0 for OPERATIONAL: a durable capability and an event trigger are\n *   not reviewed and accepted, they are run, paused and retired.\n *\n *   THE SCHEDULING FAMILY (5 types), the semantic domain named by the\n *   `work_item` token in `planning_cycle_schedules_work_item`: `feature`,\n *   `epic`, `user_story`, `task`, `bug`. These are the types a cadence\n *   schedules.\n *\n *   THE OVERLAP IS `epic` AND `task`, AND NOTHING ELSE. `bug` runs INCIDENT\n *   (`open`, `triaged`, `in_progress`, `resolved`, `closed`, `wont_fix`) and has\n *   no `backlog` phase at all; `feature` has its own lifecycle; `user_story` is\n *   deliberately lifecycle-free. In the other direction, `milestone`, `invoice`\n *   and `lead` run these phases but are not schedulable work.\n *\n * The conflation is not hypothetical. An editorial pass wrote that an untriaged\n * defect \"belongs in `backlog` rather than `todo`\", which is false for `bug` in\n * both halves, and the 0.32.0 changelog puts the `backlog` bullet six lines from\n * the `planning_cycle_schedules_work_item` bullet with both saying \"work item\".\n * Anyone reading either one alone will reach for the wrong set.\n */\nconst WORK_ITEM_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'WORK_ITEM',\n  initial_phase: 'todo',\n  terminal_phases: ['done', 'cancelled'],\n  phases: [\n    { id: 'backlog', status_category: 'backlog', label: 'Backlog', description: 'Accepted or set aside deliberately: real work, not scheduled. Distinct from `todo`, which is committed and merely not started.', transitions_to: ['todo', 'in_progress', 'cancelled'] },\n    { id: 'todo', status_category: 'unstarted', label: 'To Do', description: 'Identified but not yet started.', transitions_to: ['in_progress', 'backlog', 'cancelled'] },\n    { id: 'in_progress', status_category: 'started', label: 'In Progress', description: 'Actively being worked on.', transitions_to: ['in_review', 'todo', 'cancelled'] },\n    { id: 'in_review', status_category: 'started', label: 'In Review', description: 'Work completed, awaiting review or acceptance.', transitions_to: ['done', 'in_progress', 'cancelled'] },\n    { id: 'done', status_category: 'completed', label: 'Done', description: 'Completed and accepted.', transitions_to: [] },\n    { id: 'cancelled', status_category: 'cancelled', label: 'Cancelled', description: 'Deliberately closed without completion: won\\'t-do, duplicate, or obsolete. May reopen to `todo` if circumstances change.', transitions_to: ['todo'] },\n  ],\n}\n\n/** Discovery: open → exploring → resolved → parked */\nconst DISCOVERY_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'DISCOVERY',\n  initial_phase: 'open',\n  terminal_phases: ['resolved', 'parked'],\n  phases: [\n    { id: 'open', status_category: 'triage', label: 'Open', description: 'Identified as worth exploring. No work started yet.', transitions_to: ['exploring'] },\n    { id: 'exploring', status_category: 'started', label: 'Exploring', description: 'Actively being investigated or researched.', transitions_to: ['resolved', 'parked', 'open'] },\n    { id: 'resolved', status_category: 'completed', label: 'Resolved', description: 'Answered or addressed. Findings captured.', transitions_to: [] },\n    { id: 'parked', status_category: 'backlog', label: 'Parked', description: 'Set aside for now. May revisit later.', transitions_to: ['open'] },\n  ],\n}\n\n/** Maturity: alpha → beta → ga → deprecated */\nconst MATURITY_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'MATURITY',\n  initial_phase: 'alpha',\n  terminal_phases: ['deprecated'],\n  phases: [\n    { id: 'alpha', status_category: 'started', label: 'Alpha', description: 'Early stage, internal use only. Expect breaking changes.', transitions_to: ['beta'] },\n    { id: 'beta', status_category: 'started', label: 'Beta', description: 'Feature complete but may have rough edges. Limited external use.', transitions_to: ['ga', 'alpha'] },\n    { id: 'ga', status_category: 'completed', label: 'Generally Available', description: 'Stable, production-ready. Widely available.', transitions_to: ['deprecated'] },\n    { id: 'deprecated', status_category: 'completed', label: 'Deprecated', description: 'Scheduled for removal. Migration path should be documented.', transitions_to: [] },\n  ],\n}\n\n/**\n * Risk item: identified → assessed → mitigated / accepted / closed\n *\n * Three terminals: risks settle via different routes. `mitigated` means\n * action was taken. `accepted` means the risk is acknowledged but the cost\n * of mitigation outweighs the exposure. `closed` is for risks that became\n * irrelevant without action (e.g. the underlying threat went away).\n *\n * Reopen path: a closed risk can return to `assessed` if conditions change.\n */\nconst RISK_ITEM_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'RISK_ITEM',\n  initial_phase: 'identified',\n  terminal_phases: ['mitigated', 'accepted', 'closed'],\n  phases: [\n    { id: 'identified', status_category: 'triage', label: 'Identified', description: 'Risk has been recognised and named. Not yet assessed for likelihood or impact.', transitions_to: ['assessed'] },\n    { id: 'assessed', status_category: 'started', label: 'Assessed', description: 'Likelihood and impact have been evaluated. Outcome is one of mitigated, accepted, or closed.', transitions_to: ['mitigated', 'accepted', 'closed'] },\n    { id: 'mitigated', status_category: 'completed', label: 'Mitigated', description: 'Action has been taken to reduce likelihood or impact. The risk is no longer active.', transitions_to: [] },\n    { id: 'accepted', status_category: 'completed', label: 'Accepted', description: 'Risk is acknowledged. Cost of mitigation outweighs exposure; the team chooses to live with it.', transitions_to: [] },\n    { id: 'closed', status_category: 'completed', label: 'Closed', description: 'Risk became irrelevant without action; underlying conditions changed. May reopen to `assessed` if conditions change again.', transitions_to: ['assessed'] },\n  ],\n}\n\n/**\n * Sales deal: qualified → proposal → negotiation → closed_won / closed_lost\n *\n * Two terminals: every deal settles to either won or lost. `closed_lost`\n * does NOT reopen by convention; a re-engaged prospect becomes a new\n * `deal` rather than reviving the old one. This keeps win-rate analytics\n * clean.\n */\nconst SALES_DEAL_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'SALES_DEAL',\n  initial_phase: 'qualified',\n  terminal_phases: ['closed_won', 'closed_lost'],\n  phases: [\n    { id: 'qualified', status_category: 'triage', label: 'Qualified', description: 'Lead has been qualified: there\\'s a real budget, need, and decision-maker. Not yet pitched.', transitions_to: ['proposal'] },\n    { id: 'proposal', status_category: 'started', label: 'Proposal', description: 'A proposal has been delivered. Pricing and scope are on the table.', transitions_to: ['negotiation', 'closed_lost'] },\n    { id: 'negotiation', status_category: 'started', label: 'Negotiation', description: 'Terms are being finalised. Both sides are working toward agreement.', transitions_to: ['closed_won', 'closed_lost'] },\n    { id: 'closed_won', status_category: 'completed', label: 'Closed Won', description: 'Deal signed. Customer is now active.', transitions_to: [] },\n    { id: 'closed_lost', status_category: 'completed', label: 'Closed Lost', description: 'Deal did not close. A re-engaged prospect becomes a new `deal` rather than reviving this one.', transitions_to: [] },\n  ],\n}\n\n/**\n * Validation: untested → testing → validated / invalidated → archived\n *\n * The shared spine of \"a claim we test to a verdict.\" Members author a\n * hypothesis / assumption / prototype and drive it to a validated or\n * invalidated verdict; `archived` is a late-state terminal for a settled\n * claim retained for provenance. `invalidated → testing` is a late-state\n * reopen (re-test after new evidence).\n *\n * Deliberately does NOT cover a strategic *pivot* outcome (a `business_model`\n * that is invalidated-then-repositioned): `pivoted` is a distinct strategic\n * terminal, not a verdict, so `business_model` keeps its bespoke lifecycle.\n */\nconst VALIDATION_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'VALIDATION',\n  initial_phase: 'untested',\n  terminal_phases: ['validated', 'invalidated', 'archived'],\n  phases: [\n    { id: 'untested', status_category: 'triage', label: 'Untested', description: 'Articulated but not yet examined against evidence.', transitions_to: ['testing'] },\n    { id: 'testing', status_category: 'started', label: 'Testing', description: 'Actively gathering evidence for or against the claim.', transitions_to: ['validated', 'invalidated'] },\n    { id: 'validated', status_category: 'completed', label: 'Validated', description: 'Evidence supports the claim. Treated as true until contradicted.', transitions_to: ['archived'] },\n    { id: 'invalidated', status_category: 'completed', label: 'Invalidated', description: 'Evidence contradicts the claim. May re-test if new evidence appears.', transitions_to: ['archived', 'testing'] },\n    { id: 'archived', status_category: 'completed', label: 'Archived', description: 'Settled and retained for provenance. No longer active.', transitions_to: [] },\n  ],\n}\n\n/**\n * Incident / triage: open → triaged → in_progress → resolved\n *\n * The shared spine of \"something surfaced that gets triaged and worked to\n * resolution\" — tickets, bugs, defects, reports. Distinct from `RISK_ITEM`\n * on purpose: a risk's assess-then-treat flow is a *decision* axis; this is a\n * *work* axis (triage-then-fix). Late-state terminals cover the two common\n * non-resolution exits: `closed` (administratively closed, e.g. a duplicate or\n * a dropped ticket) and `wont_fix` (triaged as not-to-be-actioned).\n * `resolved → triaged` is a late-state reopen (regression / reoccurrence).\n *\n * Note: the `incident` entity itself keeps a richer bespoke lifecycle — its\n * `contained` and `mitigated` states carry SRE-specific meaning that this lean\n * triage spine would flatten. The template serves the broader defect/ticket\n * family.\n */\nconst INCIDENT_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'INCIDENT',\n  initial_phase: 'open',\n  terminal_phases: ['resolved', 'closed', 'wont_fix'],\n  phases: [\n    { id: 'open', status_category: 'triage', label: 'Open', description: 'Surfaced and logged. Not yet triaged.', transitions_to: ['triaged'] },\n    { id: 'triaged', status_category: 'triage', label: 'Triaged', description: 'Assessed for severity and ownership. Routed for work or dispositioned.', transitions_to: ['in_progress', 'resolved', 'wont_fix'] },\n    { id: 'in_progress', status_category: 'started', label: 'In Progress', description: 'Actively being worked toward a fix.', transitions_to: ['resolved', 'wont_fix'] },\n    { id: 'resolved', status_category: 'completed', label: 'Resolved', description: 'Addressed and verified. May reopen to `triaged` on regression.', transitions_to: ['closed', 'triaged'] },\n    { id: 'closed', status_category: 'cancelled', label: 'Closed', description: 'Administratively closed (duplicate, withdrawn, or no longer relevant).', transitions_to: [] },\n    { id: 'wont_fix', status_category: 'cancelled', label: \"Won't Fix\", description: 'Triaged as not to be actioned. Reason should be documented.', transitions_to: [] },\n  ],\n}\n\n/**\n * Study / run: planned → running → analysing → complete\n *\n * The shared spine of a time-boxed investigation — an experiment, eval run,\n * research study, or design sprint. `abandoned` is a late-state terminal for\n * a run stopped before completion (killed, timed out, superseded). No reopen:\n * a re-run is a new node, keeping run-level analytics clean (same discipline\n * as `SALES_DEAL`).\n */\nconst STUDY_TEMPLATE: Omit<UPGLifecycle, 'entity_type'> = {\n  template_id: 'STUDY',\n  initial_phase: 'planned',\n  terminal_phases: ['complete', 'abandoned'],\n  phases: [\n    { id: 'planned', status_category: 'unstarted', label: 'Planned', description: 'Scoped and scheduled. Not yet started.', transitions_to: ['running'] },\n    { id: 'running', status_category: 'started', label: 'Running', description: 'Actively executing: collecting data or running the protocol.', transitions_to: ['analysing', 'abandoned'] },\n    { id: 'analysing', status_category: 'started', label: 'Analysing', description: 'Execution done; results are being analysed and written up.', transitions_to: ['complete', 'abandoned'] },\n    { id: 'complete', status_category: 'completed', label: 'Complete', description: 'Analysed and concluded. Findings captured.', transitions_to: [] },\n    { id: 'abandoned', status_category: 'cancelled', label: 'Abandoned', description: 'Stopped before completion (killed, timed out, or superseded).', transitions_to: [] },\n  ],\n}\n\n/** All entity types generated from lifecycle templates */\nconst TEMPLATE_LIFECYCLES: UPGLifecycle[] = [\n  // Publishing lifecycle\n  fromTemplate('content_piece', PUBLISHING_TEMPLATE),\n  fromTemplate('social_post', PUBLISHING_TEMPLATE),\n  fromTemplate('press_release', PUBLISHING_TEMPLATE),\n  fromTemplate('postmortem', PUBLISHING_TEMPLATE),\n  fromTemplate('marketplace_listing', PUBLISHING_TEMPLATE),\n  fromTemplate('api_contract', PUBLISHING_TEMPLATE),\n\n  // Operational lifecycle\n  fromTemplate('marketing_campaign_plan', OPERATIONAL_TEMPLATE),\n  fromTemplate('marketing_channel', OPERATIONAL_TEMPLATE),\n  fromTemplate('event', OPERATIONAL_TEMPLATE),\n  fromTemplate('community_initiative', OPERATIONAL_TEMPLATE),\n  fromTemplate('education_program', OPERATIONAL_TEMPLATE),\n  fromTemplate('partner_program', OPERATIONAL_TEMPLATE),\n  fromTemplate('program', OPERATIONAL_TEMPLATE),\n  fromTemplate('project', OPERATIONAL_TEMPLATE),\n  fromTemplate('partnership', OPERATIONAL_TEMPLATE),\n  fromTemplate('developer_portal', OPERATIONAL_TEMPLATE),\n  fromTemplate('pricing_tier', OPERATIONAL_TEMPLATE),\n  fromTemplate('subscription', OPERATIONAL_TEMPLATE),\n\n  // Approval lifecycle\n  fromTemplate('change_request', APPROVAL_TEMPLATE),\n  fromTemplate('threat_model', APPROVAL_TEMPLATE),\n  fromTemplate('security_policy', APPROVAL_TEMPLATE),\n  fromTemplate('compliance_framework', APPROVAL_TEMPLATE),\n  fromTemplate('decision', APPROVAL_TEMPLATE),\n  fromTemplate('quote_document', APPROVAL_TEMPLATE),\n\n  // Work item lifecycle\n  fromTemplate('deliverable', WORK_ITEM_TEMPLATE),\n  fromTemplate('milestone', WORK_ITEM_TEMPLATE),\n  fromTemplate('success_milestone', WORK_ITEM_TEMPLATE),\n  fromTemplate('invoice', WORK_ITEM_TEMPLATE),\n  fromTemplate('lead', WORK_ITEM_TEMPLATE),\n\n  // Discovery lifecycle\n  fromTemplate('design_question', DISCOVERY_TEMPLATE),\n\n  // Maturity lifecycle\n  fromTemplate('api_ecosystem', MATURITY_TEMPLATE),\n  fromTemplate('integration_partner', MATURITY_TEMPLATE),\n  fromTemplate('locale', MATURITY_TEMPLATE),\n\n  // ── Phase C: PUBLISHING (draft / review / published / archived) ─────────────\n  fromTemplate('user_journey', PUBLISHING_TEMPLATE),\n  fromTemplate('user_flow', PUBLISHING_TEMPLATE),\n  fromTemplate('wireframe', PUBLISHING_TEMPLATE),\n  fromTemplate('service_blueprint', PUBLISHING_TEMPLATE),\n  fromTemplate('design_guideline', PUBLISHING_TEMPLATE),\n  fromTemplate('interaction_spec', PUBLISHING_TEMPLATE),\n  fromTemplate('brand_asset', PUBLISHING_TEMPLATE),\n  fromTemplate('brand_voice', PUBLISHING_TEMPLATE),\n  fromTemplate('knowledge_base_article', PUBLISHING_TEMPLATE),\n  fromTemplate('document', PUBLISHING_TEMPLATE),\n  fromTemplate('documentation_template', PUBLISHING_TEMPLATE),\n  fromTemplate('prompt_template', PUBLISHING_TEMPLATE),\n  fromTemplate('help_video', PUBLISHING_TEMPLATE),\n  fromTemplate('tutorial', PUBLISHING_TEMPLATE),\n  fromTemplate('walkthrough', PUBLISHING_TEMPLATE),\n  fromTemplate('learning_path', PUBLISHING_TEMPLATE),\n  fromTemplate('competitive_analysis', PUBLISHING_TEMPLATE),\n  fromTemplate('messaging', PUBLISHING_TEMPLATE),\n  fromTemplate('competitive_battle_card', PUBLISHING_TEMPLATE),\n  fromTemplate('ad_creative', PUBLISHING_TEMPLATE),\n  fromTemplate('runbook', PUBLISHING_TEMPLATE),\n  fromTemplate('report', PUBLISHING_TEMPLATE),\n  fromTemplate('status_report', PUBLISHING_TEMPLATE),\n  fromTemplate('translation_bundle', PUBLISHING_TEMPLATE),\n  fromTemplate('a11y_guideline', PUBLISHING_TEMPLATE),\n  fromTemplate('dashboard', PUBLISHING_TEMPLATE),\n  fromTemplate('glossary_term', PUBLISHING_TEMPLATE),\n  fromTemplate('event_schema', PUBLISHING_TEMPLATE),\n  fromTemplate('data_model', PUBLISHING_TEMPLATE),\n  fromTemplate('roadmap', PUBLISHING_TEMPLATE),\n  fromTemplate('workflow_template', PUBLISHING_TEMPLATE),\n\n  // ── Phase C: OPERATIONAL (planning / active / paused / completed / sunset) ──\n  fromTemplate('launch', OPERATIONAL_TEMPLATE),\n  fromTemplate('demand_gen_program', OPERATIONAL_TEMPLATE),\n  fromTemplate('content_strategy', OPERATIONAL_TEMPLATE),\n  fromTemplate('gtm_strategy', OPERATIONAL_TEMPLATE),\n  fromTemplate('marketing_strategy', OPERATIONAL_TEMPLATE),\n  fromTemplate('email_sequence', OPERATIONAL_TEMPLATE),\n  fromTemplate('webinar', OPERATIONAL_TEMPLATE),\n  fromTemplate('nps_campaign', OPERATIONAL_TEMPLATE),\n  fromTemplate('monitor', OPERATIONAL_TEMPLATE),\n  fromTemplate('alert_rule', OPERATIONAL_TEMPLATE),\n  // 0.33.0: agent_skill and agent_hook move here from WORK_ITEM. A durable\n  // capability and an event trigger were both reaching `in_review` and `done`,\n  // which is the wrong shape rather than a missing one: neither is work that gets\n  // reviewed and accepted, and zero of the ten field instances across the corpus\n  // had ever left the initial phase. Their nearest siblings are the two lines\n  // directly above, and `monitor` and `alert_rule` are the same kind of thing:\n  // something that runs continuously, can be paused, and is eventually retired.\n  //\n  // NOT lifecycle-free. The `user_story` precedent for lifecycle-freedom is the\n  // Statement/Implementation split, where the paired `task` carries the\n  // lifecycle. There is no paired entity here, so lifecycle-freedom would leave\n  // `agent_skill` unable to say it is disabled and would entrench\n  // `AgentHookProperties.hook_status` (now @deprecated) as the permanent status\n  // axis, which is the *_status shadow Pattern D collapsed fourteen times.\n  fromTemplate('agent_skill', OPERATIONAL_TEMPLATE),\n  fromTemplate('agent_hook', OPERATIONAL_TEMPLATE),\n  fromTemplate('on_call_rotation', OPERATIONAL_TEMPLATE),\n  fromTemplate('security_audit', OPERATIONAL_TEMPLATE),\n  fromTemplate('penetration_test', OPERATIONAL_TEMPLATE),\n  fromTemplate('security_review', OPERATIONAL_TEMPLATE),\n  fromTemplate('qa_session', OPERATIONAL_TEMPLATE),\n  fromTemplate('a11y_audit', OPERATIONAL_TEMPLATE),\n  fromTemplate('test_environment', OPERATIONAL_TEMPLATE),\n  fromTemplate('workspace', OPERATIONAL_TEMPLATE),\n  fromTemplate('pricing_strategy', OPERATIONAL_TEMPLATE),\n  fromTemplate('discount_strategy', OPERATIONAL_TEMPLATE),\n\n  // ── Phase C: APPROVAL (proposed / reviewing / approved / rejected / deprecated)\n  fromTemplate('data_contract', APPROVAL_TEMPLATE),\n  fromTemplate('audit_log_policy', APPROVAL_TEMPLATE),\n  fromTemplate('access_policy', APPROVAL_TEMPLATE),\n  fromTemplate('privacy_policy', APPROVAL_TEMPLATE),\n\n  // ── Phase C: MATURITY (alpha / beta / ga / deprecated) ──────────────────────\n  // screen removed (UPG-690 Q3, 0.21.0): hand-authored SCREEN_LIFECYCLE below —\n  // the build-pipeline IS the real lifecycle, MATURITY was the mis-fit.\n  fromTemplate('design_system', MATURITY_TEMPLATE),\n  fromTemplate('design_component', MATURITY_TEMPLATE),\n  fromTemplate('design_pattern', MATURITY_TEMPLATE),\n  fromTemplate('brand_logo', MATURITY_TEMPLATE),\n  fromTemplate('certification', MATURITY_TEMPLATE),\n  fromTemplate('data_source', MATURITY_TEMPLATE),\n  fromTemplate('data_product', MATURITY_TEMPLATE),\n  fromTemplate('infrastructure_component', MATURITY_TEMPLATE),\n\n  // ── Phase C: WORK_ITEM (todo / in_progress / in_review / done) ──────────────\n  fromTemplate('agent_task', WORK_ITEM_TEMPLATE),\n  // agent_skill and agent_hook moved WORK_ITEM -> OPERATIONAL at 0.33.0; see the\n  // OPERATIONAL block below. agent_task stays: a task IS a work item.\n  // UPG-690 (0.21.0): task (exact match) + epic (todo→in_progress→done ⊆ WORK_ITEM,\n  // in_review becomes available — non-breaking widening) folded off hand-authored.\n  fromTemplate('task', WORK_ITEM_TEMPLATE),\n  fromTemplate('epic', WORK_ITEM_TEMPLATE),\n\n  // ── Phase B: RISK_ITEM (identified → assessed → mitigated/accepted/closed) ──\n  fromTemplate('threat', RISK_ITEM_TEMPLATE),\n  fromTemplate('risk', RISK_ITEM_TEMPLATE),\n  fromTemplate('compliance_requirement', RISK_ITEM_TEMPLATE),\n\n  // ── Phase B: SALES_DEAL (qualified → proposal → negotiation → won/lost) ─────\n  fromTemplate('deal', SALES_DEAL_TEMPLATE),\n\n  // ── STUDY (planned → running → analysing → complete / abandoned) ───────────\n  // UPG-690 (0.21.0): time-boxed investigations folded off bespoke singletons.\n  // `model_comparison` stays bespoke — its publish/archive tail is a weak fit.\n  fromTemplate('experiment', STUDY_TEMPLATE),\n  fromTemplate('experiment_run', STUDY_TEMPLATE),\n  fromTemplate('research_study', STUDY_TEMPLATE),\n  fromTemplate('design_sprint', STUDY_TEMPLATE),\n  fromTemplate('feasibility_study', STUDY_TEMPLATE),\n  fromTemplate('ai_experiment', STUDY_TEMPLATE),\n  fromTemplate('eval_run', STUDY_TEMPLATE),\n\n  // ── VALIDATION (untested → testing → validated / invalidated → archived) ───\n  // UPG-690 (0.21.0): claims-tested-to-a-verdict folded off bespoke singletons.\n  // `business_model` stays bespoke — its `pivoted` terminal is a strategic\n  // outcome, not a verdict.\n  fromTemplate('assumption', VALIDATION_TEMPLATE),\n  fromTemplate('prototype', VALIDATION_TEMPLATE),\n  fromTemplate('value_proposition', VALIDATION_TEMPLATE),\n  fromTemplate('hypothesis', VALIDATION_TEMPLATE),\n\n  // ── INCIDENT (open → triaged → in_progress → resolved / closed / wont_fix) ─\n  // UPG-690 (0.21.0): triage-to-resolution defect/ticket family folded off\n  // bespoke singletons. `incident` stays bespoke (richer SRE flow).\n  fromTemplate('support_ticket', INCIDENT_TEMPLATE),\n  fromTemplate('bug', INCIDENT_TEMPLATE),\n  fromTemplate('a11y_issue', INCIDENT_TEMPLATE),\n  fromTemplate('vulnerability', INCIDENT_TEMPLATE),\n  fromTemplate('hallucination_report', INCIDENT_TEMPLATE),\n  fromTemplate('technical_debt_item', INCIDENT_TEMPLATE),\n  fromTemplate('customer_feedback', INCIDENT_TEMPLATE),\n]\n\n/**\n * framework_exercise (Workspace domain)\n *\n * One run of a framework over a set of entities. `draft` while the framework's\n * inputs are still being filled in, `active` once it is the authoritative run\n * consumers read and rank by, `archived` when superseded — retained for\n * provenance and revivable. The exercise's per-entity results live on its\n * `framework_exercise_includes_node` edges, not in these phases.\n */\nconst FRAMEWORK_EXERCISE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'framework_exercise',\n  initial_phase: 'draft',\n  terminal_phases: ['archived'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'The exercise has been created and entities pulled into scope, but the framework\\'s inputs have not all been filled in yet.',\n      transitions_to: ['active', 'archived'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description:\n        'The current, authoritative run of its framework. Its include edges carry the live results consumers read, rank, and render by.',\n      transitions_to: ['archived'],\n    },\n    {\n      id: 'archived',\n      status_category: 'completed',\n      label: 'Archived',\n      description:\n        'A past run, retained for provenance. Still queryable but superseded by a newer exercise and hidden from default views. Can be revived to active.',\n      transitions_to: ['active'],\n    },\n  ],\n}\n\n/**\n * composition (Workspace domain)\n *\n * A named, published view assembled from a canvas. `draft` while it is being\n * arranged and has never been published, `published` once it is live at its\n * slug and people can link to it, `archived` when withdrawn but kept so old\n * links resolve to something honest rather than nothing.\n *\n * Bespoke rather than the `PUBLISHING` template, and the difference is one\n * phase: `PUBLISHING` routes `draft` through `review` and offers no direct\n * `draft -> published` transition. Publishing a composition is a single act by\n * its author, with no editorial gate, so a `review` phase would be a step\n * nobody takes that every consumer would have to model.\n *\n * REPUBLISHING IS NOT A PHASE CHANGE. Re-publishing the same slug bumps\n * `properties.rev` and `properties.published_at` and leaves the composition in\n * `published`. The phases track whether the view is live; `rev` tracks how many\n * prints have been taken from the plate.\n */\nconst COMPOSITION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'composition',\n  initial_phase: 'draft',\n  terminal_phases: ['archived'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description:\n        'Being arranged. It has a slug reserved and members placed, but has never been published, so nothing resolves at its address yet.',\n      transitions_to: ['published', 'archived'],\n    },\n    {\n      id: 'published',\n      status_category: 'completed',\n      label: 'Published',\n      description:\n        'Live at its slug and linkable. Republishing the same slug stays in this phase and bumps the revision rather than moving the composition.',\n      transitions_to: ['archived', 'draft'],\n    },\n    {\n      id: 'archived',\n      status_category: 'completed',\n      label: 'Archived',\n      description:\n        'Withdrawn from the published set but retained, so an existing link resolves to a view marked out of date rather than to nothing. Can be republished.',\n      transitions_to: ['published', 'draft'],\n    },\n  ],\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** The complete set of UPG lifecycle definitions, grouped by domain.\n *  Entity types without lifecycles (persona, metric, quote, etc.) are deliberately excluded. */\n// Specification (Foundations, 0.9.12): lifecycle-light. A governed spec is\n// authored (draft), adopted (active), wound down (deprecated), then replaced\n// (superseded). No product-style phase ladder.\nconst SPECIFICATION_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'specification',\n  initial_phase: 'draft',\n  terminal_phases: ['superseded'],\n  phases: [\n    {\n      id: 'draft',\n      status_category: 'started',\n      label: 'Draft',\n      description: 'Being authored. Not yet adopted as the canonical specification.',\n      transitions_to: ['active', 'superseded'],\n    },\n    {\n      id: 'active',\n      status_category: 'started',\n      label: 'Active',\n      description: 'In force. The current authoritative version products implement and conform to.',\n      transitions_to: ['deprecated', 'superseded'],\n    },\n    {\n      id: 'deprecated',\n      status_category: 'started',\n      label: 'Deprecated',\n      description: 'Still valid but no longer recommended; a successor exists or is imminent.',\n      transitions_to: ['superseded'],\n    },\n    {\n      id: 'superseded',\n      status_category: 'completed',\n      label: 'Superseded',\n      description: 'Replaced by a newer specification. Retained for historical reference.',\n      transitions_to: [],\n    },\n  ],\n}\n\n/**\n * planning_cycle (Product Specification domain)\n *\n * planned -> active -> closed. A cadence interval is drafted while it is being\n * shaped (dates set, goal written, work scheduled in), runs while the team is\n * inside it, and closes when it ends. `status` is the node lifecycle; there is\n * deliberately no shadow `*_status`. A closed cycle can reopen if the team\n * extends or reruns it.\n */\nconst PLANNING_CYCLE_LIFECYCLE: UPGLifecycle = {\n  entity_type: 'planning_cycle',\n  initial_phase: 'planned',\n  terminal_phases: ['closed'],\n  phases: [\n    { id: 'planned', status_category: 'unstarted', label: 'Planned', description: 'The cycle is being shaped: dates set, goal written, work scheduled into it. It has not started yet.', transitions_to: ['active'] },\n    { id: 'active', status_category: 'started', label: 'Active', description: 'The team is inside the interval; work is flowing through it.', transitions_to: ['closed'] },\n    { id: 'closed', status_category: 'completed', label: 'Closed', description: 'The interval has ended. Scheduled work has shipped, carried over, or been dropped. May reopen if the team extends or reruns it.', transitions_to: ['active'] },\n  ],\n}\n\nexport const UPG_LIFECYCLES: readonly UPGLifecycle[] = [\n  // Product (root)\n  PRODUCT_LIFECYCLE,\n\n  // Foundations (0.9.12)\n  SPECIFICATION_LIFECYCLE,\n\n  // Discovery & Validation\n  NEED_LIFECYCLE,\n  OPPORTUNITY_LIFECYCLE,\n  SOLUTION_LIFECYCLE,\n  EXPERIMENT_PLAN_LIFECYCLE,\n  RESEARCH_PLAN_LIFECYCLE,\n  FEEDBACK_PROGRAM_LIFECYCLE,\n  FEATURE_REQUEST_LIFECYCLE,\n  BETA_PROGRAM_LIFECYCLE,\n  USER_ADVISORY_BOARD_LIFECYCLE,\n\n  // Strategy & Product Specification\n  OUTCOME_LIFECYCLE,\n  VISION_LIFECYCLE,\n  MISSION_LIFECYCLE,\n  CAPABILITY_LIFECYCLE,\n  OBJECTIVE_LIFECYCLE,\n  KEY_RESULT_LIFECYCLE,\n  STRATEGIC_THEME_LIFECYCLE,\n  INITIATIVE_LIFECYCLE,\n  STRATEGIC_PILLAR_LIFECYCLE,\n  STRATEGIC_QUESTION_LIFECYCLE,\n  FEATURE_AREA_LIFECYCLE,\n  FEATURE_LIFECYCLE,\n  // user_story is lifecycle-free (declared in UPG_LIFECYCLE_FREE_TYPES below).\n  // story_task lifecycle removed v0.4.0; collapsed into task. task + epic are\n  // now WORK_ITEM-template-derived (UPG-690, 0.21.0) — see TEMPLATE_LIFECYCLES.\n  RELEASE_LIFECYCLE,\n  ROADMAP_ITEM_LIFECYCLE,\n  PLANNING_CYCLE_LIFECYCLE,\n  IP_ASSET_LIFECYCLE,\n  CONTRACT_LIFECYCLE,\n  DESIGN_CONCEPT_LIFECYCLE,\n  BRAND_IDENTITY_LIFECYCLE,\n  SCREEN_LIFECYCLE,\n  SURFACE_LIFECYCLE,\n\n  // Engineering & Operations\n  SERVICE_LIFECYCLE,\n  DEPLOYMENT_LIFECYCLE,\n  FEATURE_FLAG_LIFECYCLE,\n  INVESTIGATION_LIFECYCLE,\n  EXTERNAL_API_LIFECYCLE,\n  DATABASE_SCHEMA_LIFECYCLE,\n  INCIDENT_LIFECYCLE,\n  SECURITY_CONTROL_LIFECYCLE,\n  DATA_PIPELINE_LIFECYCLE,\n  AI_MODEL_LIFECYCLE,\n  WORKFLOW_RUN_LIFECYCLE,\n  AGENT_DEFINITION_LIFECYCLE,\n  AGENT_SESSION_LIFECYCLE,\n  REVIEW_GATE_LIFECYCLE,\n  TEST_SUITE_LIFECYCLE,\n  TEST_CASE_LIFECYCLE,\n\n  // ── Phase B hand-authored ─────────────────────────────────────────\n  // Research + Validation\n  INSIGHT_LIFECYCLE,\n  RESEARCH_QUESTION_LIFECYCLE,\n  INTERVIEW_GUIDE_LIFECYCLE,\n  TEST_PLAN_LIFECYCLE,\n  // AI workflow\n  AI_DATASET_LIFECYCLE,\n  AI_GUARDRAIL_LIFECYCLE,\n  MODEL_COMPARISON_LIFECYCLE,\n  PROMPT_VERSION_LIFECYCLE,\n  EVAL_BENCHMARK_LIFECYCLE,\n  // Business Model\n  BUSINESS_MODEL_LIFECYCLE,\n  REVENUE_STREAM_LIFECYCLE,\n  // Customer Success\n  CUSTOMER_HEALTH_SCORE_LIFECYCLE,\n  PLAYBOOK_LIFECYCLE,\n  // Team & Organisation\n  TEAM_OKR_LIFECYCLE,\n  RETROSPECTIVE_LIFECYCLE,\n  DEPENDENCY_LIFECYCLE,\n  ROLE_LIFECYCLE,\n  CAPACITY_PLAN_LIFECYCLE,\n  // Product & Growth\n  VARIANT_LIFECYCLE,\n  GROWTH_CAMPAIGN_LIFECYCLE,\n\n  // Workspace\n  FRAMEWORK_EXERCISE_LIFECYCLE,\n  COMPOSITION_LIFECYCLE,\n\n  // ── Template-generated lifecycles ─────────────────────────────────\n  ...TEMPLATE_LIFECYCLES,\n]\n\n/**\n * Returns the lifecycle definition for a given entity type, or `undefined`\n * if the type does not have a lifecycle.\n *\n * @example\n * const lifecycle = getLifecycleForType('hypothesis')\n * // → VALIDATION template (untested → testing → validated | invalidated)\n *\n * const noLifecycle = getLifecycleForType('persona')\n * // → undefined\n */\nexport function getLifecycleForType(entityType: string): UPGLifecycle | undefined {\n  return UPG_LIFECYCLES.find((l) => l.entity_type === entityType)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Lifecycle-free types: the explicit allow-list\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Entity types that are deliberately lifecycle-free.\n *\n * Every active UPGEntityType must be either in UPG_LIFECYCLES or in this\n * set; the `10-lifecycle-coverage` audit enforces it. The coverage check\n * is the successor to the earlier ad-hoc \"barren entity\" info log.\n *\n * Categories represented here:\n *\n *  • **Reference / catalog data**: vocabulary definitions that don't\n *    transition (persona, skill, competitor, glossary_term).\n *  • **Structural primitives**: atoms of a larger composite (journey_step,\n *    funnel_step, aggregate, domain_entity, contract_clause).\n *  • **Data points / snapshots**: immutable observations (quote,\n *    observation, evidence, survey_response, test_result).\n *  • **Configuration**: static settings (paywall, trial_config,\n *    attribution_model, design_token).\n *  • **Historical records**: append-only ledger entries (changelog,\n *    approval_record, workflow_artifact, ai_trace, ai_cost_tracker).\n *  • **Profile / directory entries**: people and orgs (contact,\n *    stakeholder, organization).\n *  • **Computed / derived values**: not workflow-bearing (cohort,\n *    customer_health_score, forecast, error_budget).\n *  • **DDD modelling primitives**: aggregates / value objects / commands;\n *    they describe the domain model, not processes within it.\n *\n * Some of these will gain lifecycles in v0.3 if Entopo usage surfaces real\n * states. The allow-list is therefore *intentional today*, not\n * *locked forever*.\n *\n * Keep this list organised by domain for review clarity. When moving a\n * type into UPG_LIFECYCLES, remove it from here.\n */\nexport const UPG_LIFECYCLE_FREE_TYPES: ReadonlySet<string> = new Set<string>([\n  // ── Foundations (3 of 4): a primitive either exists or is deprecated; no\n  //    phase ladder (like metric). `operating_lifecycle`/`operating_stage` are\n  //    static ordered reference data (the loop is a `cyclic` flag, not a state\n  //    machine). `specification` carries a lifecycle. ──\n  'primitive', 'operating_lifecycle', 'operating_stage',\n\n  // ── User (5): personas and JTBD atoms are reference data ──────────────────\n  'persona', 'job', 'job_step', 'desired_outcome', 'switching_cost',\n\n  // ── Market Intelligence (7 of 8): competitor landscape is reference data;\n  //    competitor_signal is an append-only dated event (no phase ladder);\n  //    competitive_analysis shipped PUBLISHING lifecycle in Phase C;\n  //    classification_axis and classification_value are reference taxonomy\n  //    atoms with no state machine. ─\n  'competitor', 'competitor_feature', 'competitor_signal', 'market_trend', 'market_segment',\n  'classification_axis', 'classification_value',\n\n  // ── Product Specification (1): a configuration_axis is a structural\n  //    DECLARATION (a lever and its closed value set), not a thing that\n  //    progresses through states. Same reading as classification_axis above.\n  'configuration_axis',\n\n  // ── User Research (5 of 8): participants, quotes, observations,\n  //    clusters, survey responses are immutable data points ────────────────\n  'participant', 'observation', 'quote', 'affinity_cluster', 'survey_response',\n\n  // ── UX Design (3 of 8): journey structural atoms ──────────────────────────\n  'journey_step', 'journey_phase', 'journey_action', 'screen_state',\n\n  // ── Design System (3 of 7): tokens and annotations are atomic values ────\n  'design_token', 'annotation',\n\n  // ── Brand (4 of 6): colour/typography/imagery/voice are reference atoms ──\n  'brand_colour', 'brand_typography', 'brand_imagery',\n\n  // ── Product Specification (4 of 5): criteria, grouping, historical, +\n  //    user_story (the templated promise is a stable design artefact; the paired\n  //    task carries the lifecycle). Re-canon story_statement → user_story at\n  //    v0.7.0/UPG-571. ─\n  'acceptance_criterion', 'changelog', 'roadmap_theme', 'user_story',\n\n  // ── Strategy: metric is a measurement definition; metric_quality_assessment\n  //    is a point-in-time snapshot; value_stream is a mapped flow;\n  //    constraint carries its own `constraint_status` enum (binding/advisory/\n  //    lifted) as a property; base-node `status` not used.\n  //    vision/mission/capability/outcome get lifecycles in Phase B or C ─────\n  'metric', 'metric_quality_assessment', 'value_stream', 'constraint',\n\n  // ── Engineering (15 of 17): DDD modelling primitives + infra references.\n  //    root_cause / symptom / fix are investigation findings, not workflows\n  //    (investigation itself has a lifecycle) ────────────────────────────────\n  'aggregate', 'domain_entity', 'value_object', 'command', 'read_model',\n  'domain_event', 'bounded_context', 'api_endpoint', 'queue_topic',\n  'build_artifact', 'code_repository', 'library_dependency',\n  'integration_pattern', 'data_flow', 'root_cause', 'symptom', 'fix',\n\n  // ── Business Model (6 of 9): BMC cells are structural frames ────────────\n  'cost_structure', 'unit_economics', 'key_resource', 'key_activity',\n  'customer_relationship', 'distribution_channel',\n\n  // ── Go-To-Market (8 of 13): positioning/ICP/territory/sales_motion are\n  //    configuration; objection/rebuttal/proof_point are catalog entries ───\n  'ideal_customer_profile', 'positioning', 'sales_motion', 'territory',\n  'objection', 'rebuttal', 'proof_point',\n\n  // ── Team & Organisation (7 of 11): org structural atoms ───────────────────\n  'team', 'stakeholder', 'person', 'department', 'skill', 'ceremony',\n\n  // ── Data & Analytics (4 of 10): lineage and domain containers, plus\n  //    atomic definitions ────────────────────────────────────────────────────\n  'data_lineage', 'data_domain', 'data_quality_rule',\n\n  // ── AI (3 of 10): traces and cost trackers are append-only; model\n  //    comparison snapshots are immutable ───────────────────────────────────\n  'ai_cost_tracker', 'ai_trace',\n\n  // ── Automation (2 of 6): approvals and artifacts are ledger entries ──────\n  'approval_record', 'workflow_artifact',\n\n  // ── Growth (7 of 9): funnels and attribution are structural definitions;\n  //    cohorts/segments are computed snapshots ────────────────────────────\n  'funnel', 'funnel_step', 'acquisition_channel', 'cohort',\n  'behavioral_segment', 'growth_loop', 'attribution_model',\n\n  // ── Sales (5 of 6): pipeline structure + accounts/contacts + forecast\n  //    snapshots. Only `deal` has a lifecycle (Phase B SALES_DEAL template) ─\n  'account', 'contact', 'pipeline_sales', 'pipeline_stage', 'forecast',\n\n  // ── Customer Success (5 of 9): journey structure + derived values ────────\n  'customer_journey_stage', 'touchpoint', 'churn_reason', 'service_level_agreement',\n\n  // ── DevOps (5 of 10): indicators and budgets are measurement references;\n  //    strategies and pipelines are configuration ──────────────────────────\n  'service_level_indicator', 'service_level_objective', 'error_budget',\n  'ci_pipeline', 'release_strategy',\n\n  // ── Security (1 of 5): data classification is a reference label ──────────\n  'data_classification',\n\n  // ── Accessibility (2 of 4): standards and annotations ─────────────────────\n  'a11y_standard', 'a11y_annotation',\n\n  // ── Testing (3 of 5): regression tests are reference definitions; test\n  //    results and coverage reports are immutable records ───────────────────\n  'regression_test', 'test_coverage_report', 'test_result',\n\n  // ── Customer Feedback (2 of 3): themes and votes are atomic data points ──\n  'feedback_theme', 'feedback_vote',\n\n  // ── Pricing (2 of 4): trial and paywall are configuration ─────────────────\n  'trial_config', 'paywall',\n\n  // ── Content (2 of 5): calendars and themes are planning configuration ────\n  'content_calendar', 'content_theme',\n\n  // ── Legal (2 of 3): legal_entity is an org; contract_clause is an atom\n  //    of a contract (which has its own lifecycle) ───────────────────────────\n  'legal_entity', 'contract_clause',\n\n  // ── Portfolio (3 of 3): structural containers ─────────────────────────────\n  'organization', 'portfolio', 'product_area',\n\n  // ── Program Management (2 of 3): allocations and registers are tracking\n  //    containers ────────────────────────────────────────────────────────────\n  'resource_allocation', 'risk_register',\n\n  // ── Localisation (4 of 5): translation keys, configs, and regional\n  //    adaptations are reference data ────────────────────────────────────────\n  'translation_key', 'locale_config', 'cultural_adaptation', 'regional_pricing',\n\n  // ── Marketing (1 of 4): SEO keywords are tracked reference terms ─────────\n  'seo_keyword',\n\n  // ── Ecosystem (2 of 2): partner tiers and rev-share terms are config ─────\n  'partner_tier', 'partner_revenue_share',\n\n  // ── Validation (2 of 4): evidence + learning are data points captured\n  //    from experiment_runs (which have lifecycles); hypothesis_evidence was\n  //    lifecycle-free here but is deprecated at v0.4.0 ──────────────────────────────────────\n  'evidence', 'learning',\n\n  // ── Workspace (1 of 4): a capture is a fact about a moment, not a workflow.\n  //    It is taken, and from then on it either still matches its subject or it\n  //    does not — which is what `content_hash` answers, not a phase. ─────────\n  'capture',\n])\n\n/**\n * Returns `true` if an entity type is intentionally lifecycle-free (see\n * {@link UPG_LIFECYCLE_FREE_TYPES} for the full list and rationale).\n *\n * @example\n * isLifecycleFreeType('tag')        // true  (tags are reference data, not stateful artefacts)\n * isLifecycleFreeType('feature')    // false (features carry a development lifecycle)\n */\nexport function isLifecycleFreeType(entityType: string): boolean {\n  return UPG_LIFECYCLE_FREE_TYPES.has(entityType)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Lifecycle-planned types: triaged, deferred to Phase B/C/D\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Entity types that are **triaged but not yet implemented**; each has a\n * lifecycle planned for a later phase of. This set exists so that\n * the coverage audit (`10-lifecycle-coverage`) distinguishes\n * \"actively deferred\" from \"untriaged\"; moving a type here is a commitment\n * to enrich it, not a punt.\n *\n * Phase breakdown (committed 2026-04-17):\n *\n *  • **Phase B**: high-value hand-authored lifecycles (NL) + two new\n *    templates (SALES_DEAL, RISK_ITEM). ~30 types: outcome, feature, epic,\n *    user_story, bug, deal, threat, risk, compliance_requirement, insight,\n *    hypothesis-adjacent artefacts, workflow artefacts, etc.\n *  • **Phase C**: expand existing-template coverage to the PUBLISHING /\n *    OPERATIONAL / APPROVAL / MATURITY / WORK_ITEM buckets via\n *    `fromTemplate()`. ~60 types.\n *  • **Phase D**: residual new lifecycles for types that don't fit a\n *    template cleanly but didn't make Phase B's cut. ~10 types.\n *\n * As phases land, types migrate out of this set into UPG_LIFECYCLES.\n * The `10-lifecycle-coverage` audit surfaces the remaining count so the\n * closure trajectory is visible.\n */\nexport const UPG_LIFECYCLE_PLANNED_TYPES: ReadonlySet<string> = new Set<string>([\n  // Phase B cleared this set entirely. Every type that was triaged\n  // into Phase B/C/D under now either has a lifecycle in\n  // `UPG_LIFECYCLES` or is documented as lifecycle-free in\n  // `UPG_LIFECYCLE_FREE_TYPES`.\n  //\n  // Reintroduce entries here when a new entity type is added to the spec\n  // and decided to be lifecycle-bearing but its phases have not yet been\n  // designed. The `10-lifecycle-coverage` audit will surface uncovered\n  // active types until they're either implemented or moved to the\n  // free-types set.\n])\n\n/**\n * Returns `true` if an entity type has a lifecycle planned for a later phase\n * (see {@link UPG_LIFECYCLE_PLANNED_TYPES}).\n *\n * @example\n * isLifecyclePlannedType('outcome')   // true  (planned for a later phase)\n * isLifecyclePlannedType('feature')   // false (feature lifecycle is already implemented)\n */\nexport function isLifecyclePlannedType(entityType: string): boolean {\n  return UPG_LIFECYCLE_PLANNED_TYPES.has(entityType)\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Render-ready lifecycle shape\n//\n// Consumers that render a lifecycle as a state-machine graphic (the UPG site\n// entity-detail visualiser, Entopo Explora, the CLI `upg lifecycle show`\n// command, future Electron/IDE surfaces) all need the same flattened\n// `{ states, transitions }` shape and the same transition classification.\n//\n// `getLifecycleRenderShape()` owns that translation so each consumer doesn't\n// reinvent it (and drift). The shape is **phase-level**: the universal\n// vocabulary every `UPGLifecycle` exposes, and the granularity that the\n// `status` property on UPG entities actually uses. Finer state-level\n// rendering is intentionally deferred to a future helper.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** A render-ready lifecycle state (one phase of the underlying lifecycle). */\nexport interface LifecycleRenderState {\n  /** Phase id (e.g. `'draft'`, `'in_progress'`, `'archived'`). */\n  id: string\n  /** Human-readable label. */\n  label: string\n  /** What this state means. */\n  description: string\n  /** True if this state is in the lifecycle's `terminal_phases`. */\n  terminal: boolean\n}\n\n/** A render-ready transition between two lifecycle states. */\nexport interface LifecycleRenderTransition {\n  /** Source state id. */\n  from: string\n  /** Target state id. */\n  to: string\n  /**\n   * Classification derived from the lifecycle's terminal set and authoring\n   * order:\n   *\n   * - `'reopen'`: source is terminal, target is not (e.g. `archived → draft`).\n   * - `'terminal'`: target is terminal, source is not (forward to completion).\n   * - `'backward'`: target appears before source in `phases[]` and is not a reopen.\n   * - `'forward'`: everything else.\n   *\n   * The classification is a render hint, not a validation rule: any transition\n   * declared in the source lifecycle is valid by definition.\n   */\n  kind: 'forward' | 'backward' | 'terminal' | 'reopen'\n}\n\n/** A flattened, render-ready shape derived from a single `UPGLifecycle`. */\nexport interface LifecycleRenderShape {\n  /** Entity type this shape was derived from. */\n  entity_type: string\n  /**\n   * Identifier of the source template, if the underlying lifecycle was\n   * generated from one (e.g. `'PUBLISHING'`). Hand-authored lifecycles leave\n   * this `undefined`.\n   */\n  template_id?: string\n  /** Render states, in the authoring order of the source `phases[]`. */\n  states: LifecycleRenderState[]\n  /** Render transitions, classified by `kind`. */\n  transitions: LifecycleRenderTransition[]\n  /** Initial state id; equals the source `initial_phase`. */\n  initial_state: string\n}\n\n/**\n * Returns a render-ready `{ states, transitions }` shape for an entity type's\n * lifecycle, or `null` if the type is intentionally lifecycle-free\n * (see {@link UPG_LIFECYCLE_FREE_TYPES}).\n *\n * The shape is flattened to one level; each phase becomes one render state.\n * Optional finer-grained `core_states` are not surfaced here; consumers that\n * need them should read the source lifecycle directly via\n * {@link getLifecycleForType}.\n *\n * Transitions are classified into one of `'forward' | 'backward' | 'terminal'\n * | 'reopen'` so visualisers can style them without re-deriving the\n * classification.\n *\n * Returns `null` for:\n * - Types in {@link UPG_LIFECYCLE_FREE_TYPES} (e.g. `persona`, `metric`).\n * - Types not yet in the registry (planned types per\n *   {@link UPG_LIFECYCLE_PLANNED_TYPES}, or unknown types).\n *\n * @example\n * const shape = getLifecycleRenderShape('document')\n * // → { entity_type: 'document', template_id: 'PUBLISHING',\n * //     states: [{ id: 'draft', terminal: false, … }, …],\n * //     transitions: [{ from: 'archived', to: 'draft', kind: 'reopen' }, …],\n * //     initial_state: 'draft' }\n *\n * @example\n * getLifecycleRenderShape('persona')  // → null (intentionally lifecycle-free)\n */\nexport function getLifecycleRenderShape(\n  entityType: string,\n): LifecycleRenderShape | null {\n  const lifecycle = getLifecycleForType(entityType)\n  if (!lifecycle) return null\n\n  const terminalSet = new Set(lifecycle.terminal_phases)\n  const phaseIndex = new Map(lifecycle.phases.map((p, i) => [p.id, i]))\n\n  const states: LifecycleRenderState[] = lifecycle.phases.map((phase) => ({\n    id: phase.id,\n    label: phase.label,\n    description: phase.description,\n    terminal: terminalSet.has(phase.id),\n  }))\n\n  const transitions: LifecycleRenderTransition[] = []\n  for (const phase of lifecycle.phases) {\n    const fromTerminal = terminalSet.has(phase.id)\n    for (const to of phase.transitions_to) {\n      const toTerminal = terminalSet.has(to)\n      let kind: LifecycleRenderTransition['kind']\n      if (fromTerminal && !toTerminal) {\n        kind = 'reopen'\n      } else if (toTerminal && !fromTerminal) {\n        kind = 'terminal'\n      } else {\n        const fromIdx = phaseIndex.get(phase.id) ?? 0\n        const toIdx = phaseIndex.get(to) ?? 0\n        kind = toIdx < fromIdx ? 'backward' : 'forward'\n      }\n      transitions.push({ from: phase.id, to, kind })\n    }\n  }\n\n  return {\n    entity_type: lifecycle.entity_type,\n    ...(lifecycle.template_id !== undefined && { template_id: lifecycle.template_id }),\n    states,\n    transitions,\n    initial_state: lifecycle.initial_phase,\n  }\n}\n","/**\n * Legacy product-stage aliases (UPG-509 Part 2).\n *\n * Existing graphs (`entopo.upg`, `nimbus.upg`, `maximum-minimum.upg`,\n * `notion-saturated.upg`, etc.) carry `product.stage` values that pre-date\n * the canonical `UPGProductStage` enum\n * (`concept | validation | build | beta | launch | growth | mature |\n * maintenance | sunset`). The `create_product` write path rejects these as\n * legacy; this module surfaces the migration as a pure, reusable helper so\n * loaders can canonicalise them at the read boundary.\n *\n * The richer `coerceProductStage` lives in `intelligence/product-stage-coercion.ts`\n * and returns a structured `{ canonical, wasCoerced, wasUnknown }` shape for\n * load-time warnings. `migrateProductStage` is the simpler shape: take a\n * stage string, return its canonical form (or the input verbatim if it is\n * already canonical and not a known legacy alias).\n *\n * Mapping rationale:\n * - `idea → concept`: pre-canonical alias from early v0.1 product nodes;\n *   matches the v0.2.13 `properties.stage` migration `value_map` and the\n *   `UPG_PRODUCT_STAGE_COERCION_MAP` documented mapping.\n *\n * Future legacy aliases (`mvp → build`, `production → launch`, etc.) should\n * be added here as authoritative one-to-one mappings. Anything fuzzier (case\n * normalisation, multi-source coercion targets) belongs in the\n * `coerceProductStage` helper.\n *\n * @module catalog/legacy-product-stages\n */\n\nimport type { UPGProductStage } from '../shapes/document.js'\n\n/**\n * Authoritative legacy → canonical `UPGProductStage` map. Append-only;\n * removing an entry breaks read-side compatibility with existing graphs.\n *\n * Keys are lower-case legacy values; canonical values are the current\n * `UPGProductStage` literals.\n */\nexport const LEGACY_PRODUCT_STAGES: Readonly<Record<string, UPGProductStage>> =\n  Object.freeze({\n    idea: 'concept',\n  })\n\n/**\n * Canonicalise a stage value via `LEGACY_PRODUCT_STAGES`.\n *\n * - Returns the canonical stage when `stage` is a known legacy alias.\n * - Returns `stage` verbatim when it is not a known legacy alias (the input\n *   may itself already be canonical, or genuinely unknown. The strict\n *   write path is responsible for rejecting genuinely-unknown values).\n * - Returns `undefined` for `undefined` / `null` inputs.\n *\n * Lookups are case-insensitive on the input.\n *\n * @example\n * migrateProductStage('idea')      // → 'concept'\n * migrateProductStage('IDEA')      // → 'concept'\n * migrateProductStage('concept')   // → 'concept'  (already canonical, passthrough)\n * migrateProductStage('launch')    // → 'launch'   (already canonical, passthrough)\n * migrateProductStage('xyz')       // → 'xyz'      (unknown, passthrough; callers decide)\n * migrateProductStage(undefined)   // → undefined\n */\nexport function migrateProductStage<T extends string | undefined | null>(\n  stage: T,\n): T extends string ? UPGProductStage | string : undefined {\n  if (stage === undefined || stage === null) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return undefined as any\n  }\n  if (typeof stage !== 'string') {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return stage as any\n  }\n  const lower = stage.toLowerCase()\n  const mapped = LEGACY_PRODUCT_STAGES[lower]\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return (mapped ?? stage) as any\n}\n\n/**\n * True when `stage` is a known legacy alias (would migrate to a different\n * canonical value). Useful for loaders that want to warn-and-rewrite on\n * legacy data.\n *\n * @example\n * isLegacyProductStage('idea')     // → true\n * isLegacyProductStage('concept')  // → false\n */\nexport function isLegacyProductStage(stage: unknown): stage is string {\n  return typeof stage === 'string' && stage.toLowerCase() in LEGACY_PRODUCT_STAGES\n}\n","/**\n * The authored one-line description of every entity type.\n *\n * WHY THIS LIVES IN THE SPEC PACKAGE (0.34.1). It used to live only in the\n * documentation site's generator, which is an application. That put the one\n * sentence explaining what a type IS somewhere no consumer of the format could\n * reach: `get_entity_schema` returned `type, domain, expected_properties,\n * edges_out, edges_in, domain_guide` and no description, and\n * `get_catalog_entry({ kind: 'entity_meta' })` returned `name, type_id,\n * maturity, since, domain_id` and no description. The MCP server's own\n * instructions say \"Before creating an entity or edge, call `get_entity_schema`\n * for the type\", and the sentence that answers the question the caller actually\n * has was the one thing that call did not return.\n *\n * It also meant 0.32.1's editorial gate — which turns a release red until every\n * type has an authored description, after 0.32.0 shipped `capture` with the\n * generator's fallback text — protected a surface no agent could see.\n *\n * PULLED FORWARD BY NECESSITY, and worth saying plainly: promoting these to a\n * public export was a banked item, not a planned part of this patch. There is no\n * other way for an agent surface to return an authored description, because the\n * only authored copy was in an app. The alternative was a second copy in this\n * package, and a second copy of a hand-maintained string table is the exact\n * defect the derived base-node field list exists to prevent.\n *\n * SINGLE SOURCE. The site generator now READS this table instead of holding its\n * own; `check:generated` proves the emitted site data is unchanged by the move.\n * A new entity type without an entry here is caught by `check:editorial`.\n *\n * Descriptions are prose for a human reader and carry no contract. The\n * normative statements about a type are its properties, its edges and its\n * lifecycle.\n */\nexport const UPG_ENTITY_DESCRIPTIONS: Readonly<Record<string, string>> = Object.freeze({\n  // Strategy\n  product: 'The product being created, the root of the graph',\n  outcome: 'A desired business or user outcome',\n  objective: 'A strategic goal (OKR)',\n  key_result: 'A measurable result tied to an objective',\n  metric: 'A unified metric that measures progress, health, or behaviour across the product',\n  metric_quality_assessment: 'An assessment of whether a metric is well-defined, measurable, and aligned to a meaningful outcome.',\n  vision: 'A long-term aspirational statement of the future state',\n  mission: 'The purpose and reason the product exists',\n  strategic_theme: 'A high-level strategic focus area for a planning period. Its own time_horizon is now deprecated: promote the period to a planning_cycle and link the two with strategic_theme_scoped_to_planning_cycle, so themes share one dated, nestable interval instead of a drifting per-theme label.',\n  initiative: 'A large coordinated effort to achieve a strategic goal',\n  capability: 'An ability that enables value delivery',\n  value_stream: 'An end-to-end flow delivering value to the customer',\n  strategic_pillar: 'A foundational principle that guides decisions',\n  strategic_question: 'An open strategic question a plan must resolve (of coordination, ownership, sequencing, or which bet to place), held explicitly until a decision retires it; the strategy sibling of research_question and design_question',\n  assumption: 'A belief taken as true that underpins a strategy',\n  decision: 'A recorded decision with context, rationale, and consequences',\n  constraint: 'A limit, requirement, or ceiling the product must respect, whether a self-imposed principle or an externally imposed boundary',\n  // User\n  persona: 'An archetype representing a user segment',\n  job: 'Job To Be Done: what the user is trying to accomplish',\n  need: 'A user need, pain, desire, or constraint',\n  desired_outcome: 'What the user hopes to achieve',\n  job_step: 'A discrete step within a Job To Be Done',\n  switching_cost: 'A barrier preventing users from switching alternatives',\n  // Discovery\n  opportunity: 'A validated gap worth solving',\n  solution: 'A proposed approach to address an opportunity',\n  feasibility_study: 'An assessment of technical or business viability',\n  design_sprint: 'A time-boxed sprint to prototype and validate ideas',\n  // Validation\n  hypothesis: 'A testable belief about a solution',\n  experiment: 'A test designed to validate a hypothesis',\n  experiment_plan: 'An experiment plan describing the hypothesis, setup, success criteria, and methodology before a test runs.',\n  experiment_run: 'An execution instance of an experiment that records actual conditions, observations, and raw results.',\n  learning: 'An insight gained from an experiment',\n  test_plan: 'A structured plan for testing a hypothesis',\n  evidence: 'Data supporting or refuting a hypothesis',\n  research_plan: 'A plan for gathering evidence to validate a draft entity',\n  // Market Intelligence\n  competitor: 'A competing product or company',\n  competitor_feature: 'A feature offered by a competitor',\n  market_trend: 'An emerging trend in the market',\n  market_segment: 'A distinct group of potential customers',\n  competitive_analysis: 'A structured analysis of the competitive landscape',\n  classification_axis: 'A single dimension in a competitive classification matrix that defines one axis of comparison across alternatives.',\n  classification_value: 'A position or value on a classification axis, representing where one option lands on that dimension.',\n  competitor_signal: 'An observed competitor move or datapoint (a pricing change, launch, or hire) that feeds competitive analysis',\n  // User Research\n  research_study: 'A planned research activity',\n  insight: 'A synthesised finding from research',\n  participant: 'A person participating in research',\n  observation: 'A specific behaviour or statement observed',\n  quote: 'A direct quote from a research participant',\n  affinity_cluster: 'A group of related observations',\n  research_question: 'A question guiding a research study',\n  interview_guide: 'A structured guide for conducting interviews',\n  survey_response: 'A response to a survey instrument',\n  // Experience Design\n  user_journey: 'An end-to-end map of a user experience',\n  journey_step: 'A single step in a user journey',\n  journey_phase: 'A named phase in a user journey that groups a sequence of actions the user performs to reach a milestone.',\n  journey_action: 'A single step a user takes within a journey phase, the atomic unit of observable user behaviour.',\n  user_flow: 'A navigation path through the product',\n  screen: 'A distinct screen or view in the product',\n  screen_state: 'A specific state of a screen (e.g., empty, loading, error)',\n  surface: 'A place inside a screen, the features that occupy it, and the rule that decides who wins it',\n  design_question: 'An open design problem to explore',\n  design_concept: 'A possible design direction or approach',\n  prototype: 'An interactive mockup for testing',\n  wireframe: 'A low-fidelity structural layout',\n  annotation: 'A note or markup on a design artifact',\n  interaction_spec: 'A specification for an interaction behaviour',\n  // Design System\n  design_component: 'A reusable UI component',\n  design_token: 'A design token (colour, spacing, typography)',\n  design_system: 'The root design system entity',\n  design_pattern: 'A documented design pattern',\n  design_guideline: 'A design usage guideline',\n  // Brand Identity\n  brand_identity: 'The root brand identity entity',\n  brand_colour: 'A brand colour definition',\n  brand_typography: 'Brand typography specifications',\n  brand_voice: 'Brand voice and tone guidelines',\n  brand_logo: 'A brand logo or mark',\n  brand_imagery: 'Brand imagery and photography guidelines',\n  // Product Specification\n  feature: 'A product capability or feature',\n  feature_area: 'A grouping of related features',\n  epic: 'A large body of work that can be broken into stories',\n  user_story: 'A user\\'s goal and the value they expect, in the \"As a… I want… So that…\" format. Now also a first-class plannable unit (priority, effort, assignee, due_date) that schedules into a planning_cycle, and it round-trips an external board\\'s column via workflow_state.',\n  acceptance_criterion: 'A condition that must be met for a story to be done',\n  release: 'A shipped version of the product',\n  task: 'A unit of work within a story or epic',\n  bug: 'A defect or unexpected behaviour',\n  roadmap: 'A strategic plan of features and milestones',\n  roadmap_item: 'An item on the product roadmap',\n  theme: 'A strategic grouping of related features',\n  roadmap_theme: 'A customer problem used as the organising unit of a roadmap',\n  changelog: 'A record of changes shipped in a release',\n  planning_cycle: 'The cadence axis of a plan: a dated interval a team plans in, be it a sprint, iteration, quarter, or program increment. Cycles self-nest, so a fine iteration sits inside a coarse period to form a granularity ladder.',\n  configuration_axis: 'A named dimension along which the product\\'s composition differs: a feature flag, a plan tier, a permission level, a beta programme. The stored graph is the union of the family; one configuration is a projection of it.',\n  // Engineering\n  bounded_context: 'A DDD bounded context defining a service boundary',\n  service: 'A deployable service or microservice',\n  domain_event: 'An event published when something happens in the domain',\n  api_contract: 'An API contract or specification',\n  technical_debt_item: 'A known piece of technical debt',\n  feature_flag: 'A feature toggle for controlled rollout',\n  deployment: 'A deployment event',\n  aggregate: 'A DDD aggregate root',\n  domain_entity: 'A DDD domain entity: a core object with a distinct identity and lifecycle inside a bounded context',\n  value_object: 'A DDD value object',\n  command: 'A DDD command (write operation)',\n  read_model: 'A DDD read model (query projection)',\n  api_endpoint: 'A specific API endpoint',\n  database_schema: 'A database schema definition',\n  queue_topic: 'A message queue topic',\n  build_artifact: 'A build output (binary, container image)',\n  code_repository: 'A source code repository',\n  library_dependency: 'A third-party library dependency',\n  integration_pattern: 'An integration pattern (saga, event sourcing, etc.)',\n  external_api: 'An external API consumed by the product',\n  data_flow: 'A data flow between systems',\n  investigation: 'An investigation into an issue or incident',\n  root_cause: 'An identified root cause of an issue',\n  symptom: 'A symptom of a problem',\n  fix: 'A fix applied to resolve an issue',\n  // Growth\n  funnel: 'A conversion funnel tracking user progression',\n  funnel_step: 'A stage within a conversion funnel',\n  acquisition_channel: 'A channel through which users are acquired',\n  growth_campaign: 'A growth-focused campaign',\n  cohort: 'A group of users sharing a common characteristic',\n  behavioral_segment: 'A user segment based on behaviour',\n  growth_loop: 'A self-reinforcing growth cycle',\n  variant: 'A variant in an A/B test',\n  attribution_model: 'A model for attributing conversions to touchpoints',\n  // Business Model\n  business_model: 'The business model canvas or definition',\n  value_proposition: 'A unique value offered to customers',\n  revenue_stream: 'A source of revenue',\n  pricing_tier: 'A pricing tier or plan',\n  cost_structure: 'A cost category or structure',\n  unit_economics: 'Per-unit economic metrics (CAC, LTV, etc.)',\n  partnership: 'A strategic partnership',\n  key_resource: 'A key resource required by the business',\n  key_activity: 'A key activity the business performs',\n  target_customer_segment: 'A target customer segment',\n  customer_relationship: 'A type of customer relationship',\n  distribution_channel: 'A channel for delivering value to customers',\n  // Go-To-Market\n  gtm_strategy: 'A go-to-market strategy',\n  ideal_customer_profile: 'The ideal customer profile (ICP)',\n  positioning: 'Product positioning statement',\n  messaging: 'Messaging framework and key messages',\n  launch: 'A product launch event',\n  content_strategy: 'A content strategy for thought leadership',\n  sales_motion: 'A repeatable sales motion',\n  competitive_battle_card: 'A competitive battle card for sales enablement',\n  demand_gen_program: 'A demand generation program',\n  territory: 'A sales territory',\n  objection: 'A common sales objection',\n  rebuttal: 'A rebuttal to a sales objection',\n  proof_point: 'Evidence supporting a sales claim',\n  // Team & Organisation\n  team: 'A cross-functional team',\n  role: 'A role within a team',\n  stakeholder: 'A person with influence over the product',\n  team_okr: 'A team-level OKR',\n  retrospective: 'A team retrospective',\n  dependency: 'A cross-team or system dependency',\n  department: 'An organisational department',\n  skill: 'A skill or competency within a team',\n  ceremony: 'A recurring team ritual (standup, planning)',\n  capacity_plan: 'A plan for allocating team capacity',\n  person: 'A named individual (owner, stakeholder, or participant) referenced across the graph',\n  // Data & Analytics\n  data_source: 'A data source or integration',\n  event_schema: 'An event schema for tracking',\n  dashboard: 'An analytics dashboard',\n  data_model: 'A data model or schema',\n  data_quality_rule: 'A data quality validation rule',\n  data_product: 'A curated, reusable data asset',\n  data_pipeline: 'An automated pipeline for data transformation',\n  data_lineage: 'A record of data origin and transformations',\n  glossary_term: 'A defined term for shared understanding',\n  data_domain: 'A logical grouping of related data assets',\n  report: 'A structured analytical report',\n  // Customer Success\n  support_ticket: 'Customer support request or issue',\n  customer_feedback: 'Voice-of-customer input',\n  churn_reason: 'Why a customer left',\n  customer_health_score: 'A composite health score for a customer',\n  playbook: 'A standard operating procedure for CS',\n  service_level_agreement: 'A service level agreement with customers',\n  customer_journey_stage: 'A stage in the post-sale customer journey',\n  touchpoint: 'A customer interaction touchpoint',\n  success_milestone: 'A customer success milestone',\n  service_blueprint: 'A blueprint of the full service delivery',\n  // Content & Knowledge\n  content_piece: 'A piece of content (article, video, etc.)',\n  knowledge_base_article: 'A knowledge base article',\n  brand_asset: 'A brand asset (logo, image, etc.)',\n  internal_doc: 'An internal documentation page',\n  prompt_template: 'A reusable prompt template',\n  content_calendar: 'A content publication calendar',\n  content_theme: 'A thematic grouping for content',\n  documentation_template: 'A template for documentation',\n  document: 'A general-purpose document',\n  // Legal\n  legal_entity: 'A legal entity (company, subsidiary)',\n  ip_asset: 'An intellectual property asset',\n  contract: 'A legal contract',\n  contract_clause: 'A clause within a contract',\n  privacy_policy: 'A privacy policy',\n  // Compliance\n  compliance_requirement: 'A compliance requirement',\n  risk: 'A risk to the product or business',\n  data_contract: 'A data-sharing contract',\n  audit_log_policy: 'An audit logging policy',\n  compliance_framework: 'A compliance framework (SOC 2, GDPR, etc.)',\n  security_audit: 'A security audit',\n  // DevOps & Platform\n  service_level_indicator: 'A service level indicator (SLI)',\n  service_level_objective: 'A service level objective (SLO)',\n  error_budget: 'An error budget for a service',\n  incident: 'A production incident',\n  postmortem: 'A post-incident review',\n  runbook: 'A runbook for incident response',\n  monitor: 'A monitoring check',\n  alert_rule: 'An alerting rule',\n  ci_pipeline: 'A CI/CD pipeline',\n  release_strategy: 'A release strategy (canary, blue-green, etc.)',\n  on_call_rotation: 'An on-call rotation schedule',\n  infrastructure_component: 'An infrastructure component (server, CDN, etc.)',\n  // Security\n  threat_model: 'A threat model for the system',\n  threat: 'A specific security threat',\n  vulnerability: 'A known vulnerability',\n  security_control: 'A security control or mitigation',\n  security_policy: 'A security policy',\n  penetration_test: 'A penetration test',\n  security_review: 'A security review',\n  data_classification: 'A data classification level',\n  access_policy: 'An access control policy',\n  // Accessibility\n  a11y_standard: 'An accessibility standard (WCAG, Section 508)',\n  a11y_guideline: 'An accessibility guideline',\n  a11y_audit: 'An accessibility audit',\n  a11y_issue: 'An accessibility issue',\n  a11y_annotation: 'An accessibility annotation on a design',\n  // Quality Assurance\n  test_suite: 'A suite of related tests',\n  test_case: 'An individual test case',\n  qa_session: 'An exploratory QA session',\n  regression_test: 'A regression test',\n  test_coverage_report: 'A test coverage report',\n  test_environment: 'A testing environment',\n  test_result: 'A test execution result',\n  // Customer Feedback\n  feedback_program: 'A structured feedback collection program',\n  feature_request: 'A user-submitted feature request',\n  feedback_vote: 'A vote on a feature request or feedback item',\n  nps_campaign: 'A Net Promoter Score survey campaign',\n  user_advisory_board: 'A panel of users providing ongoing feedback',\n  beta_program: 'A beta testing program',\n  feedback_theme: 'A recurring theme across feedback items',\n  // Pricing & Packaging\n  pricing_strategy: 'An overarching pricing strategy',\n  package: 'A bundled package of features at a price point',\n  discount_strategy: 'A strategy for offering discounts',\n  trial_config: 'Configuration for a free trial',\n  paywall: 'A paywall gating premium features',\n  // AI & Machine Learning\n  ai_model: 'An AI or ML model used within the product',\n  prompt_version: 'A version of a prompt template',\n  eval_benchmark: 'A benchmark for evaluating AI quality',\n  eval_run: 'An evaluation run against a benchmark',\n  ai_cost_tracker: 'A tracker for AI inference costs',\n  hallucination_report: 'A report of an AI hallucination',\n  ai_guardrail: 'A guardrail for AI safety',\n  model_comparison: 'A comparison between AI models',\n  ai_experiment: 'An AI-focused experiment',\n  ai_dataset: 'A dataset for AI training or evaluation',\n  ai_trace: 'An AI inference trace',\n  // Workflows & Agents\n  workflow_template: 'A reusable workflow template',\n  workflow_run: 'An execution of a workflow',\n  agent_definition: 'An autonomous agent definition',\n  agent_session: 'An agent working session',\n  review_gate: 'A human review checkpoint in a workflow',\n  approval_record: 'A record of an approval decision',\n  agent_skill: 'A capability of an agent',\n  agent_hook: 'A trigger connecting an agent to an event',\n  workflow_artifact: 'An output artifact from a workflow run',\n  agent_task: 'A discrete unit of agent work',\n  // Portfolio\n  organization: 'The top-level organisational entity',\n  portfolio: 'A grouping of products by strategic axis',\n  product_area: 'A grouping of products by organisational axis',\n  // Sales & Revenue\n  account: 'A customer account',\n  contact: 'A person within an account',\n  lead: 'An inbound lead',\n  deal: 'An active sales opportunity',\n  pipeline_sales: 'A sales pipeline',\n  pipeline_stage: 'A stage in the sales pipeline',\n  quote_document: 'A formal quote document',\n  subscription: 'A recurring subscription',\n  invoice: 'An invoice for billing',\n  forecast: 'A revenue forecast',\n  // Program Management\n  program: 'A program coordinating multiple projects',\n  project: 'A project within a program',\n  milestone: 'A key date or achievement',\n  risk_register: 'A register of project risks',\n  change_request: 'A request to change project scope',\n  deliverable: 'A deliverable from a project',\n  resource_allocation: 'An allocation of team capacity',\n  status_report: 'A project status report',\n  // Marketing\n  marketing_strategy: 'A marketing strategy',\n  marketing_channel: 'A marketing channel',\n  marketing_campaign_plan: 'A marketing campaign plan',\n  email_sequence: 'An email nurture sequence',\n  social_post: 'A social media post',\n  seo_keyword: 'An SEO keyword target',\n  ad_creative: 'An ad creative',\n  press_release: 'A press release',\n  event: 'A marketing event',\n  community_initiative: 'A community engagement initiative',\n  // Localisation\n  locale: 'A supported locale (language + region)',\n  translation_key: 'A translatable string key',\n  translation_bundle: 'A bundle of translation keys',\n  locale_config: 'Per-locale configuration settings',\n  cultural_adaptation: 'A region-specific cultural adaptation',\n  regional_pricing: 'Location-based pricing',\n  // Customer Education\n  education_program: 'A customer education program',\n  tutorial: 'A step-by-step tutorial',\n  walkthrough: 'A guided product walkthrough',\n  webinar: 'A live or recorded webinar',\n  certification: 'A certification program',\n  help_video: 'A help video',\n  learning_path: 'A structured learning path',\n  // Partners & Ecosystem\n  partner_program: 'A partner program',\n  partner_tier: 'A partner tier level',\n  api_ecosystem: 'An API ecosystem',\n  marketplace_listing: 'A marketplace listing',\n  developer_portal: 'A developer portal',\n  integration_partner: 'An integration partner',\n  partner_revenue_share: 'A partner revenue sharing arrangement',\n  // Foundations\n  operating_lifecycle: 'A canonical, ordered (often cyclic) operating process a product\\'s journey phases map onto',\n  operating_stage: 'One ordered stage of an operating_lifecycle',\n  specification: 'A canonical open standard or specification that primitives and products conform to',\n  primitive: 'A canonical reusable building block defined by a specification',\n  // Workspace\n  workspace: 'A spatial thinking space for arranging entities',\n  framework_exercise: 'A recorded run of a product framework (RICE, OST, and the like) over specific entities, holding its inputs and outputs',\n  composition: 'A published arrangement of graph entities that has an identity of its own: a gallery, a board, a deck. Membership can be derived by running its query, position is authored by a person, and both are stored because both are real.',\n  capture: 'A dated, hashed rendition of something already in the graph: a screenshot of a surface, a PDF of a report, an export of a canvas. The subject stays a graph node; the capture records what it looked like at one moment, and the content hash says whether it still does.',\n})\n\n/**\n * The authored description for an entity type, or `undefined`.\n *\n * A lookup rather than direct indexing so a caller handed a runtime string does\n * not have to assert the key exists.\n */\nexport function getEntityDescription(type: string): string | undefined {\n  return UPG_ENTITY_DESCRIPTIONS[type]\n}\n","/**\n * UPG Base Node and shared primitives. Every node extends `UPGBaseNode`.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGEntityType } from '../catalog/entity-catalog.js'\nimport type { ISODateTime } from '../properties/primitives.js'\n\n// ─── Shared primitives ────────────────────────────────────────────────────────\n\n/** Confidence level for a type mapping when importing from an external tool.\n *  - `high`: unambiguous match (e.g. exact type string match)\n *  - `medium`: probable match (e.g. semantic similarity)\n *  - `low`: speculative match, human review recommended\n *  - `manual`: mapping was set explicitly by a human */\nexport type UPGMappingConfidence = 'high' | 'medium' | 'low' | 'manual'\n\n/** One external link beyond the canonical artifact.\n *\n * Generalises the `ServiceProperties.links` shape, which was the only\n * list-of-links declaration in the spec before 0.33.0, up to the base node so\n * that any node can hold more than one outward pointer.\n */\nexport interface UPGExternalLink {\n  /** URI. Same posture as `UPGBaseNode.external_ref`: https:// for cloud tools,\n   *  file:// or a relative path for local files. */\n  url: string\n  /** Human label for the link. */\n  label?: string\n  /** What kind of thing is on the other end, e.g. \"pull_request\", \"design\",\n   *  \"runbook\". A free string with a documented convention rather than an enum:\n   *  the set is open by nature and a closed one would be wrong within a release. */\n  kind?: string\n}\n\n// ─── Base node ────────────────────────────────────────────────────────────────\n\n/** The structural base shared by every node in a product graph.\n *\n * All entity types extend this interface, either directly (using `properties`\n * as `Record<string, unknown>`) or via the typed `UPGNode<T>` wrapper, which\n * narrows `properties` to the correct interface from `UPGPropertyMap`.\n *\n * Core identity fields (`id`, `type`, `title`) are required.\n * Everything else is optional to keep the format lightweight.\n *\n * @example\n * // A minimal persona node, only required fields populated.\n * const persona: UPGBaseNode = {\n *   id: 'n_persona_1',\n *   type: 'persona',\n *   title: 'Head of Product at a B2B SaaS scale-up',\n * }\n *\n * @example\n * // An imported node with mapping metadata + type-specific properties.\n * const importedPersona: UPGBaseNode = {\n *   id: 'n_persona_2',\n *   type: 'persona',\n *   title: 'Solo founder, non-technical',\n *   description: 'Operator who ships with AI and needs thinking tools to keep up.',\n *   tags: ['primary', 'launch-audience'],\n *   source_id: 'notion_page_abc123',\n *   source_type: 'customer_archetype',\n *   mapping_confidence: 'high',\n *   external_tool: 'notion',\n *   external_ref: 'https://notion.so/acme/abc123',\n *   properties: {\n *     is_primary: true,\n *     experience_level: 'intermediate',\n *   },\n * }\n */\nexport interface UPGBaseNode {\n  /** Unique identifier within the graph */\n  id: string\n  /** The UPG entity type (must be a value from UPGEntityType) */\n  type: UPGEntityType\n  /** Human-readable title */\n  title: string\n  /**\n   * Stable, human-readable handle for inline `[[type:slug]]` chips in\n   * `.upg.md` documents. Auto-generated from `title` when omitted; unique\n   * within `(product_id, type)`. The `id` field remains the canonical\n   * identifier for adapters, MCP tools, and cross-product edges. Resolvers\n   * MUST accept either form (UUID `id` OR slug) when matching chips.\n   */\n  slug?: string\n  /**\n   * Past values of `slug`, retained when the slug is renamed so existing\n   * `.upg.md` chips that reference the old slug still resolve. The set\n   * (slug ∪ aliases) is unique within `(product_id, type)`. Order is\n   * preservation-only; resolvers treat aliases as a flat lookup set.\n   */\n  aliases?: string[]\n  /**\n   * Stable, human-citable key minted for this node (e.g. `\"LTN-311\"`). Unique\n   * within the product ACROSS entity types, immutable once assigned, and never\n   * reused. Distinct from `slug`: a key is minted, not derived from the title.\n   *\n   * @remarks\n   * WHY NOT `slug`. A slug is unique within `(product_id, type)` and is\n   * auto-generated from `title` when omitted. A citable key is neither: under\n   * slug's scope a `task` and a `bug` could each legally hold `LTN-311`, and a\n   * key that followed a retitle would break every citation that made it worth\n   * having. The two fields answer different questions and both are optional.\n   *\n   * WHY NOT `external_id`. That field records the identifier a node had in the\n   * tool it came FROM. It is the right home for an imported key's provenance\n   * and is structurally incapable of naming the next node, because there is no\n   * external tool to mint it. A graph that outlives its source tool needs a key\n   * of its own.\n   *\n   * MINTING. The next number is `max(existing) + 1`, derived from the graph. No\n   * counter is serialised, because a counter is store state rather than a fact\n   * about the thing (the same cut that keeps `composition.rev`, which is a fact,\n   * and excludes a concurrency token, which is not).\n   *\n   * WHICH PREFIX (normative; ladder stated as built in 0.33.1, candidate set\n   * narrowed in 0.34.0). Three rungs, tried in order.\n   *\n   *   1. A create NAMES its prefix explicitly.\n   *   2. Otherwise the CANDIDATE SET is consulted. It is the UNION of the prefixes\n   *      DECLARED by the product's teams (`team.key_prefix`) and the prefixes\n   *      OBSERVED on the product's existing keys. One candidate resolves; more\n   *      than one, and the create surface asks. `product.key_prefix` is consulted\n   *      only when no team declares one, and is `@deprecated` for that reason.\n   *   3. A product with an empty candidate set and no explicit prefix mints no\n   *      keys.\n   *\n   * THE OBSERVED RUNG IS A REAL MINT PATH, and 0.33.0 published two sentences that\n   * disagreed about whether it existed. This paragraph used to end \"A product where\n   * nothing declares a prefix mints no keys\", which deletes it; the two paragraphs\n   * below both name a prefix INFERRED from existing keys, and `team.key_prefix`\n   * rule 3 presupposes it by construction. The field settles it: the only keyed\n   * graph in the estate carries 1,032 keys minted by inference in a product that\n   * declares no prefix at all, and under the deleted rung that graph could not\n   * exist. Corrected in the 0.33.1 patch and restated here.\n   *\n   * A DECLARATION ADDS A CANDIDATE; IT DOES NOT REMOVE ONE (0.34.0). Declaring a\n   * team prefix suppresses `product.key_prefix` and nothing else. It never\n   * suppresses an OBSERVED prefix, which is evidence of a namespace already in\n   * use. The full argument, the measurement behind it and the reason it ships as a\n   * change rather than as a patch are on `team.key_prefix`.\n   *\n   * Key uniqueness is scoped to the product across entity types; a prefix names a\n   * team within that scope, not a separate number line.\n   *\n   * ENFORCED WITHIN THE PRODUCT (0.34.1). A create naming a key another node in\n   * this product already holds is REFUSED, across entity types, with a typed\n   * `DuplicateNodeKeyError`. Immutability was already enforced on the update\n   * path from 0.33.0, through the typed field and through `properties` both.\n   *\n   * THE REFUSAL IS AN ERROR AND NOT A SILENT NO-KEY, and the distinction is the\n   * one the minting rules draw two paragraphs down. A portfolio-shared team's\n   * prefix mints nothing in a second product, and there the refusal IS no-key\n   * and never an exception — because nobody asked for that key; it was inferred.\n   * A duplicate arrives the other way round: the caller NAMED it. Returning\n   * success for a node whose citation was quietly dropped is the failure mode\n   * the 0.32.2 field guards exist to end.\n   *\n   * ENFORCED ON CREATE, NOT ON OPEN. A graph minted before the check existed may\n   * hold a collision, and a store that refuses to load it leaves its owner no\n   * way to repair it. The index is therefore built first-wins at load and the\n   * invariant is held at the only moment it can still be honoured.\n   *\n   * THE PRECEDING TWO PARAGRAPHS SHIPPED AS AN OVERCLAIM AND ARE CORRECTED HERE.\n   * 0.33.0 wrote \"uniqueness is enforced per product (the store index is\n   * `(product_id, key)`)\" as settled fact, and 0.34.0 restated the within-product\n   * case as stated-but-unchecked without reconciling the two. Neither was\n   * describing anything that ran: no index existed and no check fired, on any\n   * release through 0.34.0. It was measured on the only keyed graph in the\n   * estate — 1,032 keys, and a second node claiming one of them was accepted\n   * without a warning. This matters more than a wrong sentence usually would,\n   * because the portfolio detector below names the per-product invariant as its\n   * premise: a portfolio check that assumes each product is internally clean was\n   * resting on nothing. 0.34.1 makes the sentence true rather than deleting it.\n   *\n   * PORTFOLIO-WIDE UNIQUENESS IS DEFINED AND UNENFORCED (0.33.0). Within a\n   * portfolio, one `(prefix, number)` pair should identify one node. Uniqueness\n   * is enforced per product (the store index is `(product_id, key)`, and from\n   * 0.34.1 that index exists), so two products minting under one prefix produce\n   * the same citation for two different things. This is measured rather than\n   * feared: a fixture reproduces the\n   * collision through the ordinary create path, including the quiet case where\n   * nobody declares a prefix and it is inferred from existing keys. No PER-PRODUCT\n   * check can ever see it, because each product reports its own key as valid —\n   * which is why the detector that ships in 0.34.0 is a PORTFOLIO-scope\n   * anti-pattern (`duplicate-key-across-products`) rather than a graph validation.\n   * It is ENFORCED from the day it ships; what was staged is the corpus, and the\n   * distinction matters because there is no defined-then-enforced mechanic and\n   * inventing one would have been worse than either real option. A detector that is\n   * registered but declines to fire is a detector nobody can reason about.\n   *\n   * MINTING IS PRODUCT-SCOPED (normative, 0.33.0). The `(product_id, key)` index\n   * is the enforced invariant and the scope of a key sequence is the product.\n   * `team` is `portfolio_shared`, so one team can be referenced from two\n   * products; minting does not travel with it. A portfolio-shared team's prefix\n   * is NOT a minting candidate in a second product, refusal is NO-KEY and never\n   * an exception, and the rule applies on the MINT path including a prefix that\n   * was INFERRED from existing keys rather than requested by any caller.\n   * Portfolio-shared team minting is deferred until a supra-product uniqueness\n   * design exists. See `team.key_prefix` for the rule in full, including the three\n   * mechanics 0.34.0 made normative that this rule needs and 0.33.0 left open: HOW\n   * a minter decides which product a prefix belongs to (evidence, not a stored\n   * marker), what happens when nothing can decide (NEITHER mints, no invented\n   * tiebreak), and what \"in scope\" means (engine-defined, with a floor at every\n   * product the engine can enumerate for this caller and a ceiling at every product\n   * the caller could not otherwise read).\n   *\n   * WHERE THE BEHAVIOUR LIVES, because this is a contract and not an\n   * implementation. Nothing in this package mints a key. Deriving the next number\n   * requires reading every keyed node in the product, and that read must page\n   * explicitly, so the minter is the graph service and the agent surface accepts\n   * a caller-supplied key on create without ever deriving one.\n   *\n   * @example \"LTN-311\"\n   */\n  key?: string\n  /** Optional narrative description */\n  description?: string\n  /** Freeform tags for filtering and grouping */\n  tags?: string[]\n  /** Current lifecycle phase (must be a phase ID from getLifecycleForType()).\n   *  E.g., for hypothesis: 'untested' | 'testing' | 'resolved'.\n   *  Entity types without a lifecycle definition should omit this field.\n   *  Validated at runtime against UPG_ALL_PHASES_SET. */\n  status?: string\n  /**\n   * Swept out of default views. ORTHOGONAL to `status`: a node can be done and\n   * live, or done and archived, and those are different facts. Archived nodes\n   * remain fully queryable.\n   *\n   * @remarks\n   * WHY THIS IS NOT A LIFECYCLE PHASE. Several lifecycles carry an `archived`\n   * phase, and in every one of them it is `status_category: 'completed'` — so in\n   * the six-bucket read, archived and done are indistinguishable. Field data\n   * settles it: a real 1,032-issue tracker held 559 archived-Done items\n   * alongside 18 live-Done ones. One field cannot carry two facts, and a bucket\n   * system that collapses them cannot answer the question it exists for.\n   *\n   * THE DEFAULT-READ CONVENTION, documented and NOT enforced: archived nodes are\n   * excluded from default views and included on request (`UPGViewQuery\n   * .include_archived`). A consumer that shows them by default is doing\n   * something unusual, not something wrong, so no check fires on it.\n   *\n   * Generalised at 0.32.0 from `WorkspaceProperties.archived`, which shipped the\n   * same pair for one type and is now `@deprecated` in favour of this field.\n   * The existing `archived` LIFECYCLE PHASES are deliberately untouched;\n   * reconciling them is its own cycle.\n   */\n  archived?: boolean\n  /** ISO timestamp archived. Pairs with `archived === true`. */\n  archived_at?: ISODateTime\n  /** Original ID in the source tool (for round-trip fidelity) */\n  source_id?: string\n  /** Original type name in the source tool */\n  source_type?: string\n  /** Confidence level of the type mapping */\n  mapping_confidence?: UPGMappingConfidence\n  /** External tool that holds the canonical artifact (e.g. \"figma\", \"linear\", \"notion\") */\n  external_tool?: string\n  /** URI to the canonical artifact: https:// for cloud tools, file:// or relative path for local files */\n  external_ref?: string\n  /** Identifier in the external tool's system (for sync / round-trip) */\n  external_id?: string\n  /**\n   * Additional external links. `external_ref` names THE canonical artifact and\n   * stays the single answer to \"where does this live\"; this list holds\n   * everything else that points outward. A node may carry this with no\n   * `external_ref` when no single link is canonical.\n   *\n   * @remarks\n   * WHY A LIST AND NOT AN ENTITY. A measured tracker import produced 703\n   * attachments across 1,032 issues: 524 fitted on `external_ref` and 162\n   * overflowed into a vendor-namespaced property bag key with nowhere declared to\n   * go. A link has no lifecycle, no owner, no description and no independent\n   * identity, so minting a `link` type for it would pay roughly fourteen\n   * registration points for a scalar fact about a node.\n   *\n   * WHY NOT `external_refs`. That name is one character from `external_ref` and\n   * means the opposite thing (all the others, versus the canonical one). Two\n   * fields whose names differ by a plural and whose semantics differ by\n   * canonicality is a misreading waiting to happen in every consumer.\n   *\n   * MIGRATION NOTE, CORRECTED 0.34.0 ON TWO FIGURES. Both were carried forward\n   * from the 0.33.0 pass and both were wrong, and the second would have broken\n   * this field's own contract on its first real population.\n   *\n   *   THE RESIDUE IS 179, NOT 162. Seventeen further attachments sat in a second\n   *   vendor bag key and were equally homeless. They were never counted because\n   *   the census read one key.\n   *\n   *   THE CANONICAL URL MUST BE SUBTRACTED BEFORE THE COPY. 524 of the 528 nodes\n   *   holding a parked bag DUPLICATE their own `external_ref` inside it. A\n   *   straight copy of the bag into this list would therefore put the canonical\n   *   artifact into the NON-canonical list on 99% of the field's first real\n   *   population, breaking the exact invariant this field was minted to\n   *   establish. A migration reads the bag, removes the entry matching\n   *   `external_ref`, and copies what remains.\n   *\n   * The correction is recorded here rather than in a plan because this is where a\n   * migration author will be standing when they need it.\n   *\n   * @example\n   * [{ url: 'https://github.com/acme/api/pull/812', label: 'PR 812', kind: 'pull_request' }]\n   */\n  external_links?: UPGExternalLink[]\n  /**\n   * When the node was created. Store metadata lifted into the spec at 0.33.0 so\n   * that a declared view query can express a window over it.\n   *\n   * @volatile\n   * @remarks\n   * TAGGED `@volatile` DELIBERATELY. These two timestamps are maintained by\n   * whatever store holds the graph rather than authored, so they are not design\n   * knowledge and a reader must not treat them as stable facts about the thing.\n   * They are declared anyway because `UPGViewClause` can open a `date` window and\n   * two of the six date dimensions a real board filters on are these; leaving them\n   * undeclared would ship a query language that cannot say what the surface most\n   * often says, which is the failure the clause list exists to fix.\n   */\n  created_at?: ISODateTime\n  /**\n   * When the node was last modified. Store metadata, same posture as\n   * `created_at`.\n   *\n   * @volatile\n   */\n  updated_at?: ISODateTime\n  /**\n   * Type-specific properties.\n   *\n   * @remarks\n   * NAMESPACED EXTENSION KEYS (the 0.31.0 rule, extended to this bag at 0.33.0).\n   * A key that a tool owns and the spec does not declare is written\n   * `<tool>:<key>`, with a colon. An underscore key such as\n   * `linear_state_history` is indistinguishable from a misspelled spec property:\n   * no migration can target it and no validator can tell it apart from a typo,\n   * and that undetectability is the whole reason the rule exists. The rule was\n   * written for `WorkspaceCanvas` and applies here for the same reason.\n   *\n   * ONE UNDECLARED EXTENSION IS KNOWN, MEASURED AND DELIBERATELY LEFT UNDECLARED.\n   * A tracker import carries raw ordered state-transition history for every issue\n   * (1,032 issues, 2,862 transitions in the measured corpus) under a vendor-owned\n   * key. It has no declared shape because nothing reads it: declaring a shape for\n   * records nobody queries is dead schema, and it would freeze one vendor's\n   * transition model into the format before a second source has been seen. The\n   * pull-forward condition is the first reader. Silence and a decision look\n   * identical six months later, so this is written down as a decision.\n   *\n   * THAT KEY IS NOT ACTUALLY NAMESPACED, AND THE PARAGRAPH ABOVE USED TO CLAIM IT\n   * WAS (corrected 0.34.1). The rule two paragraphs up mandates `<tool>:<key>`\n   * with a COLON. The import writes `linear_state_history`, with an underscore —\n   * the precise shape the rule was written to forbid, cited here as the example\n   * of compliance. It went unnoticed because nothing could see it: no drift class\n   * examined undeclared bag keys until `undeclared_property_drift` shipped in\n   * 0.34.1, which measured 5,779 such keys across eight `linear_*` shapes on the\n   * one imported graph in the estate.\n   *\n   * Recorded rather than migrated, because renaming a key on 1,032 nodes is a\n   * migration with its own cycle and this paragraph is where its author will be\n   * standing. What changes here is the claim, not the data.\n   */\n  properties?: Record<string, unknown>\n}\n\n// ─── Base-node fields as runtime data ─────────────────────────────────────────\n\n/**\n * Compile-time lock between `UPGBaseNode` and its runtime field list.\n *\n * `Record<keyof UPGBaseNode, true>` is exhaustive in BOTH directions: omit a\n * field and TypeScript reports the property as missing; add one that is not on\n * the interface and it reports an excess property. So a field cannot be added\n * to `UPGBaseNode` without this object failing to compile until it is listed\n * here too, and the runtime list below can never quietly disagree with the type.\n *\n * WHY THIS EXISTS. A TypeScript interface is erased at runtime, so every\n * consumer that needs to ask \"is this key a base field?\" previously kept its own\n * hand-maintained copy, each carrying a comment asking the next editor to keep\n * it in sync. Three such copies existed and 0.32.0 updated none of them: `key`,\n * `archived`, and `archived_at` shipped on the interface while\n * `UPGFileStore.updateNode` silently dropped all three from any patch and two\n * drift detectors reported a node holding them as carrying \"non-spec top-level\n * fields\". Derivation replaces the request to remember with a build failure.\n *\n * The value is `true` throughout and carries no meaning; only the KEYS matter.\n */\nconst BASE_NODE_FIELD_PRESENCE: Record<keyof UPGBaseNode, true> = {\n  id: true,\n  type: true,\n  title: true,\n  slug: true,\n  aliases: true,\n  key: true,\n  description: true,\n  tags: true,\n  status: true,\n  archived: true,\n  archived_at: true,\n  source_id: true,\n  source_type: true,\n  mapping_confidence: true,\n  external_tool: true,\n  external_ref: true,\n  external_id: true,\n  external_links: true,\n  created_at: true,\n  updated_at: true,\n  properties: true,\n}\n\n/**\n * Every top-level field declared by `UPGBaseNode`, as runtime data.\n *\n * This is the SINGLE SOURCE for \"what is a base-node field\". Consumers that\n * classify top-level keys (drift detectors, patch mergers, serialisers) must\n * derive from this rather than enumerate their own list.\n *\n * Order follows the interface declaration order and is not significant; callers\n * that need a canonical serialisation order use `NODE_KEY_ORDER` in\n * `format/canonical.ts`, which is deliberately a SUPERSET (it also orders\n * tolerated non-base keys such as `lifecycle_status` and `sort_order`).\n */\nexport const UPG_BASE_NODE_FIELDS: readonly (keyof UPGBaseNode)[] = Object.freeze(\n  Object.keys(BASE_NODE_FIELD_PRESENCE) as (keyof UPGBaseNode)[],\n)\n\n/** `UPG_BASE_NODE_FIELDS` as a lookup set, for membership tests. */\nexport const UPG_BASE_NODE_FIELD_SET: ReadonlySet<string> = new Set<string>(UPG_BASE_NODE_FIELDS)\n\n/**\n * Base-node fields that `id` aside are NOT freely mergeable by a generic\n * shallow patch, because each needs its own handling:\n *\n *   - `id`         identity; changing it would orphan every edge.\n *   - `type`       narrowed to `UPGEntityType`, and a type change carries a\n *                  property migration, so it routes through a migration path.\n *   - `slug`       a change rotates the old value into `aliases` (see\n *                  `rotateSlug`), so it is never a plain assignment.\n *   - `aliases`    replaced outright when patched directly, which must happen\n *                  AFTER the slug rotation that would otherwise append to it.\n *   - `properties` deep-merged rather than replaced.\n *\n * Exported so a merger can state the exclusions once and derive the rest.\n */\nexport const UPG_BASE_NODE_SPECIAL_MERGE_FIELDS: ReadonlySet<string> = new Set<string>([\n  'id',\n  'type',\n  'slug',\n  'aliases',\n  'properties',\n])\n","/**\n * UPG Document format. `UPGDocument` is the portable interchange shape for a product's knowledge graph.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGBaseNode, UPGMappingConfidence } from './base-node.js'\nimport type { UPGEdge } from './edges.js'\nimport type { CrossProductEligibleEdgeType } from '../catalog/edge-catalog.js'\nimport { UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES } from '../catalog/edge-catalog.js'\n\n// ─── Document source ──────────────────────────────────────────────────────────\n\n/**\n * Identifies the tool that produced a `UPGDocument`. Every exporter stamps\n * one of these into the document's `source` field so round-trips stay\n * auditable.\n *\n * @example\n * const source: UPGSource = {\n *   tool: 'entopo',\n *   tool_version: '0.3.1',\n *   workspace_id: 'ws_acme_main',\n * }\n */\nexport interface UPGSource {\n  /** The tool that exported this document */\n  tool: string\n  /** Optional tool version */\n  tool_version?: string\n  /** Optional workspace or project identifier in the source tool */\n  workspace_id?: string\n}\n\n// ─── Product summary ──────────────────────────────────────────────────────────\n\n/**\n * The root product described by a `UPGDocument`. All nodes in the document\n * belong to this product; portfolio documents carry an array of these.\n *\n * @example\n * const product: UPGProduct = {\n *   id: 'entopo',\n *   title: 'Entopo',\n *   description: 'The product creation tool: canvas + AI + graph, built on UPG.',\n *   stage: 'beta',\n * }\n */\nexport interface UPGProduct {\n  /** Unique identifier for the product within the document */\n  id: string\n  /** Human-readable name of the product */\n  title: string\n  /** Optional longer description of what the product does */\n  description?: string\n  /** Product lifecycle stage. Where this product is in its journey. */\n  stage?: UPGProductStage\n}\n\n/** Product lifecycle stages. Covers the full arc from napkin idea to end-of-life. */\nexport type UPGProductStage =\n  | 'concept'       // napkin idea, no validation yet\n  | 'validation'    // testing demand, talking to users\n  | 'build'         // actively developing v1\n  | 'beta'          // early users, iterating\n  | 'launch'        // generally available\n  | 'growth'        // scaling users/revenue\n  | 'mature'        // stable, optimizing\n  | 'maintenance'   // sustaining, minimal investment\n  | 'sunset'        // winding down\n\n// ─── Cross-product edge types ────────────────────────────────────────────────\n\n/**\n * Portfolio-native cross-product edge types (0.17.3): relationships that exist ONLY\n * across products within a portfolio and have NO within-graph catalog entry, so they\n * cannot derive from a catalog flag the way the dual-registered set does. This is the\n * stable half of the whitelist (these change rarely); the growing, dual-registered\n * half is derived from the `cross_product_eligible` catalog flag — see\n * `CrossProductEligibleEdgeType` and `UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES`.\n *\n * @remarks\n * DECLARED AND UNENFORCED (recorded 0.34.0, exhaustively). No WRITER reads this\n * array. Not the SDK, not the local MCP server, not the cloud server, not the\n * graph service. Outside `node_modules` and `dist` it is referenced by its own\n * definition, two prose comments, one spec test, `check-editorial.mjs`, one\n * generated mirror, and documents. The tier is a declared vocabulary that nothing\n * validates at write time, so a graph can carry one of these types anywhere and no\n * gate objects.\n *\n * That is worth stating rather than leaving to be rediscovered, because it changes\n * what a \"non-colliding key\" would buy. A within-graph edge minted under a key that\n * does not collide with one of these would not be safe BECAUSE nothing collides at\n * runtime; it would be safe by discipline. Discipline and a guarantee should not be\n * confused in a comment that reads like a contract.\n *\n * This is the third artifact damaged by reading one of the two edge registries in\n * isolation, after the vocabulary check (fixed 0.33.0) and the withdrawn 0.33.0\n * Item G. The fingerprint half of `check:editorial` was the fourth and is fixed in\n * 0.34.0.\n */\nexport const UPG_CROSS_ONLY_EDGE_TYPES = [\n  // Peer overlap: \"these two products share / overlap on this thing.\" Symmetric,\n  // no canonical instance_of identity. shares_job / shares_need are the job/need\n  // siblings of the persona/competitor/metric peers (connective layer, 0.13.1).\n  'shares_persona',\n  'shares_competitor',\n  'shares_metric',\n  'shares_job',\n  'shares_need',\n  // Product-to-product relationships.\n  'depends_on_product',   // runtime dependency (built-on / dogfood), not containment\n  'cannibalises',\n  'succeeds',\n  'hosts',                // host runs the hosted product inside itself (container -> contained)\n  // OKR / measurement rollup primitives: the cascade ACROSS products (subordinate\n  // -> superior). `contributes_to` rolls a product strategy entity up to a higher-\n  // level one; `rolls_up_to` feeds a product metric into a higher-level north-star.\n  'contributes_to',\n  'rolls_up_to',\n  // Canonical instance + area-to-audience: the target lives in the portfolio\n  // `registry` section (`registry/{node_id}`). `instance_of` is same-type\n  // canonical-to-instance; the area edges are minted via `link_area_to_audience`.\n  'instance_of',\n  'area_serves_persona',\n  'area_targets_market_segment',\n  // Foundations (0.9.12): a product-graph entity links to a canonical specification\n  // or primitive. Registry-internal spec-to-spec links are catalog edges, not these.\n  //\n  // CORRECTED 0.34.0 — the target contract. This comment said `registry/{node_id}`,\n  // \"same shape as instance_of\". Every live instance disagrees: all three in the\n  // field target `{product_id}/{node_id}`, and the portfolio's `registry` section\n  // is EMPTY. A reader following the old sentence would look for a registry entry\n  // that has never existed. Both target forms are legitimate — a specification held\n  // as a canonical in the registry, or one held inside the product graph that owns\n  // it — and the field has so far only produced the second.\n  //\n  // THE GAP THIS TIER LEAVES, restated 0.34.0 because the 0.33.0 wording named a\n  // case no graph instantiates. It is NOT \"a specification in a graph with no\n  // portfolio around it\". It is the HOLDER PRODUCT, and it is live today: the\n  // product graph that HOLDS a specification node has three sibling products\n  // reaching it through this tier and no way to state its own relation to it,\n  // because the cross tier requires two distinct products and there is no\n  // within-graph conformance edge. Not closed in 0.34.0. The verb the live case\n  // wants is `defines` rather than `conforms_to` — a product does not conform to\n  // the specification it authors — and one instance of evidence is not enough to\n  // mint a catalog edge in the area that cost 0.33.0 its shape mid-build. The\n  // condition is the second holder-product instance, or any single-product graph\n  // modelling a specification it conforms to.\n  'product_implements_specification',\n  'product_exposes_specification',\n  'feature_conforms_to_specification',\n  'api_contract_speaks_specification',\n  'product_exposes_primitive',\n  'feature_manipulates_primitive',\n  'primitive_stored_as_data_type',\n] as const\n\n/** One portfolio-native cross-product edge type (see `UPG_CROSS_ONLY_EDGE_TYPES`). */\nexport type UPGCrossOnlyEdgeType = (typeof UPG_CROSS_ONLY_EDGE_TYPES)[number]\n\n/**\n * The set of valid cross-product relationship types. The union of two tiers:\n *  - `UPGCrossOnlyEdgeType` — portfolio-native edges with no within-graph form\n *    (the stable half, listed above).\n *  - `CrossProductEligibleEdgeType` — within-graph catalog edges dual-registered\n *    across graphs via the `cross_product_eligible` flag (the derived, self-\n *    maintaining half: flag a catalog entry and it joins this union with no edit\n *    here). Includes the competitive-intel edges, the design-system / brand and\n *    marketing references, org ownership (`node_owned_by_*`), and the strategy /\n *    OKR / measurement laddering that spans the rollup and its product graphs.\n */\nexport type UPGCrossEdgeType = UPGCrossOnlyEdgeType | CrossProductEligibleEdgeType\n\n/**\n * Runtime-checkable list of valid cross-product edge types, for validators and\n * writers that test `edge.type` against the whitelist at runtime. Composed from the\n * two tiers so a newly-flagged catalog edge flows in with no edit here. Order:\n * portfolio-native first, then the catalog-derived set in catalog declaration order.\n */\nexport const UPG_CROSS_EDGE_TYPES: readonly UPGCrossEdgeType[] = [\n  ...UPG_CROSS_ONLY_EDGE_TYPES,\n  ...UPG_CROSS_ELIGIBLE_CATALOG_EDGE_TYPES,\n]\n\n/**\n * Reserved pseudo product-id for the portfolio registry tier. Canonical\n * registry entities are addressed in qualified-id references (and `instance_of`\n * cross-edge targets) as `registry/{node_id}`. No real product may claim this\n * id; product creation rejects it. The registry itself lives in the\n * `registry` section of the portfolio document (`UPGPortfolioDocument.registry`),\n * not in a product file.\n */\nexport const REGISTRY_PRODUCT_ID = 'registry' as const\n\n// ─── Cross-product edge ──────────────────────────────────────────────────────\n\n/**\n * A cross-product edge links entities across different products within a portfolio.\n * The source/target use qualified IDs: `{product_id}/{node_id}`.\n */\nexport interface UPGCrossEdge {\n  /** Unique identifier within the portfolio document */\n  id: string\n  /** Qualified source: `{product_id}/{node_id}` */\n  source: string\n  /** Qualified target: `{product_id}/{node_id}` */\n  target: string\n  /** Cross-product relationship type */\n  type: UPGCrossEdgeType\n  /** Optional source product ID (denormalised for convenience) */\n  source_product_id?: string\n  /** Optional target product ID (denormalised for convenience) */\n  target_product_id?: string\n  /** Confidence level if this edge was inferred during import */\n  mapping_confidence?: UPGMappingConfidence\n  /**\n   * Edge metadata, for cross-edge types declared `carries_properties` in the\n   * edge catalogue (0.10.0, #38). A `feature_rivals_competitor_feature` cross-edge\n   * carries the parity assessment here: `parity_status` / `quality` / `is_gap` /\n   * `assessed_on` / `evidence` / `confidence`. Cross-edge types NOT declared\n   * `carries_properties` reject properties at the write surface.\n   */\n  properties?: Record<string, unknown>\n  /**\n   * Sanctioned divergence marker (`instance_of` only). When true, registry drift\n   * detection treats an instance title that differs from its canonical as\n   * intentional (an informative product-local name, e.g. \"Vercel Platform / SDK\"\n   * vs canonical \"Vercel\"), excluding it from the `title_divergence` count so\n   * `clean` reflects only un-sanctioned drift.\n   */\n  alias?: boolean\n  /**\n   * Audience relevance for `area_serves_persona` / `area_targets_market_segment`:\n   * whether the audience is a primary or secondary focus of this area. The\n   * primary-vs-secondary distinction is the core value of the area-to-audience matrix.\n   */\n  relevance?: 'primary' | 'secondary'\n  /**\n   * Audience role in this area's context (`area_serves_persona`). Mirrors\n   * `PersonaProperties.audience_role`: the same persona can be a `buyer` for one\n   * area and a `user` for another.\n   */\n  audience_role?: 'buyer' | 'user' | 'champion' | 'influencer' | 'partner'\n}\n\n// ─── Portfolio structures ─────────────────────────────────────────────────────\n\n/**\n * A product area within a portfolio. The organisational axis (who owns\n * what). Groups products by team or org structure, independent of strategic\n * theme. Areas may nest via `parent_area_id`.\n *\n * @example\n * const platformArea: UPGProductArea = {\n *   id: 'area_platform',\n *   title: 'Platform',\n *   description: 'Core infrastructure shared across all customer-facing products.',\n *   strategic_priority: 'high',\n *   products: ['entopo', 'upg-cli'],\n * }\n *\n * @example\n * // Nested sub-area that rolls up to a parent area.\n * const billingArea: UPGProductArea = {\n *   id: 'area_platform_billing',\n *   title: 'Billing',\n *   parent_area_id: 'area_platform',\n *   strategic_priority: 'medium',\n *   products: ['billing-service'],\n * }\n */\nexport interface UPGProductArea {\n  /** Unique identifier for the product area */\n  id: string\n  /** Human-readable name of the product area */\n  title: string\n  /** Optional longer description of the area's scope and ownership */\n  description?: string\n  /** Parent area ID for nesting (sub-areas) */\n  parent_area_id?: string | null\n  /** Strategic priority (mirrors the canonical `Priority` scale) */\n  strategic_priority?: 'urgent' | 'high' | 'medium' | 'low' | 'none'\n  /** Person or team that owns this area */\n  owner?: string\n  /** Product IDs that belong to this area */\n  products?: string[]\n}\n\n/**\n * A portfolio grouping. The strategic axis (where we invest). Groups\n * products by thesis or bet, independent of ownership. Portfolios may nest\n * via `parent_portfolio_id`.\n *\n * @example\n * const growthPortfolio: UPGPortfolio = {\n *   id: 'pf_growth',\n *   title: 'Growth Bets',\n *   description: 'New product investments aimed at new market expansion.',\n *   hierarchy_model: 'flat',\n *   products: ['entopo', 'upg-cli'],\n * }\n */\nexport interface UPGPortfolio {\n  /** Unique identifier for the portfolio */\n  id: string\n  /** Human-readable name of the portfolio */\n  title: string\n  /** Optional longer description of the portfolio's strategic focus */\n  description?: string\n  /** Parent portfolio ID for nesting (sub-portfolios) */\n  parent_portfolio_id?: string | null\n  /** How products are structured within this portfolio */\n  hierarchy_model?: 'flat' | 'nested' | 'matrix'\n  /**\n   * Investment posture / grouping (UPG 0.9.27; extended 0.17.x). `owned` =\n   * products we build and manage (the default: coverage, health, and\n   * product-spine anti-patterns apply). `watched` = an externally-monitored\n   * landscape such as competitor intelligence graphs, which must NOT be judged\n   * by product-management expectations or drag portfolio health. `strategic`,\n   * `internal`, and `gtm` are owned-side groupings (e.g. a Go-to-Market\n   * portfolio of revenue operating_functions, an Internal portfolio of support\n   * functions); they classify the portfolio but, like `owned`, do not relax\n   * product grading. Only `watched` does. Absent is treated as `owned`.\n   */\n  kind?: UPGPortfolioKind\n  /** Product IDs that belong to this portfolio */\n  products?: string[]\n}\n\n/**\n * Closed set of portfolio kinds (0.17.x extends the 0.9.27 owned/watched pair,\n * closing gap G2 / spec-issue #39). Only `watched` relaxes product grading;\n * `strategic` / `internal` / `gtm` are owned-side classifications.\n */\nexport const UPG_PORTFOLIO_KINDS = ['owned', 'watched', 'strategic', 'internal', 'gtm'] as const\nexport type UPGPortfolioKind = (typeof UPG_PORTFOLIO_KINDS)[number]\n\n/**\n * An organisation that owns portfolios and product areas. The top of the\n * portfolio-document hierarchy; a portfolio document has exactly one.\n *\n * @example\n * const org: UPGOrganization = {\n *   id: 'org_arkheiev',\n *   title: 'Arkheiev UG',\n *   description: 'Builds The Product Creator brand ecosystem.',\n *   logo_url: 'https://theproductcreator.com/logo.svg',\n *   industry: 'Developer Tools',\n * }\n */\nexport interface UPGOrganization {\n  /** Unique identifier for the organisation */\n  id: string\n  /** Legal or trading name of the organisation */\n  title: string\n  /** Optional longer description of what the organisation does */\n  description?: string\n  /** URL of the organisation's logo. Used in portfolio and org-level rendering. */\n  logo_url?: string\n  /** Industry sector the organisation operates in */\n  industry?: string\n}\n\n// ─── Registry (shared-vocabulary tier) ────────────────────────────────────────\n\n/**\n * The canonical shared-entity registry: the portfolio's shared vocabulary tier.\n *\n * Entities shared across products (personas, metrics, competitors,\n * market_segments, ...) are defined ONCE here as authoritative nodes; each\n * product's local instance links to the canonical via an `instance_of`\n * cross-edge (`registry/{node_id}` target). This is a third conceptual tier\n * above products: product graphs hold instances, the portfolio holds org\n * structure, and `registry` holds the shared vocabulary.\n *\n * A canonical entity is just a normal `UPGBaseNode` — canonical-ness is\n * conferred by living in the registry, not by a new type or flag. `edges` is\n * reserved for future canonical-internal structure (e.g. a canonical persona\n * pursuing a canonical job) and is optional; v1 tooling operates on `nodes`.\n *\n * @example\n * const registry: UPGRegistry = {\n *   nodes: [\n *     { id: 'persona_developer', type: 'persona', title: 'Developer',\n *       properties: { audience_role: 'user' } },\n *   ],\n * }\n */\nexport interface UPGRegistry {\n  /** Canonical shared entities. Each is a normal node addressed as `registry/{id}`. */\n  nodes: UPGBaseNode[]\n  /** Reserved: canonical-internal relationships. Optional; unused by v1 tooling. */\n  edges?: UPGEdge[]\n}\n\n// ─── Document integrity ───────────────────────────────────────────────────────\n\n/**\n * Checksum-backed tamper-evidence metadata stamped into a `UPGDocument` at\n * save time by the MCP server. Consumers re-hash on load and compare.\n *\n * @example\n * const integrity: UPGIntegrity = {\n *   checksum: 'a3f1c9e2b7d4806f1a5c3b2e8d9f4c17',\n *   verified_at: '2026-04-17T09:42:11.004Z',\n *   verified_by: 'upg-mcp-server@0.2.0',\n * }\n */\nexport interface UPGIntegrity {\n  /** SHA-256 checksum of nodes + edges content (hex, first 32 chars) */\n  checksum: string\n  /** ISO 8601 timestamp when checksum was computed */\n  verified_at: string\n  /** Tool that computed the checksum */\n  verified_by: string\n}\n\n// ─── Single-product document ──────────────────────────────────────────────────\n\n/**\n * A UPGDocument is a portable, versioned snapshot of a product's knowledge graph.\n *\n * How the format works:\n *\n * Every node carries its source identity (source_id + source_type + source.tool),\n * so the original record stays traceable and round-trips work.\n *\n * Every mapped entity carries `mapping_confidence`. When a source type doesn't\n * map cleanly, the confidence value records how uncertain the mapping is.\n *\n * `UPGEntityType` is a closed union. Adapters map unknown source types to the\n * nearest UPG type and preserve the original in `source_type` for auditing.\n *\n * Extra properties pass through in `properties` as they were received.\n *\n * `upg_version` records the spec version. Tools use it for forward compatibility.\n */\nexport interface UPGDocument {\n  /** Spec version (semver string, e.g. \"0.1\"). */\n  upg_version: string\n  /** ISO 8601 timestamp of export */\n  exported_at: string\n  /** The tool that produced this document */\n  source: UPGSource\n  /** The root product */\n  product: UPGProduct\n  /** All nodes in the graph */\n  nodes: UPGBaseNode[]\n  /** All edges connecting nodes */\n  edges: UPGEdge[]\n  /**\n   * Workspace member kind (0.10.0, #45). `product` (default / absent) = a product\n   * under management; `org_rollup` = the company umbrella graph (org-level vision\n   * and OKRs, not a shippable product); `watched` = an externally monitored\n   * intelligence graph (e.g. a competitor); `operating_function` = a function a\n   * team operates (revenue / success / finance / people / marketing) rather than a\n   * product it ships — no product spine, graded on a function validation profile\n   * (0.17.0). Serialised to `$upg.member_kind`; cached in workspace.json + the\n   * portfolio registry for enumeration and counts.\n   */\n  member_kind?: 'product' | 'org_rollup' | 'watched' | 'operating_function'\n  /** Integrity checksum. Set by the MCP server on save, verified on load. */\n  _integrity?: UPGIntegrity\n}\n\n// ─── Portfolio document ───────────────────────────────────────────────────────\n\n/**\n * A UPGPortfolioDocument is a portable, versioned snapshot of a multi-product portfolio.\n *\n * It extends the single-product format with:\n * - An organisation root\n * - Product areas (the organisational axis: who owns what)\n * - Portfolios (the strategic axis: where we invest)\n * - Multiple products, each with their own nodes and edges\n * - Cross-product edges that link entities across products\n *\n * The format is additive. Single-product `.upg` files (UPGDocument) remain valid.\n */\nexport interface UPGPortfolioDocument {\n  /** Spec version (semver string, e.g. \"0.2\"). */\n  upg_version: string\n  /** Document type discriminator */\n  type: 'portfolio'\n  /** ISO 8601 timestamp of export */\n  exported_at: string\n  /** The tool that produced this document */\n  source: UPGSource\n  /** The organisation that owns this portfolio */\n  organization: UPGOrganization\n  /** Product areas (the organisational axis). */\n  product_areas: UPGProductArea[]\n  /** Portfolios (the strategic axis). */\n  portfolios: UPGPortfolio[]\n  /** All products in the portfolio, each with their own nodes and edges */\n  products: Array<UPGProduct & { nodes: UPGBaseNode[]; edges: UPGEdge[] }>\n  /** Cross-product edges linking entities across products */\n  cross_edges: UPGCrossEdge[]\n  /**\n   * The canonical shared-entity registry (shared-vocabulary tier). Optional and\n   * additive: portfolio documents without a registry remain valid, and an empty\n   * registry is omitted rather than serialised. Product instances reference\n   * canonical nodes here via `instance_of` cross-edges (`registry/{node_id}`).\n   */\n  registry?: UPGRegistry\n  /**\n   * Append-only classification-history stream (UPG 0.11.0). Each entry is a\n   * `competitor_signal` node with `signal_type: 'reclassification'`, auto-emitted\n   * at the classify-write chokepoint when a competitor moves between\n   * classification cells on an axis. Kept here (a portfolio-scoped collection)\n   * rather than in `registry.nodes` so it never pollutes the canonical-vocabulary\n   * tier or the landscape/tree reads, and rather than in a product graph so the\n   * emit stays atomic with the portfolio cross-edge write. Read by\n   * `diff_classification`. Optional and additive: omitted when empty; portfolio\n   * documents without it remain valid.\n   */\n  signals?: UPGBaseNode[]\n}\n","/**\n * Entity-type alias resolution.\n *\n * Resolves a (possibly deprecated) entity-type input to its canonical\n * `UPG_TYPES` member, carrying the `from → to` alias trail when the input\n * was a deprecated synonym.\n *\n * Lives in `core` (rather than `mcp-tooling`) so every consumer (the SDK,\n * the local + cloud MCP servers, the LSP) shares ONE `UnknownEntityTypeError`\n * class. That makes `instanceof` checks instance-safe across package\n * boundaries (the SDK can throw it and a server can catch it), and gives a\n * single canonical resolution path (`get_entity_schema('jtbd') → job`).\n */\nimport { getReplacementType } from './entity-meta.js'\nimport { getTypes } from './domains.js'\n\nconst TYPES: readonly string[] = getTypes()\nconst TYPES_SET: ReadonlySet<string> = new Set(TYPES)\n\n/**\n * Result of resolving a (possibly deprecated) entity-type input.\n * - `canonical`: a canonical `UPG_TYPES` member (the input unchanged\n *   when it was already canonical).\n * - `alias`: set when the input was a deprecated synonym. Carries the\n *   `from → to` trail so callers can surface a warning.\n */\nexport interface EntityTypeResolution {\n  canonical: string\n  alias?: { from: string; to: string }\n}\n\n/**\n * Thrown when the input type is neither canonical nor a known alias.\n * Carries up to 5 Levenshtein-1 suggestions drawn from `UPG_TYPES`.\n */\nexport class UnknownEntityTypeError extends Error {\n  readonly suggestions: string[]\n  readonly rawType: string\n\n  constructor(rawType: string, suggestions: string[]) {\n    const suffix = suggestions.length > 0 ? ` Did you mean: ${suggestions.join(', ')}?` : ''\n    super(`Unknown entity type: \"${rawType}\".${suffix}`)\n    this.name = 'UnknownEntityTypeError'\n    this.rawType = rawType\n    this.suggestions = suggestions\n  }\n}\n\n/**\n * True when `a` and `b` are within edit distance 1. Used for near-miss\n * suggestions when the caller passed a typo.\n */\nfunction withinEditDistance1(a: string, b: string): boolean {\n  if (a === b) return true\n  const al = a.length\n  const bl = b.length\n  if (Math.abs(al - bl) > 1) return false\n  let i = 0\n  let j = 0\n  let edits = 0\n  while (i < al && j < bl) {\n    if (a[i] !== b[j]) {\n      if (++edits > 1) return false\n      if (al > bl) i++\n      else if (bl > al) j++\n      else {\n        i++\n        j++\n      }\n    } else {\n      i++\n      j++\n    }\n  }\n  if (i < al || j < bl) edits++\n  return edits <= 1\n}\n\n/**\n * Validate a raw entity-type string from a caller.\n *\n * Two-tier behaviour:\n *   1. Already canonical: return `{ canonical }` unchanged.\n *   2. Deprecated synonym with a known replacement: return\n *      `{ canonical, alias: { from, to } }` so the caller can warn.\n *   3. Otherwise: throw `UnknownEntityTypeError` with up to 5\n *      Levenshtein-1 suggestions.\n *\n * Every UPG consumer resolves raw caller input through this helper before\n * touching the catalog so deprecated synonyms get the same warning\n * treatment everywhere.\n */\nexport function resolveEntityType(rawType: unknown): EntityTypeResolution {\n  if (typeof rawType !== 'string' || rawType.length === 0) {\n    throw new UnknownEntityTypeError(String(rawType ?? ''), [])\n  }\n\n  if (TYPES_SET.has(rawType)) {\n    return { canonical: rawType }\n  }\n\n  const replacement = getReplacementType(rawType)\n  if (replacement && TYPES_SET.has(replacement)) {\n    return { canonical: replacement, alias: { from: rawType, to: replacement } }\n  }\n\n  const suggestions: string[] = []\n  for (const t of TYPES) {\n    if (withinEditDistance1(t, rawType)) suggestions.push(t)\n    if (suggestions.length >= 5) break\n  }\n  throw new UnknownEntityTypeError(rawType, suggestions)\n}\n","/**\n * UPG Hierarchy. `UPG_VALID_CHILDREN` declares which types are permitted as\n * direct children of each parent. Drives add menus, validation, and traversal.\n * Ordering reflects the suggested creation sequence.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n/** The canonical parent → children map. Keys are parent types, values are ordered child types. */\nexport const UPG_VALID_CHILDREN: Record<string, readonly string[]> = {\n  // ── Foundations (0.9.12): registry canonicals that self-nest. A\n  //    specification extends a specification (a dialect of a parent spec); a\n  //    primitive composes primitives (a block contains spans). These back the\n  //    hierarchy-classified specification_extends_specification /\n  //    primitive_composes_primitive catalog edges.\n  specification: ['specification'],\n  primitive: ['primitive'],\n  // An operating_lifecycle (e.g. the content-ops lifecycle) contains its ordered\n  // operating_stage children. Backs the operating_lifecycle_contains_operating_stage edge.\n  operating_lifecycle: ['operating_stage'],\n  // ── Product (root) ─────────────────────────────────────────────────────────\n  product: [\n    // Strategy\n    'vision', 'outcome', 'objective', 'metric', 'decision', 'constraint',\n    // User\n    'persona',\n    // Discovery (via outcome children)\n    // Validation (via hypothesis children)\n    // Market Intelligence\n    'competitor', 'market_trend', 'market_segment', 'competitive_analysis',\n    // User Research\n    'research_study',\n    // Experience Design\n    'user_journey', 'user_flow', 'wireframe', 'screen',\n    // Design System\n    'design_system', 'design_component',\n    // Brand Identity\n    'brand_identity',\n    // Product Specification\n    'feature', 'feature_area', 'release', 'roadmap', 'roadmap_theme', 'planning_cycle',\n    // Configuration (0.30.0): the levers whose values select which surface tree\n    // the product renders. Few per product, and top-level because an axis is a\n    // product-wide fact rather than a child of any one feature or surface.\n    'configuration_axis',\n    // Classification (0.32.0): the product's own taxonomies — the grouped-label\n    // case, one named group over a set of values. Same reasoning as the\n    // configuration axis above, and until now the only parent a\n    // classification_axis could have was a competitive_analysis.\n    'classification_axis',\n    // Engineering\n    'bounded_context', 'code_repository', 'integration_pattern', 'external_api', 'data_flow',\n    // Growth\n    'funnel', 'acquisition_channel', 'cohort', 'behavioral_segment', 'growth_loop', 'attribution_model',\n    // Business Model\n    'business_model',\n    // Go-To-Market\n    'gtm_strategy',\n    // Team & Organisation\n    // `person` is containment-free (see UPG_CONTAINMENT_FREE_TYPES below)\n    // (referenced via edges, not nested under product)\n    'team', 'stakeholder', 'department',\n    // Data & Analytics\n    'data_source', 'event_schema', 'dashboard', 'data_domain', 'glossary_term',\n    // Content & Knowledge\n    'content_piece', 'knowledge_base_article', 'brand_asset', 'document',\n    'documentation_template',\n    // Legal\n    'legal_entity', 'privacy_policy',\n    // Compliance\n    'compliance_requirement', 'risk', 'data_contract', 'audit_log_policy', 'compliance_framework',\n    // DevOps & Platform\n    'service_level_objective', 'incident', 'runbook', 'monitor',\n    'ci_pipeline', 'release_strategy', 'on_call_rotation', 'infrastructure_component',\n    // Security\n    'threat_model', 'security_control', 'security_policy',\n    'penetration_test', 'security_review', 'data_classification', 'access_policy',\n    // Accessibility\n    'a11y_standard', 'a11y_audit', 'a11y_annotation',\n    // Quality Assurance\n    'test_plan', 'test_suite', 'qa_session', 'test_coverage_report', 'test_environment',\n    // Customer Feedback\n    'feedback_program', 'user_advisory_board', 'beta_program',\n    // Pricing & Packaging\n    'pricing_strategy',\n    // AI & Machine Learning\n    'ai_model', 'model_comparison',\n    // Workflows & Agents\n    'workflow_template', 'agent_definition',\n    // Sales & Revenue\n    'pipeline_sales', 'account', 'lead', 'subscription', 'forecast',\n    // Program Management\n    // `milestone` is a SECOND, shallower parent here (Portfolio Phase 2,\n    // 2026-08-14), alongside its existing `project` parent: a product can own a\n    // milestone outright with no program/project above it. Required by the\n    // hierarchy-orphan guard now that `product_targets_milestone` exists.\n    'program', 'milestone',\n    // Marketing\n    'marketing_strategy', 'press_release', 'event', 'community_initiative',\n    // Customer Success\n    'support_ticket', 'customer_feedback', 'churn_reason',\n    'customer_health_score', 'playbook', 'service_level_agreement',\n    'success_milestone', 'service_blueprint', 'nps_campaign',\n    // Localisation\n    'locale', 'locale_config',\n    // Customer Education\n    'education_program',\n    // Partners & Ecosystem\n    'partner_program', 'api_ecosystem', 'developer_portal',\n    // Portfolio\n    // (UPG-677) product no longer lists product_area as a child: the\n    // product↔product_area containment is the single direction\n    // product_area_contains_product (product_area → product). The inverse\n    // product_categorised_in_product_area edge was collapsed.\n    // Workspace\n    'workspace',\n  ],\n\n  // ── Metric & Outcome hierarchy ──────────────────────────────────────────────\n  outcome: ['metric', 'opportunity', 'feature'],\n\n  // ── User & Jobs hierarchy ───────────────────────────────────────────────────\n  persona: ['job', 'need', 'switching_cost', 'desired_outcome'],\n  job: ['need', 'desired_outcome', 'job_step'],\n\n  // ── Discovery hierarchy ─────────────────────────────────────────────────────\n  opportunity: ['solution', 'design_concept', 'feasibility_study', 'design_sprint'],\n  // solutions now propose hypothesis (the templated\n  // belief), not the legacy hypothesis type.\n  solution: ['hypothesis', 'prototype', 'metric'],\n\n  // ── Validation hierarchy ────────────────────────────────────────────────────\n  // (UPG-664) The validation chain is a single-parent line:\n  //   hypothesis ▷ experiment_plan ▷ experiment ▷ experiment_run.\n  // hypothesis is canonical (hypothesis_evidence collapsed into evidence;\n  // relationship expressed via hypothesis_has_evidence edge; evidence.direction\n  // carries supports/refutes/neutral semantics). `test_plan` re-homed to the\n  // QA/testing domain (UPG-678), so it is no longer a hypothesis child.\n  hypothesis: ['experiment_plan', 'research_plan', 'evidence'],\n  // experiment_plan is the canonical validation PLAN (graduated stable,\n  // UPG-664). It designs the experiment it produces; the plan owns the\n  // experiment in the containment line. It also retains experiment_run as a\n  // child for the v0.2.6 split-migration path\n  // (`experiment_plan_ran_as_experiment_run`), where a legacy experiment routes\n  // directly to a plan + run pair.\n  experiment_plan: ['experiment', 'experiment_run'],\n  // experiment is the canonical structured test. It owns its run(s) and the\n  // learning/evidence it produces. The optional experiment_run child captures\n  // the multi-run / replication case.\n  experiment: ['experiment_run', 'learning', 'evidence'],\n  // experiment_run carries learning/evidence/metric children (run produces\n  // evidence) and self-nests for replications/multi-armed runs (V9: this is\n  // where self-nesting genuinely lives, not on `experiment`).\n  experiment_run: ['learning', 'evidence', 'metric', 'experiment_run'],\n\n  // ── OKR hierarchy ──────────────────────────────────────────────────────────\n  // strategic_question (0.17.4): an open coordination question raised under an\n  // objective (objective_raises_strategic_question, hierarchy).\n  objective: ['key_result', 'metric', 'strategic_question'],\n  key_result: ['metric'],\n\n  // ── Strategic cascade: vision → mission → strategic_pillar → strategic_theme →\n  //    { initiative, objective } ───────────────────────────────────────────────\n  //\n  // strategic_pillar vs strategic_theme (UPG-692 T3.3 — distinct cascade levels,\n  // NOT duplicates; sharpened rather than merged):\n  //   - strategic_pillar = a DURABLE structural division of the strategy. A\n  //     standing area the org organises around for years (e.g. \"Structured\n  //     content\", \"Developer experience\"). Few, long-lived; time_horizon is\n  //     multi-year / open-ended; carries its own `success_indicator`.\n  //   - strategic_theme = a TIME-BOUND thrust WITHIN a pillar. The current bet\n  //     for a period (e.g. \"Go AI-native this year\"). More numerous, rotates;\n  //     time_horizon is bounded (Q / FY); has NO `success_indicator` because it\n  //     is measured through its child objectives (strategic_theme_contains_objective).\n  //     That success-measurement asymmetry is the load-bearing distinction.\n  vision: ['mission'],\n  mission: ['strategic_pillar'],\n  // 0.20.1: metric added as a strategic_pillar child, backing\n  // strategic_pillar_measured_by_metric (hierarchy) — the pillar's own\n  // north-star, mirrored from objective: ['key_result', 'metric', ...] one\n  // level down the cascade.\n  strategic_pillar: ['strategic_theme', 'capability', 'value_stream', 'decision', 'metric'],\n  // v0.5.4 (UPG-511): objectives are the specific quarterly bets *within* a\n  // strategic theme. The theme is the multi-quarter focus area; objectives are\n  // subordinate. Pairs with `strategic_theme_contains_objective` in the edge\n  // catalog (hierarchy, strategic_theme → objective, reverse_verb: rolls_up_to;\n  // renamed from objective_rolls_up_to_strategic_theme in UPG-676).\n  strategic_theme: ['initiative', 'objective'],\n  initiative: ['assumption', 'strategic_question'],\n  // v0.5.2 (UPG-528): capability decomposes into sub-capabilities (Wardley\n  // value-chain spine) and is realised by user-facing features. Pairs with\n  // `capability_depends_on_capability` and `capability_implemented_by_feature`\n  // in the edge catalogue. The self-loop guard (UPG-520) keeps A → A refused;\n  // A → B between distinct capabilities is the supported decomposition.\n  capability: ['capability', 'feature'],\n\n  // ── Market hierarchy ────────────────────────────────────────────────────────\n  // competitive_analysis hosts classification axes (its dimensions);\n  // each axis hosts its values; values are reusable across the row and column\n  // dossiers of a 2-axis matrix.\n  competitive_analysis: ['competitor', 'market_trend', 'market_segment', 'classification_axis'],\n  competitor: ['competitor_feature', 'competitor_signal'],\n  classification_axis: ['classification_value'],\n\n  // ── UX Research hierarchy ───────────────────────────────────────────────────\n  // (0.35.0) 'quote' added: a study is the provenance parent of the verbatim\n  // quotes it captured, pairing with `research_study_captures_quote`. A quote\n  // now has three declared parents — observation (raw capture), insight\n  // (synthesis) and research_study (provenance) — which is multi-parent\n  // GRAMMAR; per-instance parentage stays single via `parent_id`.\n  research_study: [\n    'participant', 'observation', 'affinity_cluster', 'research_question',\n    'interview_guide', 'insight', 'survey_response', 'quote',\n  ],\n  observation: ['quote'],\n  // F6 (UPG-672): affinity_cluster owns the observations it groups, in addition\n  // to the insights it synthesises. Pairs with `affinity_cluster_groups_observation`\n  // in the edge catalog (hierarchy). An observation can be both directly owned by\n  // its research_study and grouped under an affinity_cluster (multi-parent grammar).\n  affinity_cluster: ['insight', 'observation'],\n  // insight refines into insight; a raw insight can be distilled\n  // into a more specific insight (refines_into chain).\n  // v0.5.8 (UPG-528 Part 2d): insights own their evidencing quotes;\n  // parallel to `observation: ['quote']`. Research-synthesis canon.\n  // Pairs with `insight_evidenced_by_quote` in the edge catalog.\n\n  // ── Design hierarchy ────────────────────────────────────────────────────────\n  // (UPG-663, v0.9.2) A user_journey owns its steps (the stable 0.1.0 spine)\n  // and carries phases as a non-owning band overlay. A journey_phase is NO\n  // LONGER a containment parent of journey_step: it SPANS steps via the\n  // `journey_phase_spans_journey_step` edge (mirroring the marketing\n  // `customer_journey_stage_spans_journey_step` precedent), so each step has\n  // exactly one containment parent and the journey has one canonical step list.\n  user_journey: ['journey_step', 'journey_phase'],\n  journey_step: ['journey_action'],\n  // v0.5.8 (UPG-528 Part 2d): insights own their evidencing quotes;\n  // parallel to `observation: ['quote']`. Research-synthesis canon\n  // (insight ← quote evidencing) extends quote's hierarchy parents to\n  // both observation (raw-capture parent) and insight (synthesis parent).\n  // Pairs with `insight_evidenced_by_quote` in the edge catalog.\n  insight: ['design_question', 'insight', 'quote'],\n  // v0.5.2 (UPG-528): need anchors a Wardley value chain; capabilities\n  // fulfil the need at the chain top. Cross-domain hierarchy (need ∈ Design,\n  // capability ∈ Strategy) is intentional: Wardley analysis starts from a\n  // user need and decomposes into the capabilities required to fulfil it.\n  need: ['design_question', 'capability'],\n  design_question: ['design_concept'],\n  design_concept: ['prototype', 'wireframe'],\n  design_component: [\n    'design_token', 'design_pattern', 'design_guideline',\n    'interaction_spec', 'design_component',\n  ], // self-nesting for atomic hierarchy (organism → molecule → atom)\n  prototype: ['annotation'],\n\n  // ── Brand hierarchy ─────────────────────────────────────────────────────────\n  brand_identity: [\n    'brand_colour', 'brand_typography', 'brand_asset', 'brand_voice',\n    'brand_logo', 'brand_imagery',\n  ],\n\n  // ── Product Specification hierarchy ─────────────────────────────────────────\n  // story_task collapsed into canonical task. feature now owns\n  // task directly; story-derived tasks implement user_story via\n  // task_implements_user_story edge.\n  // (0.35.0) 'user_story' added, pairing with `feature_specified_by_user_story`.\n  // The epic rung is optional in UPG, so a feature that skips it could not\n  // reach the stories that specify it and `user_story` had a single declared\n  // parent. Same widening shape as the 0.23.0 epic twins: an existing leaf type\n  // gains a second, SHALLOWER parent, verbs inherited from the deeper edge.\n  feature: ['epic', 'bug', 'task', 'user_story'],\n  feature_area: ['feature', 'feature_area', 'design_component'],\n  // epic owns user_story (the templated promise) and, mirroring feature, may\n  // also directly contain bug/task — heterogeneous imported tickets that belong\n  // to one epic rather than the feature as a whole (feedback df99026a).\n  epic: ['user_story', 'bug', 'task'],\n  user_story: ['acceptance_criterion'],\n  task: ['task'],\n  // planning_cycle (0.20.0): the cadence axis self-nests (a program-increment\n  // contains iterations; a cycle contains its cooldown) via\n  // planning_cycle_contains_planning_cycle. It does NOT contain user_story as a\n  // child: scheduling work into a cycle is the semantic, deliberate-only\n  // planning_cycle_schedules_work_item edge, so the item keeps its feature/epic\n  // containment parent and is merely referenced by the cycle.\n  planning_cycle: ['planning_cycle'],\n\n  // ── Engineering hierarchy ───────────────────────────────────────────────────\n  bounded_context: [\n    'service', 'domain_event', 'decision', 'data_model', 'aggregate',\n    'read_model', 'code_repository', 'integration_pattern', 'external_api',\n    'data_flow',\n    // v0.5.7 (UPG-528 Part 2c): BCs publish api_contracts as their \"published\n    // language\" (DDD canon). api_contract has two valid hierarchy parents now:\n    // service (per-service exposure) AND bounded_context (BC-level surface).\n    'api_contract',\n  ],\n  service: [\n    'api_contract', 'technical_debt_item', 'feature_flag', 'deployment',\n    'api_endpoint', 'database_schema', 'queue_topic', 'build_artifact',\n    'library_dependency',\n  ],\n  // v0.5.1 (UPG-517 C2): contracts contain their endpoints. Service still\n  // serves endpoints directly (legacy / non-contract endpoints); both\n  // parent-child paths coexist.\n  api_contract: ['api_endpoint'],\n  decision: ['technical_debt_item'],\n  aggregate: ['domain_entity', 'value_object', 'command'],\n\n  // ── Growth hierarchy ────────────────────────────────────────────────────────\n  funnel: ['funnel_step'],\n  acquisition_channel: ['growth_campaign'],\n  growth_campaign: ['experiment_plan', 'variant'],\n\n  // ── Business Model hierarchy ─────────────────────────────────────────────────\n  business_model: [\n    'value_proposition', 'revenue_stream', 'cost_structure', 'unit_economics',\n    'partnership', 'key_resource', 'key_activity',\n    'customer_relationship', 'distribution_channel',\n  ],\n  revenue_stream: ['pricing_tier'],\n\n  // ── Go-To-Market hierarchy ───────────────────────────────────────────────────\n  gtm_strategy: [\n    'ideal_customer_profile', 'positioning', 'launch', 'content_strategy',\n    'sales_motion', 'competitive_battle_card', 'demand_gen_program', 'territory',\n  ],\n  positioning: ['messaging', 'objection', 'proof_point'],\n  value_proposition: ['objection', 'proof_point'],\n  competitive_battle_card: ['objection'],\n  objection: ['rebuttal'],\n  rebuttal: ['proof_point'],\n\n  // ── Team & Organisation hierarchy ───────────────────────────────────────────\n  department: ['team', 'stakeholder'],\n  team: [\n    'role', 'team_okr', 'retrospective', 'dependency', 'skill', 'ceremony',\n    'capacity_plan', 'decision',\n    // Self-nesting (0.17.2): a parent team contains its sub-teams / squads, one\n    // level below department_contains_team. Backs team_contains_team. Mirrors\n    // feature_area_contains_feature_area (same-type child listed last).\n    'team',\n  ],\n\n  // ── Data & Analytics hierarchy ───────────────────────────────────────────────\n  data_source: ['metric', 'data_pipeline', 'data_lineage', 'event_schema'],\n  // UPG-685 T0.4 (0.13.0 Wave 1): `outcome` removed as a metric child. It closed a\n  // containment cycle (outcome ⊃ metric ⊃ outcome) and was backed only by the CAUSAL\n  // `metric_drives_outcome` edge, not a hierarchy edge — the \"metric leads to outcome\"\n  // meaning lives correctly on that causal edge. The real containment (outcome ⊃ metric)\n  // is kept. Sub-metric trees (metric ⊃ metric) stay.\n  metric: ['metric', 'data_quality_rule', 'metric_quality_assessment'],\n  data_domain: ['data_product', 'data_source', 'glossary_term', 'data_model', 'dashboard'],\n  dashboard: ['report', 'experiment_run'],\n\n  // ── Content & Knowledge hierarchy ────────────────────────────────────────────\n  // release contains features and bugs (GitHub milestone→issue import).\n  release: ['changelog', 'feature', 'bug'],\n  content_strategy: ['content_calendar', 'content_theme'],\n  content_calendar: [\n    'content_theme', 'content_piece', 'knowledge_base_article', 'brand_asset',\n    'document', 'documentation_template',\n  ],\n\n  // ── Operations & CS hierarchy ────────────────────────────────────────────────\n  service_blueprint: [\n    'user_flow', 'playbook', 'service_level_agreement', 'customer_health_score',\n    'support_ticket', 'customer_feedback',\n  ],\n  customer_health_score: ['nps_campaign', 'success_milestone'],\n  customer_feedback: ['churn_reason'],\n  user_flow: ['screen', 'customer_journey_stage'],\n  customer_journey_stage: ['touchpoint'],\n\n  // ── Legal, Compliance & Risk hierarchy ──────────────────────────────────────\n  legal_entity: ['ip_asset', 'contract'],\n  contract: ['contract_clause'],\n  compliance_framework: [\n    'security_audit', 'compliance_requirement', 'privacy_policy',\n    'audit_log_policy', 'risk', 'data_contract', 'legal_entity',\n  ],\n\n  // ── DevOps & Platform hierarchy ──────────────────────────────────────────────\n  infrastructure_component: [\n    'service_level_objective', 'monitor', 'ci_pipeline', 'incident',\n    'runbook', 'release_strategy', 'on_call_rotation',\n  ],\n  service_level_objective: ['service_level_indicator', 'error_budget'],\n  incident: ['postmortem'],\n  monitor: ['alert_rule'],\n  ci_pipeline: ['build_artifact'],\n\n  // ── Security hierarchy ───────────────────────────────────────────────────────\n  security_policy: [\n    'security_control', 'access_policy', 'data_classification', 'threat_model',\n    'security_review', 'incident',\n  ],\n  security_review: ['penetration_test'],\n  threat_model: ['threat', 'vulnerability'],\n\n  // ── Sales & Revenue hierarchy ────────────────────────────────────────────────\n  pipeline_sales: ['pipeline_stage', 'lead', 'account', 'forecast', 'subscription'],\n  account: ['contact', 'deal'],\n  deal: ['quote_document'],\n  subscription: ['invoice'],\n\n  // ── Program Management hierarchy ─────────────────────────────────────────────\n  program: ['project', 'risk_register', 'change_request', 'resource_allocation', 'status_report'],\n  project: ['milestone', 'deliverable', 'epic', 'feature', 'user_story', 'task', 'bug'],\n  risk_register: ['risk'],\n\n  // ── Accessibility hierarchy ──────────────────────────────────────────────────\n  a11y_standard: ['a11y_guideline', 'a11y_audit', 'a11y_annotation'],\n  a11y_audit: ['a11y_issue'],\n\n  // ── Product Specification expansion ─────────────────────────────────────────\n  roadmap: ['roadmap_item', 'roadmap_theme', 'release'],\n  roadmap_theme: ['feature'],\n\n  // ── Unified Context Layer hierarchy ─────────────────────────────────────────\n  design_system: [\n    'design_component', 'design_token', 'design_guideline', 'brand_identity',\n    'user_journey', 'user_flow', 'insight',\n  ],\n  screen: ['screen_state', 'screen', 'surface', 'design_component', 'wireframe'], // self-nesting + surfaces + components + wireframes\n\n  // surface (0.27.0): the place inside a screen. Self-nests, so a shell holds\n  // panes, a pane holds regions, a region holds slots. A surface is reached\n  // through the screen that renders it (`screen: [... 'surface']`), never as a\n  // top-level product child: every UPG_VALID_CHILDREN pair must be backed by a\n  // hierarchy-classified edge (guardrail G2b), and the ratified ten do not\n  // include a product-to-surface verb. An app-shell surface therefore hangs off\n  // the screen that mounts it.\n  //\n  // NOTE: `surface_kind` narrows this further than UPG_VALID_CHILDREN can\n  // express. UPG_VALID_CHILDREN is keyed on entity TYPE, so it can only say\n  // \"a surface may contain a surface\"; the kind ordering (shell > tool > pane >\n  // region > slot / gutter / action_bar, with overlay and ambient parented by\n  // whatever raises them) is a property-level rule documented on `SurfaceKind`\n  // and enforced by validators, not by this table. Precedent: the same split\n  // applies to `planning_cycle`, whose `cadence_kind` narrows its self-nesting.\n  surface: ['surface', 'design_component'],\n\n  // ── Marketing & Communications hierarchy ────────────────────────────────────\n  marketing_strategy: [\n    'marketing_channel', 'seo_keyword', 'press_release', 'event',\n    'community_initiative',\n  ],\n  marketing_channel: ['marketing_campaign_plan'],\n  marketing_campaign_plan: ['email_sequence', 'social_post', 'ad_creative'],\n\n  // ── Localisation & i18n hierarchy ───────────────────────────────────────────\n  locale: ['translation_bundle', 'cultural_adaptation', 'regional_pricing', 'locale_config'],\n  translation_bundle: ['translation_key'],\n\n  // ── Customer Education & Training hierarchy ──────────────────────────────────\n  education_program: [\n    'tutorial', 'walkthrough', 'webinar', 'certification', 'help_video',\n    'learning_path',\n  ],\n  // a learning_path can include its terminal certification.\n  learning_path: ['tutorial', 'certification'],\n\n  // ── Quality Assurance & Testing hierarchy ────────────────────────────────────\n  // (UPG-678) test_plan re-homed validation → QA. It is the QA planning layer:\n  // the verification approach (scope, environments, pass criteria) that the\n  // test suites execute. A test_plan groups the suites that carry it out.\n  test_plan: ['test_suite', 'test_environment'],\n  test_suite: [\n    'test_case', 'regression_test', 'qa_session', 'test_coverage_report',\n    'test_environment', 'test_result',\n  ],\n  test_case: ['test_result'],\n  qa_session: ['bug'],\n\n  // ── Partner & Ecosystem Management hierarchy ─────────────────────────────────\n  partner_program: [\n    'partner_tier', 'integration_partner', 'partner_revenue_share',\n    'api_ecosystem', 'developer_portal',\n  ],\n  api_ecosystem: ['marketplace_listing'],\n\n  // ── Feedback & Voice of Customer hierarchy ───────────────────────────────────\n  feedback_program: [\n    'feature_request', 'nps_campaign', 'feedback_theme', 'user_advisory_board',\n    'beta_program',\n  ],\n  feature_request: ['feedback_vote'],\n  // v0.5.8 (UPG-528 Part 2d): CABs convene as quarterly ceremonies;\n  // CAB owns its meeting cadence (Stettler, Moore CAB playbook canon).\n  // Pairs with `user_advisory_board_convenes_as_ceremony` in the edge\n  // catalog. ceremony now has two valid hierarchy parents (team for sprint\n  // ceremonies, user_advisory_board for CAB meetings).\n  user_advisory_board: ['ceremony'],\n\n  // ── Pricing & Packaging hierarchy ────────────────────────────────────────────\n  pricing_strategy: [\n    'experiment_plan', 'pricing_tier', 'discount_strategy', 'trial_config', 'paywall',\n  ],\n\n  // ── AI/ML Operations hierarchy ───────────────────────────────────────────────\n  // (UPG-665) The prompt abstraction is corrected: ai_model → prompt_template →\n  // prompt_version (a model has templates; each template has versions). The\n  // model no longer owns prompt_version directly.\n  ai_model: [\n    'prompt_template', 'eval_benchmark', 'ai_cost_tracker',\n    'hallucination_report', 'ai_guardrail', 'model_comparison',\n    'ai_experiment', 'ai_dataset', 'ai_trace',\n  ],\n  // prompt_template owns its prompt_versions the way a file owns its commits.\n  prompt_template: ['prompt_version'],\n  // v0.5.7 (UPG-528 Part 2c): benchmarks define the metric set they measure\n  // (HELM, MLPerf, BIG-bench all spec a metric list). metric already has many\n  // hierarchy parents (outcome, objective, key_result, solution, data_source).\n  eval_benchmark: ['eval_run', 'metric'],\n  // ai_trace spawns child traces for sub-calls (tool calls, chained\n  // prompts). Self-nesting enables call-tree representation.\n  ai_trace: ['ai_trace'],\n\n  // ── Agentic Workflows & Process hierarchy ────────────────────────────────────\n  workflow_template: ['workflow_run', 'review_gate', 'agent_task'],\n  workflow_run: ['workflow_artifact'],\n  agent_definition: ['agent_session', 'agent_skill', 'agent_hook', 'workflow_template', 'agent_task'],\n  // v0.5.8 (UPG-528 Part 2d): review gates also vet research insights\n  // (ResearchOps insight-review pattern). Pairs with `review_gate_vets_insight`\n  // in the edge catalog. The gate now owns two child types: approval records\n  // for workflow gates, insights for research-democratisation gates.\n  review_gate: ['approval_record', 'insight'],\n\n  // ── Investigation hierarchy ──────────────────────────────────────────────────\n  investigation: ['symptom', 'root_cause'],\n  root_cause: ['fix'],\n\n  // ── Portfolio layer hierarchy ────────────────────────────────────────────────\n  // organization → product_area is the org-axis anchor (who owns what);\n  // organization → portfolio is the strategic-axis anchor (where you invest).\n  // organization → workspace (WS3, 2026-07-05): org-altitude workspace anchor\n  // (organization_thinks_in_workspace) — a workspace scoped to org altitude\n  // lives in the same portfolio-level graph as its organization node.\n  organization: ['portfolio', 'product_area', 'workspace'],\n  // portfolios can nest (multi-level investment structures).\n  portfolio: ['product', 'portfolio'],\n  // product_area is the organisational container for products and can\n  // nest (parent → sub-area). product_area also groups features; the\n  // \"Studio area owns 6 features\" mental model. product_area → workspace\n  // (WS3, 2026-07-05): plane-altitude workspace anchor\n  // (product_area_thinks_in_workspace) — \"plane\" is Entopo's app-level name\n  // for product_area, not a distinct spec entity.\n  product_area: ['product', 'product_area', 'feature', 'workspace'],\n} as const\n\n/**\n * Returns the list of valid child entity types for the given parent type.\n * Returns an empty array for any type not present in the hierarchy.\n *\n * @example\n * getValidChildren('persona')\n * // → ['job', 'need', 'switching_cost', 'desired_outcome']\n *\n * @example\n * getValidChildren('unknown_type')\n * // → []\n */\nexport function getValidChildren(entityType: string): readonly string[] {\n  return UPG_VALID_CHILDREN[entityType] ?? []\n}\n\n/**\n * Returns `true` if `childType` is a permitted direct child of `parentType`\n * according to the UPG hierarchy.\n *\n * @example\n * canBeChildOf('job', 'persona')        // → true\n * canBeChildOf('persona', 'product')    // → true\n * canBeChildOf('product', 'persona')    // → false (reversed hierarchy)\n */\nexport function canBeChildOf(childType: string, parentType: string): boolean {\n  return getValidChildren(parentType).includes(childType)\n}\n\n/**\n * Containment-free entity types: types that exist in the graph but are\n * *referenced* by other nodes (via edges) rather than *contained* by\n * structural parents. They appear in no `UPG_VALID_CHILDREN` list and\n * have no hierarchy edges into them.\n *\n * This is parallel to `UPG_LIFECYCLE_FREE_TYPES` in `grammar/lifecycles.ts`:\n * both describe what a type *does not have*. Lifecycle-free types lack a\n * status progression; containment-free types lack a structural parent.\n * A type may be one, both, or neither: `person` is both; `theme` is\n * lifecycle-free but structurally contained; `feature` is neither.\n *\n * The G2b hierarchy audit treats absence from `UPG_VALID_CHILDREN` as a\n * defect *unless* the type is in this set. Use this category for types\n * that are orthogonal to product structure: identities, references,\n * cross-cutting concerns that any node might point at.\n *\n * `person` is the first explicit member of the set. Additional candidates\n * (`theme`, `glossary_term`, `learning`, `insight`, `risk`,\n * `classification_value`) will be audited and added one at a time with\n * deliberate justification rather than retrofitted in bulk.\n *\n * @example\n * isContainmentFreeType('person')   // → true\n * isContainmentFreeType('feature')  // → false (nested under product)\n * isContainmentFreeType('roadmap_theme')  // → false (not yet ratified into the set)\n */\nexport const UPG_CONTAINMENT_FREE_TYPES: ReadonlySet<string> = new Set<string>([\n  'person',\n  // A framework_exercise has no structural parent: it anchors to the entities\n  // it scores via the `framework_exercise_includes_node` edge, not by\n  // containment. Modelling it as a product child would force a containment edge\n  // and read against the whole point of the exercise model (relational, not\n  // hierarchical). Same posture as `person`. See ADR 2026-06-02-framework-exercises.\n  'framework_exercise',\n  // A composition has no structural parent for the same reason a\n  // framework_exercise does not: it anchors to what it SHOWS, relationally, via\n  // `composition_focuses_node`. Modelling it as a product child would force a\n  // containment edge that reads against the point — a published view is not a\n  // part of the product, it is a lens onto one. This is also what keeps the\n  // type to two edges rather than three: no provenance edge is minted (that is\n  // `workspace_produced_node`, reused) and no parent edge is needed.\n  'composition',\n  // A capture has no structural parent for the same reason: it anchors to what\n  // it RENDERS, via `capture_renders_node`. Giving it a product parent would\n  // claim a capture is part of the product rather than a picture of one, and\n  // would mint a containment edge whose only job is to satisfy the hierarchy.\n  'capture',\n])\n\n/**\n * Returns `true` if `entityType` is containment-free, i.e. it deliberately\n * has no structural parent in `UPG_VALID_CHILDREN`. See\n * `UPG_CONTAINMENT_FREE_TYPES` for the rationale and roster.\n */\nexport function isContainmentFreeType(entityType: string): boolean {\n  return UPG_CONTAINMENT_FREE_TYPES.has(entityType)\n}\n","/**\n * UPG Configuration Projection (0.30.0).\n *\n * The stored graph is the UNION of a configuration family. A single\n * configuration is a PROJECTION of it, and this is the operator that takes one.\n *\n * π(G, C) drops what a named configuration does not contain and leaves\n * everything else exactly as it was. Facts that carry no configuration\n * qualification are invariant: they belong to every member of the family, which\n * is why a graph written before this existed projects to itself under every C\n * and needs no migration.\n *\n * PURE, AND DELIBERATELY STORE-FREE. It takes node and edge arrays and returns\n * node and edge arrays, so the local file store, the cloud SQL store and a\n * synthetic store built for validation preview all reuse one definition of what\n * a projection IS. A projection implemented twice is two projections.\n *\n * READ-ONLY. Nothing writes a projected graph back. The union is the file.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n/** The minimum a node must expose to be projected. */\nexport interface ProjectableNode {\n  id: string\n  type?: string\n  properties?: Record<string, unknown> | undefined\n}\n\n/** The minimum an edge must expose to be projected. */\nexport interface ProjectableEdge {\n  id?: string\n  source: string\n  target: string\n  type?: string\n  properties?: Record<string, unknown> | undefined\n}\n\n/**\n * A configuration: axis node id to the single value that holds on it.\n *\n * PARTIAL BY DESIGN. An axis absent from the map is not applied, so every fact\n * qualified on it is retained. Projecting on nothing returns the union, which\n * makes a configuration a strictly narrowing filter an agent can apply\n * incrementally rather than an all-or-nothing mode.\n */\nexport type Configuration = Readonly<Record<string, string>>\n\n/** The edge that declares conditional existence. */\nexport const VARIES_BY_EDGE = 'surface_varies_by_configuration_axis'\n\n/** The property carried by that edge. */\nexport const PRESENT_UNDER_PROPERTY = 'present_under'\n\n/** The qualifier property carried by the two composition edges. */\nexport const ACTIVE_WHEN_PROPERTY = 'active_when'\n\n/**\n * The only edge types on which `active_when` is legal (D3).\n *\n * Scope is enforced, not merely documented: `validate_graph`'s\n * `configuration_drift` scope reports the qualifier on any other edge type as\n * an error. The projection operator itself is deliberately permissive here (it\n * honours a qualifier wherever it finds one) so that a graph carrying an\n * illegal qualifier still projects predictably while the validator names the\n * problem. Silently ignoring it would make the drift invisible in the one view\n * where its effect shows.\n */\nexport const QUALIFIABLE_EDGE_TYPES: readonly string[] = [\n  'surface_contains_surface',\n  'feature_occupies_surface',\n]\n\n/** Result of a projection: the surviving nodes and edges, plus what it dropped. */\nexport interface ProjectionResult<\n  N extends ProjectableNode = ProjectableNode,\n  E extends ProjectableEdge = ProjectableEdge,\n> {\n  nodes: N[]\n  edges: E[]\n  /** Node ids dropped because the configuration excluded them. */\n  excluded_node_ids: string[]\n  /** Count of edges dropped because their own qualifier excluded them. */\n  deactivated_edge_count: number\n  /** Count of edges dropped because an endpoint was excluded. */\n  dangling_edge_count: number\n}\n\n/**\n * Read a string array property defensively; anything else reads as absent.\n *\n * Exported so the drift checker and the read-tool view share one reading of\n * what a list-valued configuration property is. Three copies of this drifting\n * apart is how a value the validator accepts becomes a value the projection\n * ignores.\n */\nexport function readStringArray(\n  properties: Record<string, unknown> | undefined,\n  key: string,\n): string[] | undefined {\n  const raw = properties?.[key]\n  if (!Array.isArray(raw)) return undefined\n  return raw.filter((v): v is string => typeof v === 'string')\n}\n\n/**\n * Read an `active_when` qualifier, or undefined when the edge carries none or\n * carries something malformed.\n *\n * A malformed qualifier reads as ABSENT rather than as \"excludes everything\".\n * Absence means the relationship is invariant, so a broken qualifier leaves the\n * edge in every projection: the graph shows too much rather than too little,\n * and `configuration_drift` reports the malformation by name. The alternative\n * would let one bad property silently delete structure from every view.\n */\nexport function readActiveWhen(\n  edge: ProjectableEdge,\n): { axis: string; values: string[] } | undefined {\n  const raw = edge.properties?.[ACTIVE_WHEN_PROPERTY]\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined\n  const axis = (raw as Record<string, unknown>).axis\n  const values = readStringArray(raw as Record<string, unknown>, 'values')\n  // An EMPTY values list is malformed, not \"holds under nothing\". Honouring it\n  // literally would deactivate the edge in every projection AND in the union,\n  // which is a way to delete a relationship from the whole graph by writing a\n  // property. Treated as absent here (so the edge stays invariant) and reported\n  // by `configuration_drift` as `qualifier_values_empty`.\n  if (typeof axis !== 'string' || axis.length === 0 || !values || values.length === 0) {\n    return undefined\n  }\n  return { axis, values }\n}\n\n/**\n * Project a graph onto one configuration.\n *\n * Applied in order, ONCE. The operator is a filter, not a solver:\n *\n *  1. NODE EXCLUSION. A node is dropped when it declares variance on an axis\n *     named in `configuration` and the chosen value is not in its\n *     `present_under`. A node that says nothing about a named axis is retained,\n *     because silence means invariant.\n *  2. EDGE DEACTIVATION. An edge is dropped when its own `active_when` names an\n *     axis in `configuration` and the chosen value is not among its values.\n *  3. DANGLING REMOVAL. Any surviving edge with an endpoint dropped in step 1\n *     goes too.\n *\n * NO CASCADE, AND THIS IS THE SUBTLE PART. A child surface is NOT dropped\n * because its parent was. The motivating field case is precisely a surface\n * whose PARENT changes under the flag (a navigation row splits in two and an\n * occupant moves into the new row), so cascading would delete a surface that is\n * genuinely present. A surface that survives with no containment parent in that\n * projection is a modelling gap for the validator to report, not a deletion for\n * the operator to guess at.\n *\n * COMMUTATIVE ACROSS AXES. Each axis's predicate reads only that axis, so\n * projecting on two axes in either order, or both at once, gives the same\n * result. Multi-axis projection therefore needs no ordering rule.\n *\n * @example\n * // A graph where the inspector exists only under the split-nav flag.\n * projectGraph(nodes, edges, { axis_nav: 'legacy_nav' }).nodes\n * // → every node except the split-nav-only surfaces\n */\nexport function projectGraph<\n  N extends ProjectableNode = ProjectableNode,\n  E extends ProjectableEdge = ProjectableEdge,\n>(nodes: N[], edges: E[], configuration: Configuration): ProjectionResult<N, E> {\n  const axes = Object.keys(configuration)\n  // Identity fast path. A projection that names no axis, or a graph that\n  // declares no variance, returns the union unchanged. This is the\n  // zero-migration guarantee in code: nothing written before 0.30.0 can be\n  // altered by a projection.\n  if (axes.length === 0) {\n    return {\n      nodes: [...nodes],\n      edges: [...edges],\n      excluded_node_ids: [],\n      deactivated_edge_count: 0,\n      dangling_edge_count: 0,\n    }\n  }\n\n  // Step 1: node exclusion, driven by the varies_by edges.\n  const excluded = new Set<string>()\n  for (const edge of edges) {\n    if (edge.type !== VARIES_BY_EDGE) continue\n    const chosen = configuration[edge.target]\n    if (chosen === undefined) continue // axis not named: nothing to apply\n    const presentUnder = readStringArray(edge.properties, PRESENT_UNDER_PROPERTY)\n    // A varies_by edge with no readable `present_under` states a dependency\n    // without saying what it depends on. Treated as invariant (the node stays)\n    // so a malformed declaration cannot silently delete a surface; the\n    // validator reports it as drift instead.\n    if (!presentUnder) continue\n    if (!presentUnder.includes(chosen)) excluded.add(edge.source)\n  }\n\n  const survivingNodes = excluded.size === 0 ? [...nodes] : nodes.filter((n) => !excluded.has(n.id))\n\n  // Steps 2 and 3: edge deactivation, then dangling removal.\n  let deactivated = 0\n  let dangling = 0\n  const survivingEdges: E[] = []\n  for (const edge of edges) {\n    const qualifier = readActiveWhen(edge)\n    if (qualifier) {\n      const chosen = configuration[qualifier.axis]\n      if (chosen !== undefined && !qualifier.values.includes(chosen)) {\n        deactivated++\n        continue\n      }\n    }\n    if (excluded.has(edge.source) || excluded.has(edge.target)) {\n      dangling++\n      continue\n    }\n    survivingEdges.push(edge)\n  }\n\n  return {\n    nodes: survivingNodes,\n    edges: survivingEdges,\n    excluded_node_ids: [...excluded].sort(),\n    deactivated_edge_count: deactivated,\n    dangling_edge_count: dangling,\n  }\n}\n\n/**\n * Every configuration this graph can be projected onto, one axis at a time.\n *\n * PER-AXIS, NOT CARTESIAN. The list is the union (an empty configuration) plus\n * one entry per declared value of each axis: `1 + Σ|values|`, linear in the\n * declarations. The cartesian product across axes is combinatorial and buys\n * nothing here, because every v1 qualifier reads a single axis and every check\n * that consumes a projection is surface-local. Cross-axis interaction is a\n * stated non-goal; when a detector needs it, this is the function that grows.\n */\nexport function enumerateProjections(\n  nodes: ProjectableNode[],\n): Array<{ axis?: string; value?: string; configuration: Configuration }> {\n  const out: Array<{ axis?: string; value?: string; configuration: Configuration }> = [\n    { configuration: {} },\n  ]\n  for (const node of nodes) {\n    if (node.type !== 'configuration_axis') continue\n    const values = readStringArray(node.properties, 'values')\n    if (!values) continue\n    for (const value of values) {\n      out.push({ axis: node.id, value, configuration: { [node.id]: value } })\n    }\n  }\n  return out\n}\n","/**\n * UPG Configuration Drift (0.30.0).\n *\n * Structural checking of the configuration declarations themselves: that an\n * axis is well formed, that every value named anywhere is a value the axis\n * actually declares, that the qualifier appears only where it is legal, and\n * that a declared alternation is consistent with what the declarations imply.\n *\n * DRIFT, NOT AN ANTI-PATTERN. These are contradictions inside the model, the\n * same family as an unknown entity type or a status outside its lifecycle: a\n * graph carrying one is saying something it cannot mean. Anti-patterns are the\n * other thing, judgements about a graph that is internally consistent, and\n * 0.30.0 deliberately mints none of those (a detector with no field evidence\n * behind it is how a check family gets noisy).\n *\n * Runs on the UNION. The declarations are facts about the whole family, so they\n * are checked once, not once per projection. The single exception is\n * `orphaned_under_projection`, which by definition can only be seen by taking\n * one.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport {\n  projectGraph,\n  readActiveWhen,\n  readStringArray,\n  ACTIVE_WHEN_PROPERTY,\n  PRESENT_UNDER_PROPERTY,\n  QUALIFIABLE_EDGE_TYPES,\n  VARIES_BY_EDGE,\n  type ProjectableEdge,\n  type ProjectableNode,\n} from './projection.js'\n\n/** The kinds of configuration drift the validator reports. */\nexport type ConfigurationDriftKind =\n  | 'axis_values_empty'\n  | 'axis_default_not_a_value'\n  | 'present_under_empty'\n  | 'present_under_unknown_value'\n  | 'qualifier_axis_unresolved'\n  | 'qualifier_values_empty'\n  | 'qualifier_unknown_value'\n  | 'qualifier_on_illegal_edge'\n  | 'alternation_axis_mismatch'\n  | 'alternation_overlap'\n  | 'orphaned_under_projection'\n\n/** One configuration-drift finding. */\nexport interface ConfigurationDriftFinding {\n  kind: ConfigurationDriftKind\n  /**\n   * `error` means the graph contradicts itself and a projection of it cannot be\n   * trusted. `warning` means the graph is coherent but a projection of it has a\n   * gap worth looking at.\n   */\n  severity: 'error' | 'warning'\n  /** The node this finding is about, when it is about a node. */\n  node_id?: string\n  /** The edge this finding is about, when it is about an edge. */\n  edge_id?: string\n  /** The axis involved, where one is identifiable. */\n  axis_id?: string\n  /** Human-readable statement of what is wrong. */\n  message: string\n}\n\nconst ALTERNATES_EDGE = 'surface_alternates_with_surface'\nconst PARENT_EDGE_TYPES = new Set(['surface_contains_surface', 'screen_renders_surface'])\n\nfunction edgeLabel(edge: ProjectableEdge): string {\n  return edge.id ?? `${edge.source} -> ${edge.target}`\n}\n\n/**\n * Check every configuration declaration in a graph.\n *\n * @param nodes All nodes in the union.\n * @param edges All edges in the union.\n * @returns Findings, in a stable order: axis checks, then variance, then\n *   qualifiers, then alternation, then the per-projection orphan warning.\n */\nexport function checkConfigurationDrift(\n  nodes: ProjectableNode[],\n  edges: ProjectableEdge[],\n): ConfigurationDriftFinding[] {\n  const findings: ConfigurationDriftFinding[] = []\n\n  // ── Axes ───────────────────────────────────────────────────────────────────\n  const axisValues = new Map<string, string[]>()\n  for (const node of nodes) {\n    if (node.type !== 'configuration_axis') continue\n    const values = readStringArray(node.properties, 'values')\n    if (!values || values.length === 0) {\n      findings.push({\n        kind: 'axis_values_empty',\n        severity: 'error',\n        node_id: node.id,\n        axis_id: node.id,\n        message:\n          'Configuration axis declares no values. An axis with no values selects nothing, so no projection can be taken along it.',\n      })\n      axisValues.set(node.id, [])\n      continue\n    }\n    axisValues.set(node.id, values)\n\n    const rawDefault = node.properties?.default_value\n    if (typeof rawDefault === 'string' && rawDefault.length > 0 && !values.includes(rawDefault)) {\n      findings.push({\n        kind: 'axis_default_not_a_value',\n        severity: 'error',\n        node_id: node.id,\n        axis_id: node.id,\n        message: `default_value \"${rawDefault}\" is not one of the axis values [${values.join(', ')}]. It names a value of this axis, so it has to be one the axis declares.`,\n      })\n    }\n  }\n\n  // ── Conditional existence ──────────────────────────────────────────────────\n  for (const edge of edges) {\n    if (edge.type !== VARIES_BY_EDGE) continue\n    const values = axisValues.get(edge.target)\n    const presentUnder = readStringArray(edge.properties, PRESENT_UNDER_PROPERTY)\n\n    if (!presentUnder || presentUnder.length === 0) {\n      findings.push({\n        kind: 'present_under_empty',\n        severity: 'error',\n        edge_id: edge.id,\n        node_id: edge.source,\n        axis_id: edge.target,\n        message: `${edgeLabel(edge)} declares variance without a non-empty present_under. A surface that exists under no configuration should be deleted rather than declared; a surface that exists under all of them should carry no varies_by edge at all.`,\n      })\n      continue\n    }\n    if (!values) continue // unresolved axis target: an edge-drift concern, not this one\n    for (const value of presentUnder) {\n      if (!values.includes(value)) {\n        findings.push({\n          kind: 'present_under_unknown_value',\n          severity: 'error',\n          edge_id: edge.id,\n          node_id: edge.source,\n          axis_id: edge.target,\n          message: `present_under names \"${value}\", which the axis does not declare. Its values are [${values.join(', ')}].`,\n        })\n      }\n    }\n  }\n\n  // ── Qualifiers ─────────────────────────────────────────────────────────────\n  for (const edge of edges) {\n    const hasQualifierKey =\n      edge.properties !== undefined &&\n      Object.prototype.hasOwnProperty.call(edge.properties, ACTIVE_WHEN_PROPERTY)\n    if (!hasQualifierKey) continue\n\n    if (edge.type !== undefined && !QUALIFIABLE_EDGE_TYPES.includes(edge.type)) {\n      findings.push({\n        kind: 'qualifier_on_illegal_edge',\n        severity: 'error',\n        edge_id: edge.id,\n        message: `active_when is not legal on ${edge.type}. The qualifier is scoped to [${QUALIFIABLE_EDGE_TYPES.join(', ')}] deliberately: conditional composition is the question this release answers, and a general modality system is not.`,\n      })\n      continue\n    }\n\n    const qualifier = readActiveWhen(edge)\n    if (!qualifier) {\n      // Separate the empty-list case from a structurally broken one. They read\n      // identically to the projection operator (both absent, so the edge stays\n      // invariant) but they are different author mistakes, and an empty list\n      // looks deliberate enough that naming it precisely saves a debugging pass.\n      const rawQualifier = edge.properties?.[ACTIVE_WHEN_PROPERTY]\n      const rawValues =\n        rawQualifier && typeof rawQualifier === 'object' && !Array.isArray(rawQualifier)\n          ? (rawQualifier as Record<string, unknown>).values\n          : undefined\n      if (Array.isArray(rawValues) && rawValues.length === 0) {\n        findings.push({\n          kind: 'qualifier_values_empty',\n          severity: 'error',\n          edge_id: edge.id,\n          message: `${edgeLabel(edge)} carries an active_when with an empty values list. Read literally that would remove the relationship from every configuration, which is a way to delete an edge by writing a property; it is treated as absent instead. To say a relationship never holds, delete the edge.`,\n        })\n        continue\n      }\n      findings.push({\n        kind: 'qualifier_axis_unresolved',\n        severity: 'error',\n        edge_id: edge.id,\n        message: `${edgeLabel(edge)} carries a malformed active_when. It must be an object with an axis id and a non-empty values array; anything else reads as absent, which silently makes the relationship invariant.`,\n      })\n      continue\n    }\n    const values = axisValues.get(qualifier.axis)\n    if (!values) {\n      findings.push({\n        kind: 'qualifier_axis_unresolved',\n        severity: 'error',\n        edge_id: edge.id,\n        axis_id: qualifier.axis,\n        message: `active_when names axis \"${qualifier.axis}\", which is not a configuration_axis node in this graph.`,\n      })\n      continue\n    }\n    for (const value of qualifier.values) {\n      if (!values.includes(value)) {\n        findings.push({\n          kind: 'qualifier_unknown_value',\n          severity: 'error',\n          edge_id: edge.id,\n          axis_id: qualifier.axis,\n          message: `active_when names value \"${value}\", which axis \"${qualifier.axis}\" does not declare. Its values are [${values.join(', ')}].`,\n        })\n      }\n    }\n  }\n\n  // ── Alternation ────────────────────────────────────────────────────────────\n  // A declared alternation is checked against what the variance declarations\n  // imply. It is never DERIVED from them: disjoint present_under on a shared\n  // axis is necessary for alternation and nowhere near sufficient, because two\n  // unrelated surfaces gated by the same flag are disjoint without being\n  // alternatives to each other. Explicit is what D2 asked for; this is what\n  // explicit costs and what it buys.\n  const varianceBySource = new Map<string, Array<{ axis: string; values: string[] }>>()\n  for (const edge of edges) {\n    if (edge.type !== VARIES_BY_EDGE) continue\n    const values = readStringArray(edge.properties, PRESENT_UNDER_PROPERTY) ?? []\n    const list = varianceBySource.get(edge.source) ?? []\n    list.push({ axis: edge.target, values })\n    varianceBySource.set(edge.source, list)\n  }\n\n  for (const edge of edges) {\n    if (edge.type !== ALTERNATES_EDGE) continue\n    const left = varianceBySource.get(edge.source) ?? []\n    const right = varianceBySource.get(edge.target) ?? []\n    if (left.length === 0 || right.length === 0) {\n      findings.push({\n        kind: 'alternation_axis_mismatch',\n        severity: 'error',\n        edge_id: edge.id,\n        message: `${edgeLabel(edge)} declares an alternation, but at least one endpoint declares no variance at all. Two surfaces that are both always present are not alternatives; they co-exist.`,\n      })\n      continue\n    }\n    const sharedAxes = left.filter((l) => right.some((r) => r.axis === l.axis)).map((l) => l.axis)\n    if (sharedAxes.length === 0) {\n      findings.push({\n        kind: 'alternation_axis_mismatch',\n        severity: 'error',\n        edge_id: edge.id,\n        message: `${edgeLabel(edge)} declares an alternation between surfaces that vary on different axes. Alternatives are selected by ONE lever; surfaces on different levers can both be present at once.`,\n      })\n      continue\n    }\n    for (const axis of sharedAxes) {\n      const leftValues = left.find((l) => l.axis === axis)?.values ?? []\n      const rightValues = right.find((r) => r.axis === axis)?.values ?? []\n      const overlap = leftValues.filter((v) => rightValues.includes(v))\n      if (overlap.length > 0) {\n        findings.push({\n          kind: 'alternation_overlap',\n          severity: 'error',\n          edge_id: edge.id,\n          axis_id: axis,\n          message: `${edgeLabel(edge)} declares an alternation, but both surfaces are present under [${overlap.join(', ')}] on axis \"${axis}\". They co-exist there, so the graph is asserting \"one of these\" and \"both, together\" about the same pair.`,\n        })\n      }\n    }\n  }\n\n  // ── Orphaned under projection (the one per-projection check) ───────────────\n  // Scoped deliberately: it fires only for a surface that HAS a parent in the\n  // union and loses every one of them in some projection. A surface with no\n  // parent anywhere is a pre-existing modelling state that has nothing to do\n  // with configuration, and lighting it up here would bury the real finding.\n  const parentsByChild = new Map<string, number>()\n  for (const edge of edges) {\n    if (edge.type && PARENT_EDGE_TYPES.has(edge.type)) {\n      parentsByChild.set(edge.target, (parentsByChild.get(edge.target) ?? 0) + 1)\n    }\n  }\n\n  for (const [axisId, values] of axisValues) {\n    for (const value of values) {\n      const projected = projectGraph(nodes, edges, { [axisId]: value })\n      const survivingParents = new Map<string, number>()\n      for (const edge of projected.edges) {\n        if (edge.type && PARENT_EDGE_TYPES.has(edge.type)) {\n          survivingParents.set(edge.target, (survivingParents.get(edge.target) ?? 0) + 1)\n        }\n      }\n      for (const node of projected.nodes) {\n        if (node.type !== 'surface') continue\n        if ((parentsByChild.get(node.id) ?? 0) === 0) continue\n        if ((survivingParents.get(node.id) ?? 0) > 0) continue\n        findings.push({\n          kind: 'orphaned_under_projection',\n          severity: 'warning',\n          node_id: node.id,\n          axis_id: axisId,\n          message: `Surface is present under ${axisId} = \"${value}\" but every containment parent it has is absent there. Either it needs a parent in that configuration, or it should declare that it is absent from it too.`,\n        })\n      }\n    }\n  }\n\n  return findings\n}\n","/**\n * UPG Assessment Scales. Spec-defined 5-point scales + `UPGAssessment`.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n// ── Core Types ────────────────────────────────────────────────────────────────\n\n/** An assessment is a human judgment mapped to a numeric scale.\n *  It carries both the qualitative meaning (label) and the numeric\n *  encoding (value) so UIs can display labels and formulas can compute\n *  scores. */\nexport interface UPGAssessment {\n  /** The numeric value, used for computation. Must fall within the referenced\n   *  scale's `min`..`max`. This is the ONLY field that carries cross-tool meaning. */\n  value: number\n  /** The qualitative label: what the assessor actually meant.\n   *\n   *  FREE TEXT BY CONTRACT (docket wave 2 item 7; clarification STAGED, release\n   *  number assigned at release prep). This is the\n   *  assessor's own word and is NOT required to equal the `UPGScalePoint.label` of\n   *  the matching point. The two are different vocabularies serving different jobs:\n   *  `UPGScalePoint.label` is the scale's display name for a point (what a picker\n   *  offers); `UPGAssessment.label` is the judgment as it was actually authored\n   *  (what a human wrote). `{ value: 5, label: 'critical' }` on a `severity_5`\n   *  property is CONFORMANT even though point 5 displays as \"Blocker\" — indeed\n   *  several property descriptions instruct writers to \"carry the old word in\n   *  `label`\" when migrating a legacy enum.\n   *\n   *  Consequently: never reconcile stored labels against scale point labels, and\n   *  never widen a scale's `points` to admit authored words. Compare on `value`.\n   *\n   *  The one exception is `friendly_aliases`. An alias (`low`/`medium`/`high`) is a\n   *  writer-side shorthand, not a judgment — expanding it MUST yield both the\n   *  canonical `value` and the canonical point label, so an unexpanded alias left\n   *  sitting in `label` is a writer bug. */\n  label: string\n  /** Which assessment scale this was rated on.\n   *  References a scale definition in the spec or in the document's\n   *  scale_extensions. If omitted, the spec default scale for this\n   *  property is assumed. */\n  scale_id?: string\n  /** Normalized 0-1 value, for cross-tool comparison when scales differ.\n   *  Computed as (value - min) / (max - min). */\n  normalized?: number\n}\n\n\n/** A scale definition provides the vocabulary for assessments */\nexport interface UPGScaleDefinition {\n  /** Unique scale identifier */\n  id: string\n  /** Human-readable name */\n  label: string\n  /** What this scale measures */\n  description: string\n  /** Minimum value */\n  min: number\n  /** Maximum value */\n  max: number\n  /** Number of discrete points (undefined = continuous) */\n  steps?: number\n  /** Each point on the scale */\n  points: UPGScalePoint[]\n  /**\n   * Friendly-word aliases that resolve to a canonical point `value` (UPG 0.11.1).\n   * The single, introspectable source of truth so every writer that accepts a\n   * friendly confidence word expands it to the SAME `confidence_5` value (and the\n   * canonical point label), instead of each tool inventing its own mapping. e.g.\n   * `{ low: 2, medium: 3, high: 4 }` — `high` is \"Confident\" (value 4), reserving\n   * \"Data-backed\" (5) for genuinely quantified claims. Surfaced via `get_scale`.\n   */\n  friendly_aliases?: Record<string, number>\n}\n\n/** A single point on an assessment scale */\nexport interface UPGScalePoint {\n  /** The numeric value */\n  value: number\n  /** The qualitative label the user sees */\n  label: string\n  /** Longer description */\n  description: string\n}\n\n// ── Spec-Defined Scales ───────────────────────────────────────────────────────\n\n/**\n * All spec-defined assessment scales, keyed by scale_id.\n *\n * These are the canonical scales for UPG-native tools. External tools may\n * declare additional scales in the document's scale_extensions field.\n */\nexport const UPG_SCALES: Record<string, UPGScaleDefinition> = {\n\n  // ── Reach ──────────────────────────────────────────────────────────────────\n\n  reach_5: {\n    id: 'reach_5',\n    label: 'Reach (5-point)',\n    description: 'How many users experience this problem or benefit from this feature',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Almost no one',   description: 'Affects <5% of users' },\n      { value: 2, label: 'A few',           description: 'Affects 5-20% of users' },\n      { value: 3, label: 'Some',            description: 'Affects 20-50% of users' },\n      { value: 4, label: 'Most',            description: 'Affects 50-80% of users' },\n      { value: 5, label: 'Nearly everyone', description: 'Affects >80% of users' },\n    ],\n  },\n\n  // ── Frequency ──────────────────────────────────────────────────────────────\n\n  frequency_5: {\n    id: 'frequency_5',\n    label: 'Frequency (5-point)',\n    description: 'How often the problem or situation occurs',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Rarely',      description: 'Less than once a month' },\n      { value: 2, label: 'Occasionally', description: 'A few times a month' },\n      { value: 3, label: 'Sometimes',   description: 'Weekly' },\n      { value: 4, label: 'Often',       description: 'Multiple times a week' },\n      { value: 5, label: 'Constantly',  description: 'Daily or more' },\n    ],\n  },\n\n  // ── Severity ───────────────────────────────────────────────────────────────\n\n  severity_5: {\n    id: 'severity_5',\n    label: 'Severity (5-point)',\n    description: 'How badly the problem impacts the user when it occurs',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Mild inconvenience', description: 'Notices but works around easily' },\n      { value: 2, label: 'Annoying',           description: 'Frustrated but can continue' },\n      { value: 3, label: 'Significant',        description: 'Has to change approach' },\n      { value: 4, label: 'Severe',             description: 'Struggles to accomplish goal' },\n      { value: 5, label: 'Blocker',            description: 'Cannot accomplish goal' },\n    ],\n  },\n\n  // ── Importance ─────────────────────────────────────────────────────────────\n\n  importance_5: {\n    id: 'importance_5',\n    label: 'Importance (5-point)',\n    description: 'How important this is to the user when evaluating or using a solution',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Nice to have',       description: 'Would not notice if absent' },\n      { value: 2, label: 'Somewhat important', description: 'Prefer but can live without' },\n      { value: 3, label: 'Important',          description: 'Actively looks for this' },\n      { value: 4, label: 'Very important',     description: 'Key factor in decision' },\n      { value: 5, label: 'Critical',           description: 'Dealbreaker if absent' },\n    ],\n  },\n\n  // ── Satisfaction ───────────────────────────────────────────────────────────\n\n  satisfaction_5: {\n    id: 'satisfaction_5',\n    label: 'Satisfaction (5-point)',\n    description: 'How well the current solution meets the user\\'s need',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Very unsatisfied', description: 'Current solution fails completely' },\n      { value: 2, label: 'Unsatisfied',      description: 'Current solution inadequate' },\n      { value: 3, label: 'Neutral',          description: 'Acceptable' },\n      { value: 4, label: 'Satisfied',        description: 'Works well' },\n      { value: 5, label: 'Very satisfied',   description: 'Exceeds expectations' },\n    ],\n  },\n\n  // ── Pain ───────────────────────────────────────────────────────────────────\n\n  pain_5: {\n    id: 'pain_5',\n    label: 'Pain (5-point)',\n    description: 'How much friction or distress the problem causes the user',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Barely noticeable', description: 'Minor friction, easily ignored' },\n      { value: 2, label: 'Mild',              description: 'Noticeable but not a priority to fix' },\n      { value: 3, label: 'Moderate',          description: 'Actively wished it were better' },\n      { value: 4, label: 'Significant',       description: 'Regularly disrupts workflow' },\n      { value: 5, label: 'Extreme',           description: 'Major frustration, seeking alternatives' },\n    ],\n  },\n\n  // ── Impact ─────────────────────────────────────────────────────────────────\n\n  impact_5: {\n    id: 'impact_5',\n    label: 'Impact (5-point)',\n    description: 'How much positive difference this solution or feature would make',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Minimal',       description: 'Barely moves the needle' },\n      { value: 2, label: 'Low',           description: 'Small improvement' },\n      { value: 3, label: 'Moderate',      description: 'Noticeable improvement' },\n      { value: 4, label: 'High',          description: 'Significant improvement' },\n      { value: 5, label: 'Transformative', description: 'Game-changing' },\n    ],\n  },\n\n  // ── Confidence ─────────────────────────────────────────────────────────────\n\n  confidence_5: {\n    id: 'confidence_5',\n    label: 'Confidence (5-point)',\n    description: 'How well-evidenced this assessment or judgment is',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Guessing',       description: 'No evidence' },\n      { value: 2, label: 'Hunch',          description: 'Anecdotal evidence' },\n      { value: 3, label: 'Some evidence',  description: 'A few data points' },\n      { value: 4, label: 'Confident',      description: 'Multiple data sources' },\n      { value: 5, label: 'Data-backed',    description: 'Strong quantitative evidence' },\n    ],\n    // The pinned friendly mapping (0.11.1). `high` is Confident (4), not\n    // Data-backed (5) — 5 is reserved for genuinely quantified claims. Matches\n    // the existing classify-edge population, so nothing needs re-stamping.\n    friendly_aliases: { low: 2, medium: 3, high: 4 },\n  },\n\n  // ── Likelihood ─────────────────────────────────────────────────────────────\n\n  /**\n   * (0.35.0) How likely a future event is to occur.\n   *\n   * Added because the nine pre-existing ladders had no probability ladder, and\n   * `likelihood` was resolving to `confidence_5` — which is EPISTEMIC. Confidence\n   * says how sure you are of a judgment (\"Guessing → Data-backed\"); likelihood\n   * says how probable the event is. A risk you are certain about and a risk that\n   * is certain to happen are different facts, and one ladder cannot hold both.\n   *\n   * Vocabulary is ISO 31000's, which is also what `risk.likelihood`,\n   * `threat.likelihood` and the Notion fixtures already say in prose.\n   *\n   * Polarity is `low-is-good` (rendered by the design system's direction map,\n   * which is where numeric-scale polarity lives): 5 on this ladder is bad news.\n   */\n  likelihood_5: {\n    id: 'likelihood_5',\n    label: 'Likelihood (5-point)',\n    description: 'How likely this event is to occur',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Rare',           description: 'Would be surprising; no known precedent' },\n      { value: 2, label: 'Unlikely',       description: 'Could happen, but not expected' },\n      { value: 3, label: 'Possible',       description: 'Might happen; roughly even odds' },\n      { value: 4, label: 'Likely',         description: 'Expected to happen absent intervention' },\n      { value: 5, label: 'Almost certain', description: 'Expected to happen; plan for it' },\n    ],\n  },\n\n  // ── Effort ─────────────────────────────────────────────────────────────────\n\n  effort_5: {\n    id: 'effort_5',\n    label: 'Effort (5-point)',\n    description: 'How much work is required to deliver this',\n    min: 1,\n    max: 5,\n    steps: 5,\n    points: [\n      { value: 1, label: 'Trivial',     description: 'Hours' },\n      { value: 2, label: 'Small',       description: 'Days' },\n      { value: 3, label: 'Medium',      description: '1-2 weeks' },\n      { value: 4, label: 'Significant', description: 'Weeks to months' },\n      { value: 5, label: 'Massive',     description: 'Months+' },\n    ],\n  },\n\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Look up a scale definition by its ID.\n *\n * Returns undefined for unknown IDs; callers should handle this case\n * gracefully (e.g. fall back to displaying raw value).\n *\n * @example\n * const scale = getScale('reach_5')\n * const point = scale?.points.find(p => p.value === assessment.value)\n */\nexport function getScale(scaleId: string): UPGScaleDefinition | undefined {\n  return UPG_SCALES[scaleId]\n}\n\n/**\n * Resolve a friendly word (e.g. `high`) to a canonical assessment on a scale,\n * using the scale's pinned `friendly_aliases` (UPG 0.11.1). The single source of\n * truth every writer must use, so `high` is always the same `confidence_5` value\n * with the canonical point label — no per-tool drift. Returns `null` when the\n * scale has no aliases or the word is not aliased.\n *\n * @example\n * friendlyToAssessment('confidence_5', 'high')\n * // => { value: 4, label: 'Confident', scale_id: 'confidence_5' }\n */\nexport function friendlyToAssessment(\n  scaleId: string,\n  word: string,\n): { value: number; label: string; scale_id: string } | null {\n  const scale = UPG_SCALES[scaleId]\n  const value = scale?.friendly_aliases?.[word]\n  if (value === undefined) return null\n  const point = scale!.points.find((p) => p.value === value)\n  return { value, label: point?.label ?? word, scale_id: scaleId }\n}\n\n/**\n * Per-property scale overrides.\n *\n * Maps a property name to the scale that best captures its semantics.\n * Properties absent from this map fall back to `'scale_5'`, a generic\n * 1–5 ordinal. The mapping is keyed by property name only; the `entityType`\n * parameter on `getPropertyDefaultScale` is reserved for future per-entity\n * disambiguation.\n *\n * Sources: all `UPGAssessment`-typed properties across\n * `packages/upg-spec/src/properties/domains/` (audited at v0.4.0).\n */\nexport const PROPERTY_SCALE_MAP: Record<string, string> = {\n  // ── Reach ────────────────────────────────────────────────────────────────\n  reach:            'reach_5',       // discovery, users\n  projected_reach:  'reach_5',       // validation/experiment_plan\n\n  // ── Frequency ────────────────────────────────────────────────────────────\n  frequency:        'frequency_5',   // discovery, users, feedback\n\n  // ── Severity ─────────────────────────────────────────────────────────────\n  severity:         'severity_5',    // users, engineering, ai, gtm, customer-success, security, accessibility\n  severity_of_finding: 'severity_5', // validation/experiment_run\n  bug_severity:     'severity_5',    // product-spec/bug (UPG-579 Option C collapse)\n  magnitude:        'severity_5',    // user/switching_cost barrier size (0.17.7; restores the documented UPG-579 intent that a missing entry had silently overridden to scale_5)\n  risk_level:       'severity_5',    // compliance/risk (UPG-579 Option B)\n  scarcity_risk:    'severity_5',    // market-intelligence (UPG-579 Option B)\n\n  // ── Pain ─────────────────────────────────────────────────────────────────\n  pain:             'pain_5',        // discovery\n  pain_score:       'pain_5',        // user (UPG-579 Option B)\n  friction_score:   'pain_5',        // growth/ux (UPG-579 Option B)\n\n  // ── Impact ───────────────────────────────────────────────────────────────\n  impact:           'impact_5',      // discovery, market, security, compliance\n  projected_impact: 'impact_5',      // validation/experiment_plan\n  revenue_impact:   'impact_5',      // sales/business-model (UPG-579 Option B)\n  effectiveness:    'impact_5',      // security/marketing (UPG-579 Option B)\n  opportunity_score: 'impact_5',     // discovery/opportunity (UPG-579 Option B)\n\n  // ── Confidence ───────────────────────────────────────────────────────────\n  confidence:       'confidence_5',  // discovery, validation, sales, product-spec\n  current_confidence: 'confidence_5', // validation/hypothesis (UPG-579 Option B)\n  probability:      'confidence_5',  // sales/forecast (UPG-579 Option B)\n  qualification_score: 'confidence_5', // sales/deal — how confident the qualification is (0.24.0)\n\n  // ── Likelihood ───────────────────────────────────────────────────────────\n  // (0.35.0) Moved off confidence_5. `likelihood` is how probable the event is,\n  // not how well-evidenced the judgment is; the two were sharing one ladder\n  // because no probability ladder existed. Carries market/risk (`risk`,\n  // `market_trend`) and `security.threat.likelihood` in one line.\n  likelihood:       'likelihood_5',  // compliance/risk, security/threat, market\n\n  // ── Effort ───────────────────────────────────────────────────────────────\n  effort:           'effort_5',      // discovery\n  effort_estimate:  'effort_5',      // feedback\n  effort_to_fix:    'effort_5',      // engineering\n  cost_estimate:    'effort_5',      // validation/experiment_plan (UPG-579 Option B)\n\n  // ── Importance ───────────────────────────────────────────────────────────\n  importance:       'importance_5',  // users\n  influence:        'importance_5',  // team-org/stakeholder (UPG-579 Option B)\n  interest:         'importance_5',  // team-org/stakeholder (UPG-579 Option B)\n  relevance:        'importance_5',  // market/content (UPG-579 Option B)\n  weight:           'importance_5',  // validation/evidence (UPG-579 Option B)\n\n  // ── Satisfaction ─────────────────────────────────────────────────────────\n  current_satisfaction: 'satisfaction_5', // users\n  emotion_score:    'satisfaction_5', // ux-design/customer-success journey (UPG-579 Option B)\n\n  // Intentionally NOT mapped (resolve to the generic scale_5):\n  //   rarity   : VRIO distinctiveness; no canonical named scale fits.\n  //   strength : deprecated (validation/evidence; superseded by weight).\n}\n\n/**\n * Per-ENTITY scale overrides (0.35.0). Beats `PROPERTY_SCALE_MAP` for the one\n * entity named, and only that entity.\n *\n * This activates the per-entity disambiguation `getPropertyDefaultScale` has\n * reserved since v0.4.0. It exists for a narrow, real class: a property name\n * that means one thing on most entities and its opposite on one.\n *\n * `risk.impact` is that case. `impact_5` is benefit-framed (\"Minimal →\n * Transformative\") and reads high-is-good, which on discovery and market\n * entities is correct — a high-impact opportunity is good news. On a `risk`,\n * the same word means severity of consequences, and a catastrophic risk was\n * rendering GREEN. `severity_5` (\"Mild inconvenience → Blocker\") is the\n * risk-shaped ladder and reads low-is-good, so the traffic-light story arrives\n * from the existing polarity map with no bespoke bucketing.\n *\n * `risk.probability` is the second entry, and it is the same instrument used\n * for the opposite purpose (Captain-ratified 2026-08-22). `probability` is\n * DEPRECATED on `risk` in favour of `likelihood`, and the name-level map holds\n * it at `confidence_5` for `forecast.probability`, which is a bare sales\n * percentage and genuinely belongs there. Leaving `risk.probability` on that\n * name-level entry meant the deprecated field and its replacement rendered on\n * DIFFERENT ladders for the whole deprecation window: the same stored 4 reading\n * \"Confident\" through the old name and \"Likely\" through the new one, on one\n * card, from one graph. A staged deprecation exists so a reader can migrate\n * WITHOUT their data changing meaning, and a ladder swap at the rename is\n * exactly that meaning changing. So the override pins the legacy spelling to\n * `likelihood_5` — the ladder the field always should have had — and the two\n * names agree until 1.0.0 drops the old one.\n *\n * Note what this does NOT do: `forecast.probability` is untouched and still\n * resolves to `confidence_5` through the name-level map. Being able to correct\n * ONE entity without disturbing the other is the entire reason this layer\n * exists, and this is the first time it has been used for that rather than for\n * a polarity fix.\n *\n * Keep this layer SMALL. A name that needs an override on three entities is a\n * name that should be split, not overridden; renaming `risk.probability` to\n * `likelihood` in the same release is that lesson applied. The two entries here\n * are both `risk`, both from one audit, and both close when 1.0.0 lands.\n */\nexport const PROPERTY_SCALE_MAP_BY_ENTITY: Record<string, Record<string, string>> = {\n  risk: {\n    // Severity of consequences, not magnitude of benefit. See above.\n    impact: 'severity_5',\n    // The DEPRECATED spelling of `likelihood`, held on the same ladder as its\n    // replacement for the length of the deprecation window. See above.\n    probability: 'likelihood_5',\n  },\n}\n\n/**\n * The default scale ID for properties not listed in `PROPERTY_SCALE_MAP`.\n * A generic 1–5 ordinal. Tools that display `UPGAssessment` values without\n * a known scale should fall back to this rather than no scale at all.\n */\nconst DEFAULT_SCALE_ID = 'scale_5'\n\n/**\n * Return the default scale ID for a given entity-type / property-name pair.\n *\n * Resolution order (0.35.0 — the entity layer is new; the other two are not):\n * 1. `PROPERTY_SCALE_MAP_BY_ENTITY[entityType][propertyName]` — a per-entity\n *    override, for a name that means something different on one entity.\n * 2. `PROPERTY_SCALE_MAP[propertyName]` — the property-level default.\n * 3. `'scale_5'` (generic 1–5 ordinal).\n *\n * Adding layer 1 is non-breaking: every pair with no entity override resolves\n * exactly as before.\n *\n * @param entityType   - The UPG entity type string (e.g. `'problem_statement'`).\n * @param propertyName - The property name on that entity (e.g. `'severity'`).\n * @returns A scale ID string (always a key of `UPG_SCALES` or `'scale_5'`).\n *\n * @example\n * getPropertyDefaultScale('problem_statement', 'reach')     // → 'reach_5'\n * getPropertyDefaultScale('problem_statement', 'frequency') // → 'frequency_5'\n * getPropertyDefaultScale('problem_statement', 'severity')  // → 'severity_5'\n * getPropertyDefaultScale('risk', 'risk_level')             // → 'severity_5'\n * getPropertyDefaultScale('risk', 'likelihood')             // → 'likelihood_5'\n * getPropertyDefaultScale('risk', 'impact')                 // → 'severity_5' (entity override)\n * getPropertyDefaultScale('risk', 'probability')            // → 'likelihood_5' (entity override; deprecated name, same ladder as `likelihood`)\n * getPropertyDefaultScale('forecast', 'probability')        // → 'confidence_5' (unchanged)\n * getPropertyDefaultScale('opportunity', 'impact')          // → 'impact_5'   (unchanged)\n * getPropertyDefaultScale('anything', 'unknown_property')   // → 'scale_5'\n */\nexport function getPropertyDefaultScale(\n  entityType: string,\n  propertyName: string,\n): string {\n  return (\n    PROPERTY_SCALE_MAP_BY_ENTITY[entityType]?.[propertyName] ??\n    PROPERTY_SCALE_MAP[propertyName] ??\n    DEFAULT_SCALE_ID\n  )\n}\n\n/**\n * Inverse of `PROPERTY_SCALE_MAP`: the canonical property names that default to\n * a given scale, in declaration order. Useful for documentation surfaces that\n * want to show \"where is this scale used\".\n *\n * Returns an empty array for scales no property defaults to (e.g. the generic\n * `'scale_5'` fallback, which is never an explicit entry).\n *\n * Scope: the NAME-level map only. Per-entity overrides\n * (`PROPERTY_SCALE_MAP_BY_ENTITY`, 0.35.0) are deliberately not folded in,\n * because a bare property name cannot express \"impact, but only on risk\" and a\n * documentation surface that listed `impact` under both ladders would be\n * telling the reader less than it does now. Read that map directly when the\n * question is per-entity.\n *\n * @example\n * getPropertiesForScale('effort_5') // → ['effort', 'effort_estimate', 'effort_to_fix']\n */\nexport function getPropertiesForScale(scaleId: string): string[] {\n  return Object.entries(PROPERTY_SCALE_MAP)\n    .filter(([, id]) => id === scaleId)\n    .map(([property]) => property)\n}\n","/**\n * UPG Enum Scales. Runtime metadata for the closed-enum primitives in\n * `properties/primitives.ts`. Per-value labels and descriptions for UI hover.\n * Parallel to `UPG_SCALES` (numeric assessment scales).\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n// ─── Shapes ──────────────────────────────────────────────────────────────────\n\n/** A single value in a closed-enum scale */\nexport interface UPGEnumScaleValue {\n  /** The TypeScript string literal (e.g. `'at_risk'`) */\n  value: string\n  /** Human-readable display label (e.g. `'At risk'`) */\n  label: string\n  /** One-sentence definition shown on hover */\n  description: string\n}\n\n/**\n * Runtime metadata for a closed-enum primitive type.\n *\n * `values` is ordered semantically (e.g. low → high for ordinal scales;\n * strict → permissive for rule strength). Array index is the canonical\n * position (no separate `position` field).\n */\nexport interface UPGEnumScaleDefinition {\n  /** Matches the TypeScript type name (e.g. `'HealthStatus'`) */\n  id: string\n  /** Human-readable scale name (e.g. `'Health status'`) */\n  label: string\n  /** What the scale classifies or measures */\n  description: string\n  /** Per-value metadata in semantic order */\n  values: UPGEnumScaleValue[]\n  /**\n   * Optional rendering hint: which end of the scale is desirable.\n   * Parallel to `SCALE_TONE_DIRECTION` for numeric scales.\n   *\n   * `'high-is-good'`: first value is best (e.g. on_track, high confidence)\n   * `'low-is-good'`: last value in natural order is worst (e.g. critical urgency is bad)\n   * `'neutral'`: no inherent good/bad direction (e.g. Cadence, Priority)\n   */\n  tone_direction?: 'high-is-good' | 'low-is-good' | 'neutral'\n}\n\n// ─── Registry ─────────────────────────────────────────────────────────────────\n\nexport const UPG_ENUM_SCALES: Record<string, UPGEnumScaleDefinition> = {\n\n  // ── HealthStatus ─────────────────────────────────────────────────────────────\n\n  HealthStatus: {\n    id: 'HealthStatus',\n    label: 'Health status',\n    description: 'Traffic-light delivery health for initiatives, features, and OKRs.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'on_track',  label: 'On track',  description: 'Progressing as planned; no blockers or material risks.' },\n      { value: 'at_risk',   label: 'At risk',   description: 'Behind plan or facing blockers that may cause a miss without intervention.' },\n      { value: 'off_track', label: 'Off track', description: 'Significantly behind; escalation or scope change required.' },\n    ],\n  },\n\n  // ── SignalUrgency ────────────────────────────────────────────────────────────\n\n  SignalUrgency: {\n    id: 'SignalUrgency',\n    label: 'Signal urgency',\n    description: 'How urgently an inbound signal (customer, support, or market) needs to be addressed.',\n    tone_direction: 'low-is-good',\n    values: [\n      { value: 'low',      label: 'Low',      description: 'No immediate action required; monitor and review at regular cadence.' },\n      { value: 'medium',   label: 'Medium',   description: 'Should be addressed within the current sprint or cycle.' },\n      { value: 'high',     label: 'High',     description: 'Requires prompt attention; address before the next planning checkpoint.' },\n      { value: 'critical', label: 'Critical', description: 'Immediate action required; escalate now.' },\n    ],\n  },\n\n  // ── Priority ─────────────────────────────────────────────────────────────────\n\n  Priority: {\n    id: 'Priority',\n    label: 'Priority',\n    description: 'Task or strategic priority level. Neutral direction: urgent is not inherently bad; none is not inherently good.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'urgent', label: 'Urgent', description: 'Blocking progress or time-critical; must be addressed immediately.' },\n      { value: 'high',   label: 'High',   description: 'Important; address in the current sprint or planning cycle.' },\n      { value: 'medium', label: 'Medium', description: 'Valuable; schedule in the near term when higher priorities are cleared.' },\n      { value: 'low',    label: 'Low',    description: 'Nice to have; address when capacity allows.' },\n      { value: 'none',   label: 'None',   description: 'No priority assigned, or deliberately deprioritised.' },\n    ],\n  },\n\n  // ── Cadence ──────────────────────────────────────────────────────────────────\n\n  Cadence: {\n    id: 'Cadence',\n    label: 'Cadence',\n    description: 'How often a recurring activity, publication, or measurement repeats.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'continuous', label: 'Continuous', description: 'Always running; no discrete recurrence interval.' },\n      { value: 'hourly',     label: 'Hourly',     description: 'Recurs every hour.' },\n      { value: 'daily',      label: 'Daily',      description: 'Recurs every day.' },\n      { value: 'weekly',     label: 'Weekly',     description: 'Recurs every week.' },\n      { value: 'monthly',    label: 'Monthly',    description: 'Recurs every month.' },\n      { value: 'quarterly',  label: 'Quarterly',  description: 'Recurs every calendar quarter.' },\n      { value: 'yearly',     label: 'Yearly',     description: 'Recurs every year.' },\n      { value: 'on_demand',  label: 'On demand',  description: 'Triggered by an event, not a fixed schedule.' },\n      { value: 'other',      label: 'Other',      description: 'Recurs on a cadence not captured by the above tiers.' },\n    ],\n  },\n\n  // ── Confidence ───────────────────────────────────────────────────────────────\n\n  Confidence: {\n    id: 'Confidence',\n    label: 'Confidence',\n    description: 'Epistemic confidence level for assumptions, evidence, and feasibility assessments. Also aliased as LowMedHigh for non-epistemic magnitude properties.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'high',   label: 'High',   description: 'Strong confidence; evidence is solid or reasoning is well-validated.' },\n      { value: 'medium', label: 'Medium', description: 'Moderate confidence; some evidence or reasoning gaps remain.' },\n      { value: 'low',    label: 'Low',    description: 'Weak confidence; significant uncertainty or limited evidence.' },\n    ],\n  },\n\n  // ── RuleStrength ────────────────────────────────────────────────────\n\n  RuleStrength: {\n    id: 'RuleStrength',\n    label: 'Rule strength',\n    description: 'Imperative force of a constraint, guideline, or policy rule.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'must',      label: 'Must',      description: 'Hard requirement. Violation blocks; no exceptions without an explicit carve-out.' },\n      { value: 'must_not',  label: 'Must not',  description: 'Hard prohibition. Violation blocks; no exceptions without an explicit carve-out.' },\n      { value: 'exception', label: 'Exception', description: 'Documented carve-out from a must or must_not rule; captures the approved deviation.' },\n      { value: 'warning',   label: 'Warning',   description: 'Soft signal: should consider and address, but can override with justification.' },\n      { value: 'guideline', label: 'Guideline', description: 'Recommendation: encouraged and expected in most cases, but not enforced.' },\n    ],\n  },\n\n  // ── EngagementPosture ────────────────────────────────────────────────\n\n  /**\n   * (0.35.0) The third axis of stakeholder canon, beside the power/interest\n   * grid `influence` / `interest` carry. Those two say how much weight a\n   * stakeholder has and how much they care; neither says which WAY they lean,\n   * and \"who blocks this?\" is the question a stakeholder map is drawn to answer.\n   *\n   * `tone_direction: 'high-is-good'` reading champion → blocker: the first\n   * value is the desirable end, matching HealthStatus's convention.\n   */\n  EngagementPosture: {\n    id: 'EngagementPosture',\n    label: 'Engagement posture',\n    description: 'Which way a stakeholder leans on the thing at hand: actively for it, against it, or neither.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'champion',  label: 'Champion',  description: 'Actively advocates for it and spends their own capital doing so.' },\n      { value: 'supporter', label: 'Supporter', description: 'In favour and will say so when asked, but does not drive it.' },\n      { value: 'neutral',   label: 'Neutral',   description: 'No position taken; neither helps nor hinders.' },\n      { value: 'skeptic',   label: 'Skeptic',   description: 'Unconvinced and voices objections, but is not blocking.' },\n      { value: 'blocker',   label: 'Blocker',   description: 'Actively opposes, and holds enough leverage to stop it.' },\n    ],\n  },\n\n  // ── ProxyConfidence ─────────────────────────────────────────────────\n\n  ProxyConfidence: {\n    id: 'ProxyConfidence',\n    label: 'Proxy confidence',\n    description: 'How strongly a proxy metric predicts the direct measure it stands in for.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'strong',   label: 'Strong',   description: 'Tracks the direct measure closely; a reliable stand-in.' },\n      { value: 'moderate', label: 'Moderate', description: 'Correlates with the direct measure but with meaningful slippage.' },\n      { value: 'weak',     label: 'Weak',     description: 'Loosely related; use with caution and corroborate.' },\n    ],\n  },\n\n  // ── CauseConfidence ─────────────────────────────────────────────────\n\n  CauseConfidence: {\n    id: 'CauseConfidence',\n    label: 'Cause confidence',\n    description: 'Maturity of a root-cause determination during incident debugging: how far a proposed cause has been validated.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'hypothesised', label: 'Hypothesised', description: 'A proposed cause, not yet tested against evidence.' },\n      { value: 'likely',       label: 'Likely',       description: 'Supported by evidence but not conclusively proven.' },\n      { value: 'confirmed',    label: 'Confirmed',    description: 'Verified as the cause; reproduced or otherwise established.' },\n    ],\n  },\n\n  // ── ComfortLevel ────────────────────────────────────────────────────\n\n  ComfortLevel: {\n    id: 'ComfortLevel',\n    label: 'Comfort level',\n    description: 'A person\\'s comfort with a tool, technology, or practice. Closed set so personas compare on the same axis across products.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'low',    label: 'Low',    description: 'Little or no familiarity; needs guidance to proceed.' },\n      { value: 'medium', label: 'Medium', description: 'Functional, everyday competence.' },\n      { value: 'high',   label: 'High',   description: 'Confident, fluent use without assistance.' },\n      { value: 'expert', label: 'Expert', description: 'Deep mastery; can teach others or extend the tool.' },\n      { value: 'other',  label: 'Other',  description: 'A comfort profile not captured by the above tiers.' },\n    ],\n  },\n\n  // ── LogLevel ────────────────────────────────────────────────────────\n\n  LogLevel: {\n    id: 'LogLevel',\n    label: 'Log level',\n    description: 'Operational verbosity of a monitor or alert signal. How loud the signal should be, not how bad an outcome is for the user (kept distinct from severity_5).',\n    tone_direction: 'low-is-good',\n    values: [\n      { value: 'critical', label: 'Critical', description: 'Page immediately; the signal is service-affecting.' },\n      { value: 'warning',  label: 'Warning',  description: 'Needs attention soon; not yet service-affecting.' },\n      { value: 'info',     label: 'Info',     description: 'Informational; no action required.' },\n    ],\n  },\n\n  // ── IncidentSeverity ────────────────────────────────────────────────\n\n  IncidentSeverity: {\n    id: 'IncidentSeverity',\n    label: 'Incident severity',\n    description: 'Paging-tier classification of an incident, driving escalation and response process. Distinct from user-impact severity_5 and from LogLevel.',\n    tone_direction: 'low-is-good',\n    values: [\n      { value: 'sev1', label: 'SEV1', description: 'Critical outage; full response, executive-visible.' },\n      { value: 'sev2', label: 'SEV2', description: 'Major degradation; urgent response.' },\n      { value: 'sev3', label: 'SEV3', description: 'Minor or partial impact; handled within hours.' },\n      { value: 'sev4', label: 'SEV4', description: 'Negligible impact; routine handling.' },\n    ],\n  },\n\n  // ── SignalSentiment ─────────────────────────────────────────────────\n\n  SignalSentiment: {\n    id: 'SignalSentiment',\n    label: 'Signal sentiment',\n    description: 'Sentiment polarity of an inbound signal (feedback, support, customer).',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'positive', label: 'Positive', description: 'Favourable signal; satisfaction or advocacy.' },\n      { value: 'neutral',  label: 'Neutral',  description: 'No clear positive or negative lean.' },\n      { value: 'negative', label: 'Negative', description: 'Unfavourable signal; dissatisfaction or risk.' },\n      { value: 'mixed',    label: 'Mixed',    description: 'Contains both positive and negative elements.' },\n    ],\n  },\n\n  // ── MaturityLevel ───────────────────────────────────────────────────\n\n  MaturityLevel: {\n    id: 'MaturityLevel',\n    label: 'Maturity level',\n    description: 'Capability or process maturity on the CMMI ladder.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'initial',    label: 'Initial',    description: 'Ad hoc and unpredictable; little process.' },\n      { value: 'developing', label: 'Developing', description: 'Basic process emerging but inconsistent.' },\n      { value: 'defined',    label: 'Defined',    description: 'Documented, standardised process in place.' },\n      { value: 'managed',    label: 'Managed',    description: 'Measured and controlled against objectives.' },\n      { value: 'optimizing', label: 'Optimizing', description: 'Continuous, data-driven improvement.' },\n    ],\n  },\n\n  // ── ConformanceLevel ────────────────────────────────────────────────\n\n  ConformanceLevel: {\n    id: 'ConformanceLevel',\n    label: 'Conformance level',\n    description: 'WCAG accessibility conformance level.',\n    tone_direction: 'high-is-good',\n    values: [\n      { value: 'A',   label: 'A',   description: 'Minimum conformance; essential barriers removed.' },\n      { value: 'AA',  label: 'AA',  description: 'Addresses the most common barriers; the usual legal target.' },\n      { value: 'AAA', label: 'AAA', description: 'Highest level; not achievable for all content.' },\n    ],\n  },\n\n  // ── DataSensitivity ─────────────────────────────────────────────────\n\n  DataSensitivity: {\n    id: 'DataSensitivity',\n    label: 'Data sensitivity',\n    description: 'Data classification tier governing handling and access.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'public',       label: 'Public',       description: 'No restriction; safe to disclose openly.' },\n      { value: 'internal',     label: 'Internal',     description: 'For internal use; not for external release.' },\n      { value: 'confidential', label: 'Confidential', description: 'Sensitive; restricted to a need-to-know basis.' },\n      { value: 'restricted',   label: 'Restricted',   description: 'Highly sensitive; strict controls and auditing.' },\n    ],\n  },\n\n  // ── DifficultyLevel ─────────────────────────────────────────────────\n\n  DifficultyLevel: {\n    id: 'DifficultyLevel',\n    label: 'Difficulty level',\n    description: 'Learner difficulty tier for educational content.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'beginner',     label: 'Beginner',     description: 'No prior knowledge assumed.' },\n      { value: 'intermediate', label: 'Intermediate', description: 'Assumes working familiarity with the basics.' },\n      { value: 'advanced',     label: 'Advanced',     description: 'Assumes deep, expert-level background.' },\n    ],\n  },\n\n  // ── FrequencyRating ─────────────────────────────────────────────────\n\n  FrequencyRating: {\n    id: 'FrequencyRating',\n    label: 'Frequency rating',\n    description: 'Qualitative how-often rating. Distinct from the numeric frequency_5 scale and from Cadence calendar tiers.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'constant',   label: 'Constant',   description: 'Effectively always; continuous occurrence.' },\n      { value: 'regular',    label: 'Regular',    description: 'Happens on a predictable, recurring basis.' },\n      { value: 'occasional', label: 'Occasional', description: 'Happens sometimes, without a fixed pattern.' },\n      { value: 'rare',       label: 'Rare',       description: 'Happens infrequently.' },\n      { value: 'other',      label: 'Other',      description: 'A frequency not captured by the above tiers.' },\n    ],\n  },\n\n  // ── EvidenceDirection ───────────────────────────────────────────────\n\n  EvidenceDirection: {\n    id: 'EvidenceDirection',\n    label: 'Evidence direction',\n    description: 'Direction of evidence relative to a claim. Distinct from confidence_impact (strengthens/weakens) per the UPG-579 polysemy verdicts.',\n    tone_direction: 'neutral',\n    values: [\n      { value: 'supports', label: 'Supports', description: 'The evidence backs the claim.' },\n      { value: 'refutes',  label: 'Refutes',  description: 'The evidence contradicts the claim.' },\n      { value: 'neutral',  label: 'Neutral',  description: 'The evidence is inconclusive either way.' },\n    ],\n  },\n\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Look up a full enum scale definition by its type name. */\nexport function getEnumScale(name: string): UPGEnumScaleDefinition | undefined {\n  return UPG_ENUM_SCALES[name]\n}\n\n/** Look up per-value metadata within a named enum scale. */\nexport function getEnumValueMeta(scaleName: string, value: string): UPGEnumScaleValue | undefined {\n  return UPG_ENUM_SCALES[scaleName]?.values.find(v => v.value === value)\n}\n","/**\n * UPG Schema Migrations. Version-scoped maps for type renames, merges, and deprecations.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport { getScale } from './scales.js'\n\n// ─── Migration map per version ─────────────────────────────────────────────────\n\nexport interface UPGTypeMigration {\n  /** The old type name being retired */\n  from: string\n  /** The new canonical type name */\n  to: string\n  /** Default designation/property values to set on migrated nodes */\n  defaults?: Record<string, unknown>\n  /** Human-readable explanation of why this migration exists */\n  reason: string\n}\n\n/**\n * Version-scoped migration definitions.\n * Key is the version that INTRODUCES the migration (target version).\n * Each entry describes how an old type maps to a new canonical type.\n */\nexport const UPG_MIGRATIONS: Record<string, UPGTypeMigration[]> = {\n  '0.9.0': [\n    // (since v0.9.0, UPG-660) theme → roadmap_theme. `theme` was the only bare,\n    // unqualified theme among four domain-prefixed siblings (strategic_theme,\n    // content_theme, feedback_theme); it claimed the unqualified word and read as\n    // interchangeable with strategic_theme (the N6/UPG-652 confusion). Renamed to\n    // roadmap_theme so all four read consistently and the customer-problem roadmap\n    // grouping is explicit. Lifecycle-free, identical property surface (theme_scope\n    // / priority); no property migration required. Paired edge renames live in\n    // UPG_EDGE_MIGRATIONS['0.9.0'].\n    {\n      from: 'theme',\n      to: 'roadmap_theme',\n      reason: 'theme renamed to roadmap_theme (UPG-660). The bare \"theme\" was the only domain-unprefixed theme among strategic_theme / content_theme / feedback_theme; it grabbed the unqualified word and read as interchangeable with strategic_theme. roadmap_theme makes the customer-problem roadmap grouping explicit and consistent across the four. Same property surface (theme_scope / priority); no property migration needed.',\n    },\n  ],\n\n  '0.7.0': [\n    // (since v0.7.0, UPG-571) story_statement → user_story. The v0.2.7 split\n    // correctly separated the templated promise from the engineering work\n    // (task), but renamed the surviving statement half to the coined\n    // `story_statement`. \"User story\" is the universally-recognised industry\n    // term for exactly that artefact, and UPG's value is being the recognisable\n    // canonical vocabulary; the statement is re-canonicalised under\n    // `user_story`. Lifecycle-free, same property surface (as_a / i_want_to /\n    // so_that / text); no property migration required. The paired `task` and\n    // the `task_implements_*` / `epic_specified_by_*` / `*_verified_by_*` /\n    // `test_case_covers_*` edges are renamed in UPG_EDGE_MIGRATIONS['0.7.0'].\n    {\n      from: 'story_statement',\n      to: 'user_story',\n      reason: 'story_statement re-canonicalised to user_story (UPG-571). The v0.2.7 Statement/Implementation split was sound (it extracted the lifecycle-bearing work into `task`), but the coined `story_statement` name raised the adoption barrier; \"user story\" is the industry-standard term for the templated promise. Lifecycle-free, identical property surface (as_a / i_want_to / so_that / text); no property migration needed.',\n    },\n  ],\n\n  '0.4.0': [\n    // (since v0.4.0) hypothesis_claim reverts to hypothesis (the simpler\n    // canonical name (\"claim\" is implied). hypothesis_evidence deprecated\n    // in favour of canonical evidence entity.\n    {\n      from: 'hypothesis_claim',\n      to: 'hypothesis',\n      reason: 'hypothesis_claim renamed back to hypothesis, the canonical name. The \"claim\" suffix was redundant; a hypothesis is a claim by definition. Properties (we_believe / will_result_in / we_know_when / risk_if_wrong / current_confidence) are identical; no property migration required.',\n    },\n    {\n      from: 'hypothesis_evidence',\n      to: 'evidence',\n      reason: 'hypothesis_evidence collapsed into canonical evidence entity. evidence gains evidence_rigor (rigor axis) + evidence_source (source axis) + weight (UPGAssessment) to absorb both property surfaces. Relationship to hypothesis expressed via hypothesis_has_evidence edge.',\n    },\n    // (since v0.4.0) story_task collapsed into canonical task. Audit showed\n    // story_task had no unique properties (estimate absorbed into task), no unique\n    // edges (story_task_implements_story_statement → task_implements_story_statement),\n    // and identical lifecycle (both use WORK_ITEM_TEMPLATE). The additive-vocabulary\n    // rule says: if the second half of a split adds no new shape, reuse the existing\n    // type. The user_story replacement updates from story_task to task, and the\n    // chain collapses.\n    {\n      from: 'story_task',\n      to: 'task',\n      reason: 'story_task collapsed into canonical task. Both use the WORK_ITEM lifecycle, neither carries unique properties (estimate is absorbed into task), and no unique edges (implements_story_statement works on task). When two types share the same shape, the additive-vocabulary rule keeps one.',\n    },\n  ],\n\n  '0.2.8': [\n    // hypothesis decomposes into hypothesis_claim\n    // (P5 templated-statement, the stable belief) + hypothesis_evidence\n    // (P2 scored-assessment, n rows of accruing evidence). Superseded by\n    // the v0.4.0 rename of hypothesis_claim back to hypothesis, which also\n    // collapses hypothesis_evidence into evidence. The 1→1 alias below\n    // is retained for loaders targeting v0.2.8 files; the '0.4.0' aliases\n    // above handle the subsequent hop for any system applying migrations in\n    // version order.\n    {\n      from: 'hypothesis',\n      to: 'hypothesis_claim',\n      reason: 'hypothesis decomposes into hypothesis_claim (templated belief, lifecycle-bearing) + hypothesis_evidence (n rows of accruing evidence, lifecycle-free). Superseded at v0.4.0 by the rename: hypothesis_claim → hypothesis. Apply migrations in version order; a v0.2.8 file will migrate hypothesis → hypothesis_claim → hypothesis, which resolveEntityType collapses to a single hop.',\n    },\n  ],\n\n  '0.1.0': [\n    // ── User layer: pain_point + user_need → need ──────────────────────────\n    {\n      from: 'pain_point',\n      to: 'need',\n      defaults: { valence: 'pain' },\n      reason: 'Consolidated into neutral \"need\" type with valence property. Framework labels provide context-specific display names (Problem in Lean Canvas, Struggle in JTBD, etc.)',\n    },\n    {\n      from: 'user_need',\n      to: 'need',\n      defaults: { valence: 'gap' },\n      reason: 'Consolidated into \"need\" type. user_need was semantically identical to pain_point with different framing.',\n    },\n\n    // ── UX Research: insight consolidation ──────────────────────────────────\n    {\n      from: 'research_insight',\n      to: 'insight',\n      defaults: {},\n      reason: 'Already deprecated. Research insights are insights with research provenance.',\n    },\n    {\n      from: 'finding',\n      to: 'insight',\n      defaults: { insight_level: 'finding' },\n      reason: 'Already deprecated. Findings are insights at the \"finding\" level.',\n    },\n    {\n      from: 'ux_insight',\n      to: 'insight',\n      defaults: { source_domain: 'ux' },\n      reason: 'UX insights are insights with source_domain=ux. Not a distinct type.',\n    },\n    {\n      from: 'highlight',\n      to: 'observation',\n      defaults: { is_highlighted: true },\n      reason: 'Already deprecated. Highlights are flagged observations.',\n    },\n\n    // ── Metrics consolidation ──────────────────────────────────────────────\n    {\n      from: 'kpi',\n      to: 'metric',\n      defaults: { designation: 'kpi' },\n      reason: 'KPI is a metric role (designation), not a distinct type. Metric.designation already supports \"kpi\".',\n    },\n    {\n      from: 'north_star_metric',\n      to: 'metric',\n      defaults: { designation: 'north_star' },\n      reason: 'Already deprecated. North star is a metric designation.',\n    },\n    {\n      from: 'input_metric',\n      to: 'metric',\n      defaults: { designation: 'input' },\n      reason: 'Already deprecated. Input metric is a metric designation.',\n    },\n    {\n      from: 'metric_definition',\n      to: 'metric',\n      reason: 'A metric definition is a metric without implementation. Lifecycle state, not a separate type. (Corrected in v0.26.0: the default previously stamped `has_implementation: false`, a property `metric` has never declared. Dropped rather than declared, because a metric with no live reading simply has no `current_value`, and a boolean restating that would immediately drift from it.)',\n    },\n\n    // ── Experiment consolidation ────────────────────────────────────────────\n    {\n      from: 'ab_test',\n      to: 'experiment_run',\n      defaults: { experiment_type: 'ab_test' },\n      reason: 'A/B test is an experiment_run with method=a_b_test. The run carries actual lift, observed reach, and disposition. retargeted from `experiment` to `experiment_run` (each is a run instance, not a planning artefact).',\n    },\n    {\n      from: 'growth_experiment',\n      to: 'experiment_run',\n      defaults: { experiment_type: 'growth' },\n      reason: 'Growth experiment is an experiment_run in growth context. retargeted from `experiment` to `experiment_run` to give loaders a single retarget hop instead of two-hopping through deprecated `experiment`.',\n    },\n    {\n      from: 'pricing_experiment',\n      to: 'experiment_run',\n      defaults: { experiment_type: 'pricing' },\n      reason: 'Pricing experiment is an experiment_run about pricing. retargeted from `experiment` to `experiment_run` (the run is where the data lives).',\n    },\n\n    // ── Cross-domain consolidations ────────────────────────────────────────\n    {\n      from: 'risk_item',\n      to: 'risk',\n      defaults: { risk_type: 'program' },\n      reason: 'risk_item (Program Mgmt) is identical to risk (Legal). Consolidated onto the single kind axis, `risk_type`. (Corrected in v0.26.0: the default previously named `risk_domain`, a property `risk` has never declared; `program` was added to the `risk_type` enum rather than giving risk a second, drift-prone classification vocabulary.)',\n    },\n    {\n      from: 'security_incident',\n      to: 'incident',\n      defaults: { incident_type: 'security' },\n      reason: 'Security incident is an incident with incident_type=security. Same structure, different context.',\n    },\n    {\n      from: 'defect_report',\n      to: 'support_ticket',\n      defaults: { ticket_type: 'bug' },\n      reason: 'Defect report is a support ticket with ticket_type=bug. Same signal interface. (Corrected: the default previously named `ticket_designation`, a property `support_ticket` has never declared, so every migrated node was stamped with an undeclared field.)',\n    },\n    {\n      from: 'onboarding_flow',\n      to: 'user_flow',\n      defaults: { flow_type: 'onboarding' },\n      reason: 'Onboarding flow is a user flow with flow_type=onboarding. Same structure.',\n    },\n    {\n      from: 'nps_score',\n      to: 'nps_campaign',\n      defaults: {},\n      reason: 'NPS score demoted to a property of nps_campaign, not a standalone entity.',\n    },\n  ],\n\n  // v0.2.6: no 1→1 type renames. The experiment split\n  // is purely additive in v0.2.6 (new entity types `experiment_plan` +\n  // `experiment_run` and 4 new edges). The 1→N split rule for migrating\n  // legacy `experiment` rows lives in UPG_SPLIT_MIGRATIONS['0.2.6'] below.\n  // The 1→1 alias from `experiment` to its canonical replacement is\n  // deferred to v0.2.7 alongside the broader deprecation + edge retarget\n  // pass.\n\n  '0.2.0': [\n    // ── User layer: jtbd → job ──────────────────────────────────────────────\n    {\n      from: 'jtbd',\n      to: 'job',\n      reason: 'Renamed for clarity. \"job\" is the standard JTBD shorthand; \"jtbd\" was the framework acronym used as a type name.',\n    },\n\n    // ── Design layer: how_might_we → design_question ────────────────────────\n    {\n      from: 'how_might_we',\n      to: 'design_question',\n      reason: 'Renamed to a framework-neutral name. \"how_might_we\" was HMW-format specific; design_question covers all design-framing question types.',\n    },\n\n    // ── Decision consolidation ──────────────────────────────────────────────\n    {\n      from: 'design_decision',\n      to: 'decision',\n      defaults: { layer: 'design' },\n      reason: 'design_decision is a decision with layer=design. Consolidated into the single decision type with layer property.',\n    },\n    {\n      from: 'architecture_decision',\n      to: 'decision',\n      defaults: { layer: 'engineering' },\n      reason: 'architecture_decision is a decision with layer=engineering. Consolidated into the single decision type with layer property.',\n    },\n    {\n      from: 'product_decision',\n      to: 'decision',\n      defaults: { layer: 'product' },\n      reason: 'product_decision is a decision with layer=product. Consolidated into the single decision type with layer property.',\n    },\n\n    // ── DevOps: acronym expansions ──────────────────────────────────────────\n    {\n      from: 'sli',\n      to: 'service_level_indicator',\n      reason: 'Expanded from acronym to full name for readability and discoverability.',\n    },\n    {\n      from: 'slo',\n      to: 'service_level_objective',\n      reason: 'Expanded from acronym to full name for readability and discoverability.',\n    },\n    {\n      from: 'sla',\n      to: 'service_level_agreement',\n      reason: 'Expanded from acronym to full name for readability and discoverability.',\n    },\n\n    // ── Business Model: _bm suffix removal ────────────────────────────────\n    {\n      from: 'customer_segment_bm',\n      to: 'market_segment',\n      reason: 'Removed _bm suffix. Originally renamed to target_customer_segment, then consolidated into market_segment in v0.2.0.',\n    },\n    {\n      from: 'channel_bm',\n      to: 'distribution_channel',\n      reason: 'Removed _bm suffix. Renamed to distribution_channel, which is more descriptive than the abbreviation.',\n    },\n\n    // ── Growth domain: disambiguate generic names ──────────────────────────\n    {\n      from: 'campaign',\n      to: 'growth_campaign',\n      reason: 'Too generic; conflicted with marketing_campaign_plan and nps_campaign. Prefixed with growth to clarify domain scope.',\n    },\n    {\n      from: 'segment',\n      to: 'behavioral_segment',\n      reason: 'Too generic; conflicted with market_segment and target_customer_segment. Renamed to behavioral_segment to clarify this is a behaviour-based user slice.',\n    },\n\n    // ── Pricing consolidation ───────────────────────────────────────────\n    {\n      from: 'package',\n      to: 'pricing_tier',\n      reason: 'Package and pricing_tier describe the same concept (the plan a customer buys). Consolidated into pricing_tier as the central pricing entity.',\n    },\n\n    // ── GTM restructure ─────────────────────────────────────────────\n    {\n      from: 'target_customer_segment',\n      to: 'market_segment',\n      reason: 'Target customer segment and market segment describe the same concept, a slice of the addressable market. Consolidated into market_segment.',\n    },\n\n    // ── Content consolidation ───────────────────────────────────────\n    {\n      from: 'internal_doc',\n      to: 'document',\n      reason: 'Internal doc is a document with audience=internal. Consolidated into document with expanded document_type enum.',\n    },\n  ],\n}\n\n// ─── Migration helpers ─────────────────────────────────────────────────────────\n\n/**\n * Compare two semver-style version strings of the form `MAJOR.MINOR.PATCH`.\n *\n * Returns a negative number if `a < b`, zero if `a === b`, positive if `a > b`.\n * Components are compared numerically (e.g. `0.2.11` is greater than `0.2.8`,\n * not less; naive string comparison gets this backwards because `'11' < '8'`\n * lexicographically).\n *\n * Used by every range-filtered migration helper below\n * (`getMigrationMap`, `getAllMigrations`, `getPropertyMigrations`,\n * `getSplitMigrations`, `getUPGEdgeMigrations`, `migrateNodeProperties`).\n *\n * Previously, those helpers used raw string comparison and silently dropped\n * every v0.2.7+v0.2.8 rule once `UPG_VERSION` crossed `0.2.10` fix.\n *\n * @example\n * compareVersions('0.2.8', '0.2.11')  // → negative (0.2.8 < 0.2.11)\n * compareVersions('0.2.11', '0.2.8')  // → positive (0.2.11 > 0.2.8)\n * compareVersions('0.2.0', '0.2.0')   // → 0\n */\nexport function compareVersions(a: string, b: string): number {\n  const pa = a.split('.').map((n) => Number.parseInt(n, 10))\n  const pb = b.split('.').map((n) => Number.parseInt(n, 10))\n  const len = Math.max(pa.length, pb.length)\n  for (let i = 0; i < len; i++) {\n    const da = pa[i] ?? 0\n    const db = pb[i] ?? 0\n    if (Number.isNaN(da) || Number.isNaN(db)) {\n      // Fall back to string comparison for non-numeric components (e.g. pre-release tags).\n      const sa = a.split('.')[i] ?? ''\n      const sb = b.split('.')[i] ?? ''\n      if (sa < sb) return -1\n      if (sa > sb) return 1\n      continue\n    }\n    if (da !== db) return da - db\n  }\n  return 0\n}\n\n/** True if `version` is in the half-open range `(fromVersion, toVersion]`. */\nfunction versionInRange(version: string, fromVersion: string, toVersion: string): boolean {\n  return compareVersions(version, fromVersion) > 0 && compareVersions(version, toVersion) <= 0\n}\n\n/**\n * Build a flat old→new type name map for a specific version upgrade.\n * Used by TYPE_ALIASES and .upg file readers.\n *\n * @example\n * // Upgrading from v0 (pre-UPG) to v0.2.0: collect every type rename.\n * const map = getMigrationMap('0.0.0', '0.2.0')\n * // map.pain_point === 'need'\n * // map.jtbd       === 'job'\n * // map.package    === 'pricing_tier'\n */\nexport function getMigrationMap(\n  fromVersion: string,\n  toVersion: string,\n): Record<string, string> {\n  const map: Record<string, string> = {}\n  // Collect all migrations between fromVersion and toVersion\n  for (const [version, migrations] of Object.entries(UPG_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      for (const m of migrations) {\n        map[m.from] = m.to\n      }\n    }\n  }\n  return map\n}\n\n/**\n * Apply migrations to a single node, converting its type and\n * merging default properties.\n *\n * `T` is the caller's node shape, typically `UPGBaseNode` or a narrower\n * app-specific node type. The constraint (`{ type: string; properties?: ... }`)\n * keeps the function node-library-agnostic so adapters, CLI tools, and test\n * fixtures can all reuse it without coupling to `UPGBaseNode` directly.\n *\n * @example\n * // Legacy deprecated type migrates to its canonical replacement.\n * const legacy = { id: 'n1', type: 'pain_point', properties: { description: 'Onboarding is slow' } }\n * const migrated = migrateNode(legacy, '0.0.0', '0.1.0')\n * // migrated.type               === 'need'\n * // migrated.properties.valence === 'pain'       // merged default\n * // migrated.properties.description === 'Onboarding is slow'  // original preserved\n *\n * @example\n * // Non-deprecated type passes through; return shape preserves T.\n * const healthy = { id: 'n2', type: 'persona', properties: { is_primary: true } }\n * const same = migrateNode(healthy, '0.0.0', '0.1.0')\n * // same === healthy  (referentially unchanged)\n */\nexport function migrateNode<T extends { type: string; properties?: Record<string, unknown> }>(\n  node: T,\n  fromVersion: string,\n  toVersion: string,\n): T {\n  const migrations = getAllMigrations(fromVersion, toVersion)\n  const migration = migrations.find((m) => m.from === node.type)\n  if (!migration) return node\n\n  return {\n    ...node,\n    type: migration.to,\n    properties: {\n      ...migration.defaults,\n      ...node.properties,\n    },\n  }\n}\n\n/**\n * Get all migration entries between two versions.\n */\nfunction getAllMigrations(fromVersion: string, toVersion: string): UPGTypeMigration[] {\n  const result: UPGTypeMigration[] = []\n  for (const [version, migrations] of Object.entries(UPG_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      result.push(...migrations)\n    }\n  }\n  return result\n}\n\n/**\n * Get all deprecated type names (across all versions) as a flat set.\n * Useful for validation warnings.\n *\n * @example\n * const deprecated = getDeprecatedTypes()\n * deprecated.has('pain_point')    // → true (consolidated into 'need')\n * deprecated.has('jtbd')          // → true (renamed to 'job')\n * deprecated.has('persona')       // → false (still canonical)\n */\nexport function getDeprecatedTypes(): Set<string> {\n  const deprecated = new Set<string>()\n  for (const migrations of Object.values(UPG_MIGRATIONS)) {\n    for (const m of migrations) {\n      deprecated.add(m.from)\n    }\n  }\n  return deprecated\n}\n\n// ─── Property migrations ──────────────────────────────────\n//\n// When a type's property surface shifts (drops, renames at the top level,\n// lifts from `properties` to top-level `UPGBaseNode` slots, or self-referential\n// cleanup), `UPGPropertyMigration` records the change so loaders can clean up\n// existing data with one consistent contract instead of each consumer\n// inventing its own rules.\n//\n// History:\n// - (v0.2.2) split `metric`: 14 intra-`properties` drops.\n// - (v0.2.8) drop `hypothesis.properties.we_test_by`.\n// - (v0.2.13) extended to a discriminated union covering top-level\n//   field drift surfaced by Wave 3 dogfood: `lifecycle_status → status`,\n//   `properties.stage → status` lift, self-referential `source_id` /\n//   `source_type` cleanup.\n// - (v0.2.14) widen `rename_top_level` to `outcome` (167 residual\n//   top_level_drift rows in unified-product-graph.upg after v0.2.13 pass).\n//\n// **Discriminated-union contract.** Each rule carries a `kind` discriminator\n// mirroring `UPGEdgeMigration`. The four kinds are\n// orthogonal; a rule does one thing. Compose multiple rules per (version,\n// type) when more than one kind applies.\n\n/**\n * A property-level migration applied at load time.\n *\n * Discriminated by `kind`:\n *\n * - `'drop_props'`: remove keys from `node.properties`. The original\n *   shape; the existing v0.2.2 + v0.2.8 entries use this.\n * - `'rename_top_level'`: rename a top-level `UPGBaseNode` field to a\n *   different top-level field, optionally remapping its value. Used when a\n *   pre-canonical custom field (e.g. `lifecycle_status`) shifts to its\n *   canonical slot (`status`).\n * - `'lift_property_to_top_level'`: move a value from `node.properties` to a\n *   top-level field, optionally remapping. Used when a slot that was\n *   pragmatically stuffed in `properties` graduates to a top-level\n *   `UPGBaseNode` slot (e.g. `properties.stage` → top-level `status`).\n * - `'drop_when_self_referential'`: drop top-level fields whose value\n *   equals the node's own `id` or `type` (or another configured\n *   self-reference). Used to clean up redundant round-trip metadata that's\n *   only meaningful when pointing OUT of the node, not at itself.\n */\nexport type UPGPropertyMigration =\n  | {\n      kind: 'drop_props'\n      /** The entity type whose properties are being migrated. */\n      type: string\n      /** Property keys to drop from `type.properties`. */\n      drop_props: string[]\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n  | {\n      kind: 'rename_top_level'\n      /** The entity type this rule applies to (or `'*'` for all types). */\n      type: string\n      /** Pre-canonical top-level field name. */\n      from: string\n      /** Canonical top-level field name. */\n      to: string\n      /**\n       * Optional value remap from old → new. If unset, the value is copied\n       * verbatim from `from` to `to`. If set, only entries in the map are\n       * remapped; values absent from the map pass through unchanged.\n       */\n      value_map?: Record<string, string>\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n  | {\n      kind: 'lift_property_to_top_level'\n      /** The entity type this rule applies to (or `'*'` for all types). */\n      type: string\n      /** Key inside `properties` that should move to top-level. */\n      from_property: string\n      /** Top-level field that receives the lifted value. */\n      to: string\n      /** Optional value remap from old → new (same semantics as `rename_top_level`). */\n      value_map?: Record<string, string>\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n  | {\n      kind: 'drop_when_self_referential'\n      /** The entity type this rule applies to (or `'*'` for all types). */\n      type: string\n      /**\n       * Top-level fields to inspect. Each is dropped only when its value\n       * equals the node's `id` (for fields named like `*_id`) or `type`\n       * (for fields named like `*_type`); otherwise preserved.\n       */\n      fields: string[]\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n  | {\n      kind: 'remap_property_value'\n      /** The entity type this rule applies to (or `'*'` for all types). */\n      type: string\n      /** Key inside `properties` whose value is being remapped (stays in the bag). */\n      property: string\n      /**\n       * Old to new value remap. Only entries in the map are touched; values\n       * absent from the map pass through unchanged.\n       */\n      value_map: Record<string, string>\n      /**\n       * Optional sibling property to receive the mapped value (a split). When\n       * set, the mapped value is written to `to_property` and `property` is\n       * reset to `reset_value`. Used to separate a conflated axis, e.g. lift a\n       * data_flow orientation value out of `direction` into `orientation`.\n       */\n      to_property?: string\n      /** Value written back to `property` after a split. Required when `to_property` is set. */\n      reset_value?: string\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n  | {\n      /**\n       * Reshape a bare numeric property into a `UPGAssessment` object\n       * (`{ value, label, scale_id }`). For the v0.10.0 property-registry\n       * correction (#43): interfaces that always declared `UPGAssessment` were\n       * generated loosely, so pre-0.10.0 graphs stored a bare number (e.g.\n       * `market_trend.impact: 4`). This wraps that number on its canonical scale,\n       * deriving the qualitative `label` from the scale's points. Idempotent: a\n       * value that is already an object (assessment) passes through untouched.\n       */\n      kind: 'reshape_value_to_assessment'\n      /** The entity type this rule applies to (or `'*'` for all types). */\n      type: string\n      /** Key inside `properties` whose bare number is wrapped (stays in the bag). */\n      property: string\n      /** The assessment scale to label the value on (e.g. `impact_5`, `importance_5`). */\n      scale_id: string\n      /** Human-readable explanation surfaced in load-time warnings. */\n      reason: string\n    }\n\n/**\n * Version-scoped property migrations. Same convention as `UPG_MIGRATIONS`:\n * the key is the version that introduces the migration.\n */\nexport const UPG_PROPERTY_MIGRATIONS: Record<string, UPGPropertyMigration[]> = {\n  // ── v0.35.0: risk.probability → risk.likelihood, STAGED ─────────────────────\n  //\n  // Deliberately EMPTY, and the emptiness is the design rather than an omission.\n  // The rename is staged: `RiskProperties.probability` is kept, marked\n  // `@deprecated since=\"0.35.0\" removeIn=\"1.0.0\"`, and still read. 0.35.0 changes\n  // what writers emit (`likelihood`) and what readers prefer; it changes no\n  // stored bytes, so there is nothing for a load-time rule to do. A graph\n  // written before 0.35.0 carries `probability` and no `likelihood` and reads\n  // correctly — which is what staging BUYS, and a rule here would spend it.\n  //\n  // Three reasons there is no executable rule, in order of weight:\n  //\n  //  1. A staged deprecation that rewrites data is not staged. The point of the\n  //     `epic.estimate` → `effort` pattern this follows is that both names live\n  //     through the window and the consumer chooses; migrating the key on load\n  //     would end the window on the first read and break any reader still\n  //     asking for the old name.\n  //  2. The executable step belongs at the REMOVAL version, not here. That is\n  //     the two-step the `removeIn=\"0.5.0\"` properties followed: declared\n  //     deprecated with a deadline at 0.4.0, dropped by `drop_props` rules in\n  //     the '0.5.0' block below. `probability` is scheduled for the same\n  //     treatment at 1.0.0.\n  //  3. No kind fits, and inventing one would be the larger change. Checked\n  //     against the APPLIER, not just the type union:\n  //       - `drop_props` deletes, which is the 1.0.0 step, not this one.\n  //       - `lift_property_to_top_level` targets `UPGBaseNode`, and `likelihood`\n  //         is a property, not a top-level field.\n  //       - `rename_top_level` renames a top-level field, same mismatch.\n  //       - `remap_property_value` is the near miss and still misses twice: it\n  //         `break`s unless `typeof oldValue === 'string'` (these values are\n  //         `UPGAssessment` objects, or bare numbers in older graphs), and its\n  //         `to_property` split OVERWRITES the source with `reset_value`, which\n  //         is precisely the staging this release is buying.\n  //       - `reshape_value_to_assessment` wraps a bare number on a named scale;\n  //         it does not move a key.\n  //     The edge-side `kind: 'rename'` (UPG_EDGE_MIGRATIONS, e.g. 0.8.0's\n  //     `theme_groups_feature` -> `roadmap_theme_groups_feature`) renames an\n  //     EDGE TYPE across instances and has no property-key analogue. Adding one\n  //     is new spec surface: a ratified decision, not a side effect of one\n  //     property rename.\n  //\n  // The scale moves ride along and need no rule either. `PROPERTY_SCALE_MAP`\n  // resolves `likelihood` to `likelihood_5` (which carries `threat.likelihood`\n  // off `confidence_5` in the same line, since the map is keyed by name) and\n  // `PROPERTY_SCALE_MAP_BY_ENTITY` resolves `risk.impact` to `severity_5`. Both\n  // resolve at READ time, and an assessment only overrides them by PINNING a\n  // `scale_id` on the stored value. Measured across all 36 `.upg` files in the\n  // repo: zero assessments pin a `scale_id` on `likelihood`, `probability` or\n  // `impact`, so there is nothing stamped to re-stamp. One that does pin a\n  // `scale_id` keeps it, by the existing contract.\n  //\n  // What lands at 1.0.0, written down now so it is not rediscovered:\n  //   { kind: 'drop_props', type: 'risk', drop_props: ['probability'],\n  //     reason: '1.0.0: risk.probability was @deprecated since 0.35.0 with\n  //              removeIn=\"1.0.0\"; superseded by `likelihood` on likelihood_5.' }\n  '0.35.0': [],\n  '0.32.0': [\n    // C3 — archive becomes a base-node axis. WorkspaceProperties.archived /\n    // archived_at shipped the orthogonal-archive idea for exactly one type;\n    // field data showed it is general (a tracker held 559 archived-completed\n    // items beside 18 live-completed ones), so the pair moves to UPGBaseNode\n    // and the workspace properties are @deprecated. Lift, not drop: the value\n    // is real and its new home means the same thing.\n    { kind: 'lift_property_to_top_level', type: 'workspace', from_property: 'archived', to: 'archived',\n      reason: '0.32.0: archive generalised from WorkspaceProperties to UPGBaseNode.archived. Same fact, wider home; the workspace property is @deprecated.' },\n    { kind: 'lift_property_to_top_level', type: 'workspace', from_property: 'archived_at', to: 'archived_at',\n      reason: '0.32.0: pairs with the archived lift above. UPGBaseNode.archived_at is the canonical home.' },\n    // C4 — the duplicate label surfaces. TaskProperties.labels and\n    // BugProperties.labels were declared \"applied uniformly across work item\n    // types\" and duplicated base-node `tags` with no consumer anywhere. Three\n    // label surfaces (base tags, per-type tags, per-type labels) is two too\n    // many; grouped labels are classification_axis + classification_value, and\n    // ungrouped ones are `tags`.\n    { kind: 'drop_props', type: 'task', drop_props: ['labels'],\n      reason: '0.32.0: TaskProperties.labels duplicated base-node `tags` and had no consumers. Freeform labels live in `tags`; grouped labels are classification_axis + node_classified_as_classification_value.' },\n    { kind: 'drop_props', type: 'bug', drop_props: ['labels'],\n      reason: '0.32.0: BugProperties.labels duplicated base-node `tags` and had no consumers. Freeform labels live in `tags`; grouped labels are classification_axis + node_classified_as_classification_value.' },\n  ],\n  // ── v0.21.0: UPG-690 D.1 — collapse residual *_status shadows into status ────\n  //\n  // Six `*_status` enum properties that re-encode their entity's own lifecycle\n  // phases (the residual Pattern-D shadows not caught by the 0.15.0 sweep, now\n  // that the entities sit on shared templates). Each is removed; the authored\n  // value LIFTS to UPGBaseNode.status, remapping where the property vocabulary\n  // diverged from the (template) lifecycle. `security_policy.policy_status` was\n  // deliberately EXCLUDED (Captain 2026-07-04): its active/under_review/retired\n  // values are an operational-status axis distinct from its APPROVAL lifecycle\n  // (active != approved) — a distinct-axis keeper, not a shadow.\n  '0.21.0': [\n    { kind: 'lift_property_to_top_level', type: 'brand_identity', from_property: 'brand_stage', to: 'status',\n      reason: 'UPG-690 D.1: brand_stage (exploratory/defined/mature) is an exact shadow of the brand_identity lifecycle. Removed in 0.21.0; lifts to status verbatim.' },\n    { kind: 'lift_property_to_top_level', type: 'deliverable', from_property: 'deliverable_status', to: 'status',\n      value_map: { not_started: 'todo', accepted: 'done', rejected: 'done' },\n      reason: 'UPG-690 D.1: deliverable_status re-encoded the deliverable WORK_ITEM lifecycle. Removed in 0.21.0; lifts to status with not_started -> todo, accepted/rejected -> done.' },\n    { kind: 'lift_property_to_top_level', type: 'press_release', from_property: 'pr_status', to: 'status',\n      value_map: { in_review: 'review', distributed: 'published' },\n      reason: 'UPG-690 D.1: pr_status re-encoded the press_release PUBLISHING lifecycle. Removed in 0.21.0; lifts to status with in_review -> review, distributed -> published.' },\n    { kind: 'lift_property_to_top_level', type: 'program', from_property: 'program_status', to: 'status',\n      value_map: { on_hold: 'paused', cancelled: 'sunset' },\n      reason: 'UPG-690 D.1: program_status re-encoded the program OPERATIONAL lifecycle. Removed in 0.21.0; lifts to status with on_hold -> paused, cancelled -> sunset.' },\n    { kind: 'lift_property_to_top_level', type: 'project', from_property: 'project_status', to: 'status',\n      value_map: { on_hold: 'paused', cancelled: 'sunset' },\n      reason: 'UPG-690 D.1: project_status re-encoded the project OPERATIONAL lifecycle. Removed in 0.21.0; lifts to status with on_hold -> paused, cancelled -> sunset.' },\n    { kind: 'lift_property_to_top_level', type: 'screen', from_property: 'screen_status', to: 'status',\n      reason: 'UPG-690 D.3/Q3: screen flips from MATURITY to a hand-authored build-pipeline lifecycle (draft/in_design/built/shipped/deprecated); screen_status already carried those exact values. Removed in 0.21.0; lifts to status verbatim.' },\n  ],\n  // ── v0.16.0: Pattern G — open-standard data boundary (UPG-691) ───────────────\n  //\n  // The portable graph holds modeling knowledge, not PII, registry filings,\n  // app-session ids, or live vendor figures. These flowed through every export /\n  // snapshot / sync. They are dropped from the body and belong to the hosting\n  // app's identity / tenancy / measurement layer instead (boundary ADR\n  // 2026-06-16-open-standard-data-boundary). The infra-pointer URLs that stay\n  // (repo_url, storage_uri, *.logo_url, help_video.url, ...) were marked\n  // `modifier:'volatile'` in this release rather than dropped, so a consumer\n  // knows they are environment-specific and may be stripped on export. The\n  // `owner: string` -> ownership-edge migration (C1) is a separate, larger wave\n  // (0.17.0). (FALSE-POSITIVE guard kept: specification.spec_url, design_token.value,\n  // vulnerability.cve_id, screen.route, bug.environment -- content / standard refs.)\n  '0.16.0': [\n    { kind: 'drop_props', type: 'person', drop_props: ['email'],\n      reason: 'UPG-691 boundary: person.email is PII for the hosting app identity layer, not the portable graph. Reference the modeled actor by edge; do not inline contact details.' },\n    { kind: 'drop_props', type: 'contact', drop_props: ['email', 'phone'],\n      reason: 'UPG-691 boundary: contact.email / contact.phone are PII for the app identity layer, not the portable graph.' },\n    { kind: 'drop_props', type: 'document', drop_props: ['author'],\n      reason: 'UPG-691 boundary: document.author was free-text name/email (PII). The authoring actor is referenced by edge, not inlined.' },\n    { kind: 'drop_props', type: 'legal_entity', drop_props: ['tax_id', 'registration_number', 'principal_address'],\n      reason: 'UPG-691 boundary: government / registry identifiers belong to the tenancy / records system, not the open interchange body.' },\n    { kind: 'drop_props', type: 'investigation', drop_props: ['session_id'],\n      reason: 'UPG-691 boundary: investigation.session_id is an app-runtime / routing artifact, not modeling knowledge.' },\n    { kind: 'drop_props', type: 'workspace', drop_props: ['slug'],\n      reason: 'UPG-691 boundary: workspace.slug is an app-routing artifact, not modeling knowledge.' },\n    { kind: 'drop_props', type: 'organization', drop_props: ['billing_plan'],\n      reason: 'UPG-691 boundary: organization.billing_plan is a SaaS-account/tenancy concept. Model it via subscription / pricing_tier, not on the structural entity.' },\n    { kind: 'drop_props', type: 'account', drop_props: ['annual_revenue'],\n      reason: 'UPG-691 boundary: account.annual_revenue is live firmographic vendor data. Route live figures to a metric node, not the definition entity.' },\n    { kind: 'drop_props', type: 'ai_model', drop_props: ['cost_per_1k_tokens'],\n      reason: 'UPG-691 boundary: ai_model.cost_per_1k_tokens is a live vendor price. Route it to a metric / record entity, not the model definition.' },\n  ],\n  // ── v0.15.0: Pattern D — collapse *_status shadows into the lifecycle ─────────\n  //\n  // 14 `*_status` enum properties whose values ARE the entity's own lifecycle\n  // phase set (UPG-689 Pattern D, the T1.1 guardrail set). They re-encoded the\n  // lifecycle as a property, shadowing the base-node `status` field that the\n  // lifecycle already drives. Each property is removed and any authored value\n  // LIFTS to `UPGBaseNode.status` (same convention as 0.9.14 kr_status). Two\n  // diverge in vocabulary from their own lifecycle and remap on lift:\n  //   - marketing_channel.channel_status: deprecated -> sunset\n  //   - security_audit.audit_status: scheduled -> planning, in_progress -> active\n  '0.15.0': [\n    { kind: 'lift_property_to_top_level', type: 'agent_definition', from_property: 'agent_status', to: 'status',\n      reason: 'UPG-689 Pattern D: agent_status duplicated the agent_definition lifecycle (testing/active/disabled). Removed in 0.15.0; the authored value lifts to UPGBaseNode.status.' },\n    { kind: 'lift_property_to_top_level', type: 'data_pipeline', from_property: 'pipeline_status', to: 'status',\n      reason: 'UPG-689 Pattern D: pipeline_status duplicated the data_pipeline lifecycle (active/paused/failed/deprecated). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'database_schema', from_property: 'migration_status', to: 'status',\n      reason: 'UPG-689 Pattern D: migration_status duplicated the database_schema lifecycle (current/pending/failed). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'deployment', from_property: 'deploy_status', to: 'status',\n      reason: 'UPG-689 Pattern D: deploy_status duplicated the deployment lifecycle (rolling/success/failure). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'external_api', from_property: 'api_status', to: 'status',\n      reason: 'UPG-689 Pattern D: api_status duplicated the external_api lifecycle (beta/active/deprecated/unavailable). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'feature_area', from_property: 'area_status', to: 'status',\n      reason: 'UPG-689 Pattern D: area_status duplicated the feature_area lifecycle (planned/active/deprecated). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'feature_flag', from_property: 'flag_status', to: 'status',\n      reason: 'UPG-689 Pattern D: flag_status duplicated the feature_flag lifecycle (off/rollout/on). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'objective', from_property: 'objective_status', to: 'status',\n      reason: 'UPG-689 Pattern D: objective_status duplicated the objective lifecycle (active/achieved/deferred). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'outcome', from_property: 'outcome_status', to: 'status',\n      reason: 'UPG-689 Pattern D: outcome_status duplicated the outcome lifecycle (identified/measuring/achieved/abandoned). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'prototype', from_property: 'test_status', to: 'status',\n      reason: 'UPG-689 Pattern D: test_status duplicated the prototype lifecycle (untested/testing/passed/failed). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'review_gate', from_property: 'gate_status', to: 'status',\n      reason: 'UPG-689 Pattern D: gate_status duplicated the review_gate lifecycle (pending/approved/rejected/bypassed). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'roadmap_item', from_property: 'item_status', to: 'status',\n      reason: 'UPG-689 Pattern D: item_status duplicated the roadmap_item lifecycle (planned/in_progress/shipped/deferred). Removed in 0.15.0; lifts to status.' },\n    { kind: 'lift_property_to_top_level', type: 'marketing_channel', from_property: 'channel_status', to: 'status',\n      value_map: { deprecated: 'sunset' },\n      reason: 'UPG-689 Pattern D: channel_status (active/paused/deprecated) re-encoded the marketing_channel lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with deprecated -> sunset.' },\n    { kind: 'lift_property_to_top_level', type: 'security_audit', from_property: 'audit_status', to: 'status',\n      value_map: { scheduled: 'planning', in_progress: 'active' },\n      reason: 'UPG-689 Pattern D: audit_status (scheduled/in_progress/completed) re-encoded the security_audit lifecycle (planning/active/paused/completed/sunset). Removed in 0.15.0; lifts to status with scheduled -> planning, in_progress -> active.' },\n  ],\n  // ── v0.14.0: Pattern E — remove deprecated/ghost properties (UPG-574) ────────\n  //\n  // Properties marked deprecated (some \"Removed in 0.9.1\") that were never\n  // actually removed, plus superseded soft-aliases. The RICE / opportunity-sizing\n  // scoring inputs were framework-scoped from 0.9.0: their value lives on the\n  // `framework_exercise` includes-edge of the rice-scoring / opportunity-sizing\n  // framework, not on the entity. The remaining four are superseded by a sibling\n  // (cause_category, rule_strength, size_estimate, effort). Loaders drop the\n  // stranded keys; the values were never canonical on the entity.\n  '0.14.0': [\n    { kind: 'drop_props', type: 'opportunity', drop_props: ['reach', 'frequency', 'pain', 'opportunity_score'],\n      reason: 'UPG-574: opportunity scoring (reach/frequency/pain/opportunity_score) was framework-scoped from 0.9.0 (opportunity-sizing). Apply the framework and read the value off the framework_exercise edge; the entity props are removed in 0.14.0.' },\n    { kind: 'drop_props', type: 'solution', drop_props: ['reach', 'impact', 'confidence', 'effort', 'rice_score'],\n      reason: 'UPG-574: RICE inputs (reach/impact/confidence/effort) and the computed rice_score were framework-scoped from 0.9.0 (rice-scoring). Apply the framework and read the score off the framework_exercise edge; the entity props are removed in 0.14.0.' },\n    { kind: 'drop_props', type: 'root_cause', drop_props: ['category', 'verified'],\n      reason: 'UPG-574: root_cause.category was a legacy free-form field superseded by the closed-enum cause_category; verified duplicated cause_confidence === confirmed. Both removed in 0.14.0.' },\n    { kind: 'drop_props', type: 'design_guideline', drop_props: ['strictness'],\n      reason: 'UPG-574: design_guideline.strictness was superseded by rule_strength (a richer imperative-force enum). Removed in 0.14.0.' },\n    { kind: 'drop_props', type: 'behavioral_segment', drop_props: ['size'],\n      reason: 'UPG-574: behavioral_segment.size was a v0.2 alias for size_estimate. Removed in 0.14.0; use size_estimate.' },\n    { kind: 'drop_props', type: 'task', drop_props: ['estimate'],\n      reason: 'UPG-574: task.estimate was a story_task-collapse relic that duplicated effort. Removed in 0.14.0; use effort.' },\n  ],\n  // ── v0.12.0: P14 Bucket C — drop the one non-derived denormalized aggregate ──\n  //\n  // The count caches (feature_count, evidence_count, workflow step_count /\n  // agent_count) are KEPT — 0.11.6 marked them `modifier:'derived'` (the\n  // sanctioned \"derived cache\" reframe), so tooling knows to recompute rather\n  // than removing them. `business_model.monetisation_basis` is NOT a count: it's\n  // a categorical rollup of the model's revenue_stream.billing_model children, so\n  // it drops here. `pattern` stays (a chosen archetype, not a rollup).\n  // (customer_health_score.metrics — a metric→value map — is deferred: dropping\n  // it is lossy until the per-metric values move onto the composed_of_metric\n  // edges; tracked as a follow-up.)\n  '0.12.0': [\n    { kind: 'drop_props', type: 'business_model', drop_props: ['monetisation_basis'],\n      reason: 'P14 Bucket C: monetisation_basis is a categorical rollup of the model’s revenue_stream.billing_model children, not a first-class attribute. Drop it; KEEP `pattern` (a chosen archetype).' },\n  ],\n  // ── v0.10.2: market_intelligence number -> assessment reshape ──────────────\n  //\n  // The v0.10.0 property-registry generator fix (#43) corrected several property\n  // types that interfaces already declared as `UPGAssessment` but the generator\n  // had emitted loosely. A pre-0.10.0 graph that stored a bare number for\n  // `market_trend.impact` / `relevance` is now invalid (the schema wants\n  // `{value,label}`). These rules wrap the bare number on its canonical scale so\n  // the migration is one command, not a hand-reshape. The enum tightenings the\n  // same #43 fix surfaced (data_flow.direction, integration_pattern.pattern_type,\n  // api_contract.protocol, service.service_type) already have rules under 0.9.12;\n  // 0.10.2 also makes ALL of them visible to validate_graph (they were applied by\n  // migrate_properties but never surfaced as a fixable drift).\n  '0.10.2': [\n    {\n      kind: 'reshape_value_to_assessment',\n      type: 'market_trend',\n      property: 'impact',\n      scale_id: 'impact_5',\n      reason:\n        'market_trend.impact is a UPGAssessment (impact_5); the 0.10.0 generator fix (#43) tightened it from a bare number. A legacy numeric value wraps to {value,label} on impact_5.',\n    },\n    {\n      kind: 'reshape_value_to_assessment',\n      type: 'market_trend',\n      property: 'relevance',\n      scale_id: 'importance_5',\n      reason:\n        'market_trend.relevance is a UPGAssessment (importance_5); the 0.10.0 generator fix (#43) tightened it from a bare number. A legacy numeric value wraps to {value,label} on importance_5.',\n    },\n  ],\n  // ── v0.9.14: drop the key_result kr_status / status twin (A2) ──────────────\n  //\n  // key_result carried BOTH a lifecycle `status` and a `kr_status` property with\n  // the identical four-value enum (on_track | at_risk | behind | achieved) ==\n  // the KEY_RESULT_LIFECYCLE phases. Two fields, same values: an authoring trap.\n  // The redundant property is removed; the authored health value lifts to the\n  // canonical `UPGBaseNode.status` so a graph that set `kr_status` stays correct.\n  '0.9.14': [\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'key_result',\n      from_property: 'kr_status',\n      to: 'status',\n      reason:\n        'A2 (0.9.14). key_result.kr_status duplicated the lifecycle `status` with the identical enum (on_track | at_risk | behind | achieved). The twin is removed; the authored health value lifts to `UPGBaseNode.status` verbatim.',\n    },\n  ],\n  // ── v0.9.12: technical-domain enum widening + data_flow orientation split ──\n  //\n  // Real authoring outgrew four engineering-domain enums. 0.9.12 widens them\n  // (see properties/domains/engineering.ts) and adds a data_flow `orientation`\n  // axis distinct from `direction` (cardinality). These rules dual-read the\n  // legacy values so graphs authored before 0.9.12 stay valid on load:\n  //   - data_flow.direction inbound/outbound/internal -> properties.orientation,\n  //     and direction resets to unidirectional (all three were one-way).\n  //   - integration_pattern.pattern_type \"data sync\" -> data_sync,\n  //     backend_client -> client_library.\n  //   - service.service_type backend -> api (use the new `cli` for CLI tools).\n  //   - api_contract.protocol HTTP -> REST, HTTP/SSE -> the new SSE value.\n  '0.9.12': [\n    {\n      kind: 'remap_property_value',\n      type: 'data_flow',\n      property: 'direction',\n      value_map: { inbound: 'inbound', outbound: 'outbound', internal: 'internal' },\n      to_property: 'orientation',\n      reset_value: 'unidirectional',\n      reason:\n        'data_flow.direction conflated cardinality with orientation; the orientation values move to the new `orientation` property and direction resets to `unidirectional` (0.9.12).',\n    },\n    {\n      kind: 'remap_property_value',\n      type: 'integration_pattern',\n      property: 'pattern_type',\n      value_map: { 'data sync': 'data_sync', backend_client: 'client_library' },\n      reason:\n        'integration_pattern.pattern_type widened in 0.9.12; legacy \"data sync\" snake-cases to data_sync and backend_client collapses to client_library.',\n    },\n    {\n      kind: 'remap_property_value',\n      type: 'service',\n      property: 'service_type',\n      value_map: { backend: 'api' },\n      reason:\n        'service.service_type `backend` is too generic to canonise; normalised to `api` in 0.9.12 (use `cli` for command-line tools).',\n    },\n    {\n      kind: 'remap_property_value',\n      type: 'api_contract',\n      property: 'protocol',\n      value_map: { HTTP: 'REST', 'HTTP/SSE': 'SSE' },\n      reason: 'api_contract.protocol normalised in 0.9.12: HTTP maps to REST and HTTP/SSE maps to the new SSE value.',\n    },\n  ],\n  // ── v0.8.0: UPG-574 deprecated-property removal pass ───────────────────\n  //\n  // The seven properties tagged `@deprecated since v0.4.0` that survived the\n  // v0.5.0 hygiene pass are removed from the spec in v0.8.0 (a breaking\n  // release). Five of the seven already carry a migration:\n  //   - `task.task_status` / `bug.bug_status` lift to `UPGBaseNode.status`\n  //     (see `UPG_PROPERTY_MIGRATIONS['0.4.0']`, values identical).\n  //   - `learning.metric` drops in favour of the `learning_observed_on_metric`\n  //     edge (see `UPG_PROPERTY_MIGRATIONS['0.5.0']`).\n  // The two remaining property surfaces are migrated here:\n  //   - `evidence.strength` (simple `strong | moderate | weak` enum) is\n  //     dropped in favour of `weight: UPGAssessment` (scale `weight_5pt`).\n  //     Authors carrying the legacy key should copy the value to `weight`\n  //     before applying this migration: `strong → 5`, `moderate → 3`,\n  //     `weak → 1`, with the old word preserved in `weight.label`.\n  //   - `story_task.estimate` / `.effort` / `.priority` drop. `story_task`\n  //     itself is deprecated (`UPG_MIGRATIONS['0.4.0']` renames it to the\n  //     canonical `task`); the type rename copies every property verbatim,\n  //     so the values survive on `task` (`TaskProperties.estimate` /\n  //     `.effort` / `.priority`, all live). This rule removes the residue\n  //     from any node still typed `story_task` at migration time.\n  '0.8.0': [\n    {\n      kind: 'drop_props',\n      type: 'evidence',\n      drop_props: ['strength'],\n      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.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'story_task',\n      drop_props: ['estimate', 'effort', 'priority'],\n      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.',\n    },\n  ],\n\n  // ── v0.5.0: UPG-509 deprecation hygiene pass ───────────────────────────\n  //\n  // Properties tagged `@deprecated since=\"0.4.0\" removeIn=\"0.5.0\"` (and the\n  // sibling prose `since v0.4.0, removed in v0.5.0` aliases) are removed\n  // from `UPG_PROPERTY_SCHEMA` in v0.5.0. This block migrates existing graphs\n  // that still carry the values:\n  //\n  //   1. `*_status` lifecycle properties → lift to `UPGBaseNode.status` per\n  //      `status-convention.md` Rule 1. Value maps preserve every legacy\n  //      lifecycle phase verbatim; the property and the canonical slot used\n  //      the same enum, so the lift is lossless.\n  //   2. Free-text properties replaced by canonical edges (`winner`,\n  //      `customer`, `consumers`, `recipients`, `metric`) → drop. The\n  //      structural relationship now lives on a typed edge (e.g.\n  //      `learning_observed_on_metric`); the free-text echo is residue.\n  //   3. Properties renamed to a sibling field (`root_cause.confidence` →\n  //      `cause_confidence`; `metric.frequency` → `cadence`;\n  //      `key_activity.frequency` / `symptom.frequency` /\n  //      `churn_reason.frequency` → `frequency_rating` + `frequency_count` +\n  //      `frequency_period`) → drop. The canonical replacements were added\n  //      in v0.4.0; the legacy field is removed here.\n  //\n  // Rule kinds chosen per case: `lift_property_to_top_level` for status\n  // lifts, `drop_props` for both free-text-replaced-by-edge and\n  // renamed-to-sibling cases. The CHANGELOG entry for v0.5.0 enumerates the\n  // full mapping.\n  '0.5.0': [\n    // ── 1. Status lifts (lift_property_to_top_level) ─────────────────────\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'strategic_theme',\n      from_property: 'theme_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). theme_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status` per status-convention.md Rule 1. Values (`proposed | active | achieved | abandoned`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'assumption',\n      from_property: 'validation_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). validation_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`unvalidated | validating | validated | invalidated`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'service',\n      from_property: 'service_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). service_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`development | staging | production | deprecated`) preserved verbatim. The separate `lifecycle` field (service maturity) stays as a typed property.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'api_contract',\n      from_property: 'contract_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). api_contract.contract_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`draft | published | deprecated`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'technical_debt_item',\n      from_property: 'debt_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). debt_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`identified | acknowledged | scheduled | in_progress | resolved`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'investigation',\n      from_property: 'investigation_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). investigation_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`open | active | paused | resolved | abandoned`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'fix',\n      from_property: 'fix_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). fix_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`planned | in_progress | deployed | verified | reverted`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'contract',\n      from_property: 'contract_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). legal.contract.contract_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`draft | in_review | signed | active | expired | terminated`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'threat_model',\n      from_property: 'threat_model_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). threat_model_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`draft | in_review | approved | stale`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'role',\n      from_property: 'role_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). role_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`active | backfilling | dormant | retired`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'team_okr',\n      from_property: 'okr_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). okr_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`draft | committed | active | complete | abandoned`) preserved verbatim.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'partnership',\n      from_property: 'partnership_status',\n      to: 'status',\n      reason: 'UPG-509 (v0.5.0). partnership_status was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; canonical lifecycle belongs on `UPGBaseNode.status`. Values (`proposed | active | paused | ended`) preserved verbatim.',\n    },\n    // ── 2. Free-text replaced by canonical edges (drop_props) ────────────\n    {\n      kind: 'drop_props',\n      type: 'model_comparison',\n      drop_props: ['winner'],\n      reason: 'UPG-509 (v0.5.0). model_comparison.winner was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; the canonical edge `model_comparison_winner_is_ai_model` carries the structural relationship. Free-text echo dropped on load.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'service_level_agreement',\n      drop_props: ['customer'],\n      reason: 'UPG-509 (v0.5.0). service_level_agreement.customer was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; the canonical edge `service_level_agreement_covers_account` carries the counterparty relationship. Free-text echo dropped on load.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'data_product',\n      drop_props: ['consumers'],\n      reason: 'UPG-509 (v0.5.0). data_product.consumers was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; the canonical edge `data_product_consumed_by_service` carries each consumer. Free-text echo dropped on load.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'report',\n      drop_props: ['recipients'],\n      reason: 'UPG-509 (v0.5.0). report.recipients was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; the canonical edge `report_distributed_to_team` carries each recipient. Free-text echo dropped on load.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'learning',\n      drop_props: ['metric'],\n      reason: 'UPG-509 (v0.5.0). learning.metric was `@deprecated removeIn=\"0.5.0\"` since v0.4.0; the canonical edge `learning_observed_on_metric` carries the metric relationship. Free-text echo dropped on load.',\n    },\n    // ── 3. Renamed-to-sibling properties (drop_props) ────────────────────\n    {\n      kind: 'drop_props',\n      type: 'root_cause',\n      drop_props: ['confidence'],\n      reason: 'UPG-509 (v0.5.0). root_cause.confidence was `@deprecated removed in v0.5.0` since v0.4.0; renamed to `cause_confidence` to disambiguate from the spec-wide `UPGAssessment` confidence axis. Values are unchanged; authors that still carry the legacy key should copy the value to `cause_confidence` before applying this migration. The migration drops the residue.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'metric',\n      drop_props: ['frequency'],\n      reason: 'UPG-509 (v0.5.0). metric.frequency (typed `MetricFrequency`) was `@deprecated removed in v0.5.0` since v0.4.0; replaced by `cadence` (typed `Cadence`). Migration: `realtime → continuous`, all other values map 1:1 to the cadence enum. Authors that still carry the legacy key should copy the value to `cadence` (with the realtime→continuous remap) before applying this migration.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'key_activity',\n      drop_props: ['frequency'],\n      reason: 'UPG-509 (v0.5.0). key_activity.frequency (typed `string`) was `@deprecated removed in v0.5.0` since v0.4.0; replaced by the canonical 4-way frequency split (`cadence`, `frequency_count` + `frequency_period`, or `frequency_rating`).',\n    },\n    {\n      kind: 'drop_props',\n      type: 'symptom',\n      drop_props: ['frequency'],\n      reason: 'UPG-509 (v0.5.0). symptom.frequency was `@deprecated removed in v0.5.0` since v0.4.0; replaced by `frequency_rating` (qualitative tier), `frequency_count` + `frequency_period` (exact rate), or the `Cadence` primitive. Migration of legacy values: `once → rare`, `sporadic → occasional`, `frequent → regular`, `constant → constant`.',\n    },\n    {\n      kind: 'drop_props',\n      type: 'churn_reason',\n      drop_props: ['frequency'],\n      reason: 'UPG-509 (v0.5.0). churn_reason.frequency (typed `number`) was `@deprecated removed in v0.5.0` since v0.4.0; replaced by `frequency_count` + `frequency_period` (exact rate over a known period) or `frequency_rating` (qualitative tier).',\n    },\n  ],\n\n  '0.4.0': [\n    // deprecate task_status + bug_status; lift to UPGBaseNode.status.\n    // Values are identical to the canonical lifecycle phases; no value_map needed.\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'task',\n      from_property: 'task_status',\n      to: 'status',\n      value_map: {\n        todo:        'todo',\n        in_progress: 'in_progress',\n        in_review:   'in_review',\n        done:        'done',\n      },\n      reason: 'task_status duplicates UPGBaseNode.status. Canonical lifecycle field wins; property-level shadow deprecated. Values are identical; lift is lossless.',\n    },\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'bug',\n      from_property: 'bug_status',\n      to: 'status',\n      value_map: {\n        open:        'open',\n        in_progress: 'in_progress',\n        fixed:       'fixed',\n        verified:    'verified',\n        wont_fix:    'wont_fix',\n      },\n      reason: 'bug_status duplicates UPGBaseNode.status. Canonical lifecycle field wins; property-level shadow deprecated. Values are identical; lift is lossless.',\n    },\n  ],\n\n  '0.2.8': [\n    {\n      kind: 'drop_props',\n      type: 'hypothesis',\n      drop_props: [\n        // `we_test_by` described the experimental\n        // method legacy hypothesis rows intended to use to test themselves.\n        // That concept now lives on the paired `experiment_plan.method`\n        // (hypothesis_claim links to the plan via\n        // `hypothesis_claim_requires_experiment_plan`). Drop the property\n        // from legacy nodes during migration; the value can be reconstructed\n        // by walking the requires_experiment_plan edge if present, or\n        // discarded if no plan was created.\n        'we_test_by',\n      ],\n      reason: 'hypothesis decomposes into hypothesis_claim + hypothesis_evidence. The legacy `we_test_by` property described experimental method, which now lives on the linked experiment_plan.method via the canonical `hypothesis_claim_requires_experiment_plan` edge.',\n    },\n  ],\n\n  '0.2.2': [\n    {\n      kind: 'drop_props',\n      type: 'metric',\n      drop_props: [\n        // Moved to metric_quality_assessment. Authors should create\n        // a sibling assessment node and link via\n        // metric_assessed_by_metric_quality_assessment.\n        'quality_correlated', 'quality_actionable', 'quality_sensitive',\n        'quality_comparative', 'quality_related', 'quality_score',\n        'proxy_reason', 'proxy_confidence', 'proxy_alternatives',\n        // Out of canonical spec scope; tool runtime state belongs in\n        // tool-extension namespaces (e.g. extensions.entopo.metric_sync).\n        'external_metric_id', 'external_query', 'last_synced_at',\n        'sync_status', 'sync_error',\n      ],\n      reason: 'metric decomposed. Quality/proxy props moved to metric_quality_assessment; sync state moved to tool extensions.',\n    },\n  ],\n\n  // ── top-level field drift surfaced by Wave 3 dogfood ──────────────\n  // The two production graphs in this repo (`.upg/entopo.upg` and\n  // `.upg/unified-product-graph.upg`) carry pre-canonical node shapes.\n  // The four rules below close the drift catalog:\n  //\n  //   1. `product.properties.stage` (pre-canonical \"idea / build /\n  //      launched\" enum stuffed inside properties) → top-level `status`\n  //      (canonical `UPGProductStage` enum: `concept | validation | build |\n  //      beta | launch | growth | mature | maintenance | sunset`).\n  //   2. `product.lifecycle_status` (pre-canonical top-level field with\n  //      \"draft / active\" values) → top-level `status` with the same\n  //      `UPGProductStage` enum.\n  //   3. Self-referential `source_id` / `source_type` cleanup; these\n  //      fields are for round-trip from external imports (Notion / Linear);\n  //      when they self-reference, they're redundant noise.\n  //   4. `hypothesis_claim.properties.status` → top-level `status` with\n  //      cross-lifecycle remap to the v0.2.8 hypothesis_claim phases.\n  //\n  // **Conflict resolution within v0.2.13:** rules apply in registry\n  // order; for any node carrying BOTH `properties.stage` and\n  // `lifecycle_status`, rule #1 lifts first (writes `status` from\n  // `stage`), then rule #2 renames lifecycle_status onto `status`,\n  // overwriting. `lifecycle_status` wins on conflict because it was\n  // the more explicit field at write time (top-level slot >\n  // properties-bag slot in pre-v0.2 authoring practice). Production\n  // graphs typically carry only one of the two; the conflict path is\n  // theoretical but documented for predictability.\n  '0.2.13': [\n    // 1. (RETIRED in 0.9.10, batch-6 #33) The product `properties.stage` →\n    //    top-level `status` lift is superseded by UPG-654/661, which\n    //    re-canonicalised a product node's lifecycle stage to\n    //    `properties.stage` — a distinct 9-phase `UPGProductStage` axis,\n    //    separate from the generic top-level `status` other entities use. The\n    //    entire runtime (create_product, get_graph_digest, get_product_context,\n    //    completeness, header-sync) reads and writes `properties.stage`, so\n    //    lifting it to `status` made a freshly-created product read as\n    //    `property_drift` against its own validator (a tool emitting drift its\n    //    validator immediately flags). Legacy \"idea\"-style values are still\n    //    normalised on READ by `coerceProductStage`, so retiring the lift loses\n    //    no cleanup. Decision: 2026-06-10-product-stage-properties-canonical.md.\n    // 2. Rename top-level lifecycle_status → status (with value remap).\n    {\n      kind: 'rename_top_level',\n      type: 'product',\n      from: 'lifecycle_status',\n      to: 'status',\n      value_map: {\n        // Pre-canonical lifecycle_status values from early v0.1 product-node\n        // shape. Mapped to the closest UPGProductStage equivalent.\n        draft: 'concept',\n        active: 'launch',\n        // archived/retired-style values map to sunset; explicit when seen.\n        archived: 'sunset',\n        retired: 'sunset',\n      },\n      reason: '`lifecycle_status` was a pre-canonical top-level field; `UPGBaseNode.status` is the canonical lifecycle slot. Values remapped to UPGProductStage phases.',\n    },\n    // 3. Drop self-referential source_id / source_type (universal cleanup).\n    {\n      kind: 'drop_when_self_referential',\n      type: '*',\n      fields: ['source_id', 'source_type'],\n      reason: '`source_id` / `source_type` are round-trip metadata for entities imported from external systems (Notion, Linear). When they equal the node\\'s own id/type, they\\'re redundant self-references; drop with no information loss.',\n    },\n    // 4. Lift hypothesis_claim properties.status → top-level status with\n    //    cross-lifecycle value remap. Pre-Wave-3\n    //    hypothesis nodes carried lifecycle phase in `properties.status`\n    //    using the old `untested → testing → resolved` enum. The Wave 3\n    //    `migrate_type(hypothesis → hypothesis_claim)` pass renamed the\n    //    entity type but left the property bag untouched; legacy\n    //    phase values now sit in the wrong slot AND need remapping to\n    //    the new hypothesis_claim lifecycle. Value map mirrors the\n    //    UPG_SPLIT_MIGRATIONS['0.2.8'] routing table for consistency\n    //    (untested→drafted, testing→active, resolved→active fallback,\n    //    validated/invalidated identity).\n    //\n    //    NOTE: type stays 'hypothesis_claim' (not 'hypothesis') because\n    //    nodes are typed as hypothesis_claim at v0.2.13 time. The v0.4.0\n    //    entity migration later renames hypothesis_claim → hypothesis;\n    //    by then the property lift has already been applied.\n    {\n      kind: 'lift_property_to_top_level',\n      type: 'hypothesis_claim',\n      from_property: 'status',\n      to: 'status',\n      value_map: {\n        // Legacy hypothesis lifecycle (pre-v0.2.8) → new hypothesis_claim\n        // lifecycle (`drafted → active → validated | invalidated | archived`).\n        untested: 'drafted',\n        testing: 'active',\n        // `resolved` was the legacy terminal phase; without an explicit\n        // core_state we treat it as `active` (pending the next refinement)\n        // matching the UPG_SPLIT_MIGRATIONS routing.\n        resolved: 'active',\n        // Already-canonical phase values pass through unchanged via the\n        // value_map identity entries (explicit so the doctrine is auditable\n        // and partial maps don't surprise readers).\n        drafted: 'drafted',\n        active: 'active',\n        validated: 'validated',\n        invalidated: 'invalidated',\n        archived: 'archived',\n      },\n      reason: 'pre-Wave-3 hypothesis nodes carried lifecycle phase inside `properties.status` using the legacy `untested → testing → resolved` enum. Wave 3 migrate_type(hypothesis → hypothesis_claim) renamed the entity but left the property untouched. This rule lifts the value to top-level `status` and remaps to the canonical hypothesis_claim lifecycle (drafted | active | validated | invalidated | archived), mirroring UPG_SPLIT_MIGRATIONS[\"0.2.8\"] routing: untested→drafted, testing→active, resolved→active.',\n    },\n  ],\n\n  // ── v0.2.14: widen `rename_top_level` to cover `outcome` ──────\n  //\n  // After running `migrate_properties` against unified-product-graph.upg\n  // post-v0.2.13, 167 `outcome` nodes remained with a top-level\n  // `lifecycle_status` field. The v0.2.13 `rename_top_level` rule was\n  // scoped to `type: 'product'` only. The existing DSL stores `type` as a\n  // plain string (no array variant), so a parallel rule for `outcome` is the\n  // minimum-viable fix; no engine or type changes required.\n  '0.2.14': [\n    {\n      kind: 'rename_top_level',\n      type: 'outcome',\n      from: 'lifecycle_status',\n      to: 'status',\n      value_map: {\n        // Same value map as the v0.2.13 `product` rule; pre-canonical\n        // lifecycle_status values from the v0.1 era.\n        draft: 'concept',\n        active: 'launch',\n        archived: 'sunset',\n        retired: 'sunset',\n      },\n      reason: '`outcome` nodes carried the same pre-canonical `lifecycle_status` top-level field as `product` (v0.1 era). Widening to `outcome` closes the final 167 top_level_drift rows in unified-product-graph.upg. Parallel rule used because the DSL `type` field is a plain string; minimum-viable fix with no engine change.',\n    },\n  ],\n}\n\n/**\n * A single property-migration change applied during `migrateNodeProperties`.\n * Surfaced for one-warning-per-file logging and structured load-time reports.\n */\nexport type UPGPropertyMigrationChange =\n  | { kind: 'dropped'; key: string }\n  | { kind: 'renamed_top_level'; from: string; to: string; value_changed: boolean }\n  | { kind: 'lifted_to_top_level'; from_property: string; to: string; value_changed: boolean }\n  | { kind: 'self_ref_dropped'; field: string }\n  | { kind: 'remapped_property_value'; property: string; to_property?: string; value_changed: boolean }\n  | { kind: 'reshaped_to_assessment'; property: string; scale_id: string; value: number; label: string }\n\n/**\n * Apply property migrations to a single node. Returns the (possibly new) node\n * along with a structured list of changes so callers can emit warnings,\n * generate audit reports, or skip nodes that don't need rewrites.\n *\n * Operates on top-level `UPGBaseNode` fields (`status`, `lifecycle_status`,\n * `source_id`, `source_type`, …) AND on intra-`properties` keys, dispatching\n * by rule `kind`. The four kinds are orthogonal; rules apply in registry\n * order within a version, and across versions in `(fromVersion, toVersion]`.\n *\n * Backward-compat helper: callers that only care about dropped property keys\n * can derive the old `dropped: string[]` shape via\n * `changes.filter(c => c.kind === 'dropped').map(c => c.key)`.\n *\n * @example\n * // drop_props (unchanged behaviour):\n * const m = { type: 'metric', properties: { quality_score: 4, current_value: 100 } }\n * const { node, changes } = migrateNodeProperties(m, '0.2.0', '0.2.2')\n * // node.properties        === { current_value: 100 }\n * // changes[0].kind        === 'dropped'; changes[0].key === 'quality_score'\n *\n * @example\n * // lift_property_to_top_level:\n * const p = { id: 'p1', type: 'product', properties: { stage: 'idea' } }\n * const { node } = migrateNodeProperties(p, '0.2.12', '0.2.13')\n * // node.status               === 'concept'  (lifted + remapped)\n * // node.properties.stage     === undefined  (removed from properties)\n *\n * @example\n * // drop_when_self_referential (wildcard type):\n * const x = { id: 'x1', type: 'product', source_id: 'x1', source_type: 'product' }\n * const { changes } = migrateNodeProperties(x, '0.2.12', '0.2.13')\n * // changes contains { kind: 'self_ref_dropped', field: 'source_id' }\n * // changes contains { kind: 'self_ref_dropped', field: 'source_type' }\n */\nexport function migrateNodeProperties<\n  T extends {\n    id?: string\n    type: string\n    status?: unknown\n    properties?: Record<string, unknown>\n    [key: string]: unknown\n  },\n>(\n  node: T,\n  fromVersion: string,\n  toVersion: string,\n): { node: T; changes: UPGPropertyMigrationChange[] } {\n  const changes: UPGPropertyMigrationChange[] = []\n  // Mutable working copy; only realised back into the result when changes occur.\n  let workingNode: Record<string, unknown> = { ...node }\n  let mutated = false\n\n  for (const [version, migrations] of Object.entries(UPG_PROPERTY_MIGRATIONS)) {\n    if (!versionInRange(version, fromVersion, toVersion)) continue\n    for (const m of migrations) {\n      if (m.type !== '*' && m.type !== node.type) continue\n\n      switch (m.kind) {\n        case 'drop_props': {\n          const props = workingNode.properties as Record<string, unknown> | undefined\n          if (!props) break\n          const next: Record<string, unknown> = {}\n          let dirty = false\n          for (const [k, v] of Object.entries(props)) {\n            if (m.drop_props.includes(k)) {\n              changes.push({ kind: 'dropped', key: k })\n              dirty = true\n            } else {\n              next[k] = v\n            }\n          }\n          if (dirty) {\n            workingNode.properties = next\n            mutated = true\n          }\n          break\n        }\n\n        case 'rename_top_level': {\n          if (!(m.from in workingNode)) break\n          const oldValue = workingNode[m.from]\n          let newValue = oldValue\n          if (m.value_map && typeof oldValue === 'string' && oldValue in m.value_map) {\n            newValue = m.value_map[oldValue]\n          }\n          // value_changed reflects actual value mutation, not whether the map\n          // had an entry for the input. Identity entries (`'drafted' → 'drafted'`)\n          // surface as value_changed: false; the structural change (top-level\n          // rename) is signalled by the change kind itself.\n          const valueChanged = newValue !== oldValue\n          workingNode[m.to] = newValue\n          delete workingNode[m.from]\n          mutated = true\n          changes.push({ kind: 'renamed_top_level', from: m.from, to: m.to, value_changed: valueChanged })\n          break\n        }\n\n        case 'lift_property_to_top_level': {\n          const props = workingNode.properties as Record<string, unknown> | undefined\n          if (!props || !(m.from_property in props)) break\n          const oldValue = props[m.from_property]\n          let newValue = oldValue\n          if (m.value_map && typeof oldValue === 'string' && oldValue in m.value_map) {\n            newValue = m.value_map[oldValue]\n          }\n          // See `rename_top_level` above: value_changed reflects mutation,\n          // not map-presence. Identity entries surface as false.\n          const valueChanged = newValue !== oldValue\n          workingNode[m.to] = newValue\n          // Remove the property from the inner bag.\n          const nextProps: Record<string, unknown> = {}\n          for (const [k, v] of Object.entries(props)) {\n            if (k !== m.from_property) nextProps[k] = v\n          }\n          workingNode.properties = nextProps\n          mutated = true\n          changes.push({ kind: 'lifted_to_top_level', from_property: m.from_property, to: m.to, value_changed: valueChanged })\n          break\n        }\n\n        case 'drop_when_self_referential': {\n          for (const field of m.fields) {\n            if (!(field in workingNode)) continue\n            const value = workingNode[field]\n            // Heuristic: *_id matches the node's id; *_type matches the node's type.\n            const isSelfRef =\n              (field.endsWith('_id') && typeof value === 'string' && value === node.id) ||\n              (field.endsWith('_type') && typeof value === 'string' && value === node.type)\n            if (isSelfRef) {\n              delete workingNode[field]\n              mutated = true\n              changes.push({ kind: 'self_ref_dropped', field })\n            }\n          }\n          break\n        }\n\n        case 'remap_property_value': {\n          const props = workingNode.properties as Record<string, unknown> | undefined\n          if (!props || !(m.property in props)) break\n          const oldValue = props[m.property]\n          if (typeof oldValue !== 'string' || !(oldValue in m.value_map)) break\n          const mapped = m.value_map[oldValue]\n          const nextProps: Record<string, unknown> = { ...props }\n          if (m.to_property) {\n            // Split: move the mapped value to a sibling property, reset the original.\n            nextProps[m.to_property] = mapped\n            nextProps[m.property] = m.reset_value ?? mapped\n            changes.push({ kind: 'remapped_property_value', property: m.property, to_property: m.to_property, value_changed: true })\n          } else {\n            nextProps[m.property] = mapped\n            changes.push({ kind: 'remapped_property_value', property: m.property, value_changed: mapped !== oldValue })\n          }\n          workingNode.properties = nextProps\n          mutated = true\n          break\n        }\n\n        case 'reshape_value_to_assessment': {\n          const props = workingNode.properties as Record<string, unknown> | undefined\n          if (!props || !(m.property in props)) break\n          const oldValue = props[m.property]\n          // Idempotent: an existing assessment object (or any non-numeric value)\n          // passes through untouched. Accept a bare number or a numeric string.\n          let num: number | null = null\n          if (typeof oldValue === 'number' && Number.isFinite(oldValue)) num = oldValue\n          else if (typeof oldValue === 'string' && oldValue.trim() !== '' && Number.isFinite(Number(oldValue))) {\n            num = Number(oldValue)\n          }\n          if (num === null) break\n          const label = getScale(m.scale_id)?.points.find((p) => p.value === num)?.label ?? String(num)\n          const nextProps: Record<string, unknown> = {\n            ...props,\n            [m.property]: { value: num, label, scale_id: m.scale_id },\n          }\n          workingNode.properties = nextProps\n          mutated = true\n          changes.push({ kind: 'reshaped_to_assessment', property: m.property, scale_id: m.scale_id, value: num, label })\n          break\n        }\n      }\n    }\n  }\n\n  if (!mutated) return { node, changes }\n  return { node: workingNode as T, changes }\n}\n\n/**\n * Returns every property migration entry between two versions; useful for\n * load-time warning generation and audit reports.\n */\nexport function getPropertyMigrations(\n  fromVersion: string,\n  toVersion: string,\n): UPGPropertyMigration[] {\n  const result: UPGPropertyMigration[] = []\n  for (const [version, migrations] of Object.entries(UPG_PROPERTY_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      result.push(...migrations)\n    }\n  }\n  return result\n}\n\n// ─── 1→N split migrations ───────────────────────────────────\n//\n// When an entity type is **decomposed** into multiple canonical types (not\n// renamed (1→1) and not just losing properties (UPG_PROPERTY_MIGRATIONS) but\n// genuinely split into N entities linked by canonical edges), `UPGSplitMigration`\n// records the rule. First use: experiment → experiment_plan + experiment_run.\n//\n// **Rule shape: status-routed split (the only `kind` defined today):**\n//\n// ```\n// {\n//   kind: 'status_routed',\n//   from: 'experiment',\n//   status_property: 'status',                  // property to read on source\n//   produces: [\n//     { ref: 'plan', type: 'experiment_plan', keep_props: [...], defaults: {...} },\n//     { ref: 'run',  type: 'experiment_run',  keep_props: [...], defaults: {...} },\n//   ],\n//   routing: {\n//     'draft':     { spawn: ['plan'],          plan: { defaults: { status: 'drafted' } } },\n//     'planned':   { spawn: ['plan'],          plan: { defaults: { status: 'scheduled' } } },\n//     'running':   { spawn: ['plan', 'run'],   plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'in_progress' } } },\n//     'analysing': { spawn: ['plan', 'run'],   plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'in_progress' } } },\n//     'done':      { spawn: ['plan', 'run'],   plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'complete' } } },\n//     'cancelled': { spawn: ['plan'],          plan: { defaults: { status: 'cancelled' } } },\n//     'aborted':   { spawn: ['plan', 'run'],   plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'aborted' } } },\n//   },\n//   edges: [\n//     { source_ref: 'plan', target_ref: 'run', type: 'experiment_plan_ran_as_experiment_run', when: 'both_spawned' },\n//   ],\n//   reason: '...',\n// }\n// ```\n//\n// **Consumer contract.** A loader/migration tool reads the rule, looks up\n// the source node's `status_property` value, finds the matching `routing`\n// entry, and emits one new node per `spawn` ref + the listed `edges` whose\n// `when` condition is satisfied. Each spawned node:\n//\n// 1. Inherits id strategy: `keep_props` named as `'__id'` preserves source\n//    id; otherwise a new uuid is generated. The first spawned ref keeps the\n//    source id by default (so legacy references survive).\n// 2. Inherits `keep_props` from source.properties (typed-string keys to\n//    copy).\n// 3. Receives `defaults` merged after the keep, so route-specific defaults\n//    win over source values when the field is route-determined (e.g. status).\n//\n// **Why it lives in spec, not in the MCP server.** The rule is a contract,\n// not a runtime. Putting the rule data in `@unified-product-graph/core` lets every consumer\n// (mcp-server's `migrate_type` tool, the LSP, adapters, the CLI) execute\n// the same translation. Runtime consumers implement the engine that walks\n// this data on the MCP side; tests in `@unified-product-graph/core` validate the rule shape.\n\n/** A single produced target within a 1→N split. */\nexport interface UPGSplitTarget {\n  /** Local name (referenced by routing + edges within this rule). */\n  ref: string\n  /** Canonical entity type to spawn. */\n  type: string\n  /** Property keys copied from source.properties. Use `'__id'` to inherit source id. */\n  keep_props?: readonly string[]\n  /** Defaults merged after keep_props (route-specific defaults win). */\n  defaults?: Record<string, unknown>\n}\n\n/** Per-target route plan: what to spawn and what overrides apply. */\nexport interface UPGSplitRouteTarget {\n  /** Route-specific defaults merged on top of UPGSplitTarget.defaults. */\n  defaults?: Record<string, unknown>\n}\n\n/** A single routing rule keyed by source status value. */\nexport interface UPGSplitRoute {\n  /** Which target refs to spawn for this status. */\n  spawn: readonly string[]\n  /**\n   * Per-target route overrides. Keys must match `produces[].ref` for\n   * targets in `spawn`.\n   */\n  [targetRef: string]: UPGSplitRouteTarget | readonly string[] | undefined\n}\n\n/** A canonical edge to emit between spawned targets, gated by a condition. */\nexport interface UPGSplitEdge {\n  /** Source target ref (from `produces`). */\n  source_ref: string\n  /** Target target ref (from `produces`). */\n  target_ref: string\n  /** Edge type key (must exist in UPG_EDGE_CATALOG). */\n  type: string\n  /**\n   * When to emit the edge.\n   *\n   * - `'both_spawned'`: only emit if both source_ref and target_ref were\n   *   spawned by the routing rule.\n   * - `'always'`: emit unconditionally (rare; only valid if both refs\n   *   appear in every routing entry's `spawn`).\n   */\n  when: 'both_spawned' | 'always'\n}\n\n/** A status-routed 1→N split migration rule. */\nexport interface UPGSplitMigration {\n  /** Discriminator. Only one kind today. */\n  kind: 'status_routed'\n  /** The deprecated source type being decomposed. */\n  from: string\n  /** Property name on source.properties whose value drives routing. */\n  status_property: string\n  /** The N canonical types this rule produces. */\n  produces: readonly UPGSplitTarget[]\n  /** Per-status routing: keys are values of source[status_property]. */\n  routing: Record<string, UPGSplitRoute>\n  /** Edges to emit between spawned targets. */\n  edges: readonly UPGSplitEdge[]\n  /** Human-readable explanation surfaced in load-time warnings. */\n  reason: string\n}\n\n/**\n * Version-scoped 1→N split migrations. Same convention as `UPG_MIGRATIONS`:\n * the key is the version that introduces the migration.\n */\nexport const UPG_SPLIT_MIGRATIONS: Record<string, UPGSplitMigration[]> = {\n  '0.2.6': [\n    // (split 1) experiment → experiment_plan + experiment_run.\n    {\n      kind: 'status_routed',\n      from: 'experiment',\n      status_property: 'status',\n      produces: [\n        {\n          ref: 'plan',\n          type: 'experiment_plan',\n          keep_props: [\n            // Plan-shape fields from the legacy experiment.\n            '__id', 'method', 'sample_size', 'expected_lift', 'expected_lift_unit',\n          ],\n          defaults: {},\n        },\n        {\n          ref: 'run',\n          type: 'experiment_run',\n          keep_props: [\n            // Run-shape fields from the legacy experiment.\n            'actual_lift', 'start_date', 'end_date',\n          ],\n          defaults: {},\n        },\n      ],\n      routing: {\n        // Pre-run statuses → plan only.\n        draft:     { spawn: ['plan'],        plan: { defaults: { status: 'drafted' } } },\n        planned:   { spawn: ['plan'],        plan: { defaults: { status: 'scheduled' } } },\n        cancelled: { spawn: ['plan'],        plan: { defaults: { status: 'cancelled' } } },\n        // In-flight statuses → plan + run, plan settles to approved.\n        running:   { spawn: ['plan', 'run'], plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'in_progress' } } },\n        analysing: { spawn: ['plan', 'run'], plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'in_progress' } } },\n        // Terminal statuses → plan (approved) + run (terminal).\n        done:      { spawn: ['plan', 'run'], plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'complete' } } },\n        aborted:   { spawn: ['plan', 'run'], plan: { defaults: { status: 'approved' } }, run: { defaults: { status: 'aborted' } } },\n      },\n      edges: [\n        {\n          source_ref: 'plan',\n          target_ref: 'run',\n          type: 'experiment_plan_ran_as_experiment_run',\n          when: 'both_spawned',\n        },\n      ],\n      reason:\n        'The legacy `experiment` type bundled plan-shape (method, projected reach, success criteria) with run-shape (actual lift, outcome, disposition). The seven status values divided into pre-run (draft/planned/cancelled, plan only), in-flight (running/analysing, plan + run), and terminal (done/aborted, plan + run with run terminal). The plan id keeps the source id so legacy references survive; the run gets a fresh id.',\n    },\n  ],\n\n  '0.2.7': [\n    // (split 2) user_story → story_statement + story_task.\n    //\n    // Always-spawn-both shape (no status routing; every user_story\n    // produces exactly one statement + one task linked by `implements`).\n    // The statement carries the \"as-a / i-want / so-that\" templated\n    // promise (lifecycle-free); the task carries the lifecycle and\n    // estimation/assignment fields.\n    //\n    // Every legacy user_story.status value maps to a story_task.status\n    // in the WORK_ITEM template; the statement remains lifecycle-free.\n    //\n    //   user_story.status  → story_task.status\n    //   draft              → todo\n    //   ready              → todo (acceptance criteria refined; not yet started)\n    //   in_progress        → in_progress\n    //   done               → done\n    {\n      kind: 'status_routed',\n      from: 'user_story',\n      status_property: 'status',\n      produces: [\n        {\n          ref: 'task',\n          type: 'task',\n          keep_props: [\n            // Task-shape fields from the legacy user_story.\n            '__id', 'estimate', 'effort', 'priority',\n          ],\n          defaults: {},\n        },\n        {\n          ref: 'statement',\n          type: 'story_statement',\n          keep_props: [\n            // Statement-shape fields (the templated promise).\n            'as_a', 'i_want_to', 'so_that', 'text',\n          ],\n          defaults: {},\n        },\n      ],\n      routing: {\n        // Every legacy status spawns both. The statement is lifecycle-free\n        // (no status); only the task takes a status.\n        draft:       { spawn: ['task', 'statement'], task: { defaults: { status: 'todo' } } },\n        ready:       { spawn: ['task', 'statement'], task: { defaults: { status: 'todo' } } },\n        in_progress: { spawn: ['task', 'statement'], task: { defaults: { status: 'in_progress' } } },\n        done:        { spawn: ['task', 'statement'], task: { defaults: { status: 'done' } } },\n      },\n      edges: [\n        {\n          source_ref: 'task',\n          target_ref: 'statement',\n          type: 'task_implements_story_statement',\n          when: 'both_spawned',\n        },\n      ],\n      reason:\n        'The legacy `user_story` type bundled the templated \"As X, I want Y so Z\" promise (a stable design artefact) with the engineering work to deliver it (a lifecycle-bearing task). Every legacy row produces 1 statement + 1 task linked by `implements`. The task id keeps the source id (legacy references survive); the statement gets a derived id. Statement is lifecycle-free; task uses the WORK_ITEM template.',\n    },\n  ],\n\n  '0.2.8': [\n    // (split 3) hypothesis → hypothesis_claim + hypothesis_evidence.\n    //\n    // **Always-spawn-claim, never-spawn-evidence-from-legacy** shape.\n    // Legacy hypothesis rows only carried the belief properties\n    // (we_believe / will_result_in / we_know_when / we_test_by); they\n    // never carried inline evidence; evidence was always external,\n    // attached via the dropped `evidence_supports_hypothesis` edge from\n    // `evidence` rows. So the migration is conceptually a 1→1 rename plus\n    // a property cleanup (drop we_test_by, which is about experimental\n    // method, which now lives on experiment_plan via\n    // `hypothesis_claim_requires_experiment_plan`).\n    //\n    // The split rule is registered in UPG_SPLIT_MIGRATIONS for symmetry\n    // with the other splits and to allow future tools that want to spawn\n    // evidence from richer legacy data shapes; the inline applySplit()\n    // runner produces a single claim by default.\n    //\n    // The legacy `untested → testing → resolved (validated|invalidated)`\n    // status enum maps to claim lifecycle: untested → drafted, testing →\n    // active, resolved → validated|invalidated based on the resolved\n    // core_state. archived has no legacy equivalent (claim-specific).\n    {\n      kind: 'status_routed',\n      from: 'hypothesis',\n      status_property: 'status',\n      produces: [\n        {\n          ref: 'claim',\n          type: 'hypothesis',\n          keep_props: [\n            // Statement-shape fields preserved byte-for-byte.\n            '__id', 'we_believe', 'will_result_in', 'we_know_when',\n          ],\n          defaults: {},\n        },\n      ],\n      routing: {\n        untested:    { spawn: ['claim'], claim: { defaults: { status: 'drafted' } } },\n        testing:     { spawn: ['claim'], claim: { defaults: { status: 'active' } } },\n        // legacy `resolved` had two core_states (validated/invalidated); the\n        // routing key matches the resolved core_state directly when present\n        // (loaders emit those as the status value).\n        validated:   { spawn: ['claim'], claim: { defaults: { status: 'validated' } } },\n        invalidated: { spawn: ['claim'], claim: { defaults: { status: 'invalidated' } } },\n        // Catch-all for `resolved` without a core_state; treat as active\n        // pending the resolver call to decide validated/invalidated.\n        resolved:    { spawn: ['claim'], claim: { defaults: { status: 'active' } } },\n      },\n      // No edges emitted; the supports/refutes/derived_from edges all\n      // attach hypothesis_evidence rows that legacy hypothesis nodes did\n      // NOT have. Evidence migration is consumer-driven (Entopo/MCP can\n      // walk the dropped `evidence_supports_hypothesis` edges and spawn\n      // hypothesis_evidence rows; but that's adapter logic, not spec\n      // migration data).\n      edges: [],\n      reason:\n        'Legacy hypothesis rows carry the belief properties; the claim preserves them byte-for-byte. The we_test_by property drops (it described experimental method, which now lives on the linked experiment_plan via hypothesis_claim_requires_experiment_plan). Evidence rows are not spawned from legacy hypothesis data; legacy hypothesis never carried inline evidence. Consumers walking dropped `evidence_supports_hypothesis` edges may opt to spawn hypothesis_evidence rows post-migration, but that\\'s out-of-band adapter logic.',\n    },\n  ],\n}\n\n/**\n * Get all 1→N split migrations between two versions.\n *\n * @example\n * const splits = getSplitMigrations('0.2.5', '0.2.6')\n * // splits[0].from === 'experiment'\n * // splits[0].produces.length === 2\n */\nexport function getSplitMigrations(\n  fromVersion: string,\n  toVersion: string,\n): UPGSplitMigration[] {\n  const result: UPGSplitMigration[] = []\n  for (const [version, migrations] of Object.entries(UPG_SPLIT_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      result.push(...migrations)\n    }\n  }\n  return result\n}\n\n// ─── Scalar → edge promotions (P14 conformance) ─────────────────────\n//\n// When a scalar property holds the *identity of a first-class entity* — one\n// you would query, aggregate, or compare across instances — principle P14\n// (\"Foreign Keys Are Edges\") says it should be a canonical edge, not a string.\n// `UPGScalarToEdgeMigration` records the lossless promotion: find-or-create the\n// referenced entity by title, link it with the canonical edge, then (usually)\n// drop the now-redundant scalar.\n//\n// **Why a new migration family (not a `UPGPropertyMigration`).** The property\n// union is consumed by `migrateNodeProperties`, which is per-node and stateless\n// — it cannot see sibling nodes or mint edges. Minting a target node + an edge\n// is a **graph-level** operation, like `UPGSplitMigration`. So this is a sibling\n// graph-level family: declared here as a versioned contract; applied by a\n// graph-aware consumer (`UPGFileStore.applyScalarToEdgeMigrations`, the CLI, or\n// any adapter that walks this data). Tests in `@unified-product-graph/core`\n// validate the rule SHAPE (every edge/entity type referenced exists); the SDK\n// owns the apply ENGINE and its round-trip tests.\n//\n// **Lossless (Path B), idempotent, reversible.** The scalar's value becomes (or\n// links to) a real node — nothing is discarded. Re-running links/mints nothing\n// new (title already indexed, edge already present). A pre-apply snapshot makes\n// it reversible.\n\n/**\n * Promote a scalar property that names a first-class entity into a canonical edge.\n * Graph-level (mints/links nodes) — NOT applied by `migrateNodeProperties`.\n */\nexport interface UPGScalarToEdgeMigration {\n  /** Source entity type carrying the scalar. */\n  from_type: string\n  /** Property key holding the entity identity (inside `properties`, or top-level if `top_level`). */\n  scalar_property: string\n  /** Whether the scalar lives at top-level instead of inside `properties`. */\n  top_level?: boolean\n  /** Canonical target entity type to find-or-create. */\n  target_type: string\n  /** Canonical edge to create. Must exist in `UPG_EDGE_CATALOG`. */\n  edge_type: string\n  /**\n   * Edge orientation. Default `false`: the `from_type` node is the edge SOURCE\n   * (`from → target`). `true`: the resolved target entity is the edge source\n   * (`target → from`) — use when an EXISTING edge's canonical direction runs\n   * target_type → from_type (e.g. `acquisition_channel_runs_growth_campaign`,\n   * whose scalar lives on `growth_campaign`).\n   */\n  reverse?: boolean\n  /** How to resolve an existing target before minting: normalized title (default) or exact id. */\n  target_match?: 'title' | 'id'\n  /** Default properties merged onto a freshly-minted target (e.g. `{ designation: 'north_star' }`). */\n  target_defaults?: Record<string, unknown>\n  /** `string[]` scalars (e.g. `success_metrics`) → one edge per element. */\n  multi?: boolean\n  /** Drop the scalar after linking. `true` for orphans/shadows; `false` to keep an actor display-cache. */\n  drop_scalar: boolean\n  /** Human-readable explanation surfaced in load-time warnings + changelog. */\n  reason: string\n}\n\n/**\n * Version-scoped scalar→edge promotions. Same convention as `UPG_MIGRATIONS` /\n * `UPG_SPLIT_MIGRATIONS`: the key is the version that introduces the rule.\n */\nexport const UPG_SCALAR_TO_EDGE_MIGRATIONS: Record<string, UPGScalarToEdgeMigration[]> = {\n  '0.32.0': [\n    // C2 — assignment gets its own edge, superseding the 0.12.0 rules that\n    // routed task/bug `assignee` into node_owned_by_person.\n    //\n    // WHY THIS IS A REVERSAL AND NOT A GAP-FILL. 0.12.0 ruled that an assignee\n    // is an owner. Assignment has a time interval and an exclusivity that\n    // ownership does not, and a real board ran 85% unassigned while every item\n    // was owned — a state one edge cannot express.\n    //\n    // WHY EXISTING EDGES ARE NOT REWRITTEN. A node_owned_by_person edge on a\n    // task is indistinguishable by inspection from a genuine ownership edge, so\n    // a blanket rename would silently reclassify real facts. Measured population\n    // across every graph in the originating workspace was ~zero, which makes the\n    // cost of leaving them nil and the cost of guessing a wrong fact.\n    //\n    // user_story is included here and was MISSING from 0.12.0 entirely, though\n    // it has carried `assignee` since 0.20.0.\n    { from_type: 'task', scalar_property: 'assignee', target_type: 'person', edge_type: 'node_assigned_to_person', drop_scalar: false,\n      reason: 'P14 actor: the assignee is a first-class person (\"every task assigned to this person\"). Assignment is not ownership: it has an interval and an exclusivity that ownership lacks, so it links node_assigned_to_person, superseding the 0.12.0 node_owned_by_person rule. Display string kept.' },\n    { from_type: 'bug', scalar_property: 'assignee', target_type: 'person', edge_type: 'node_assigned_to_person', drop_scalar: false,\n      reason: 'P14 actor: same as task. Supersedes the 0.12.0 node_owned_by_person rule. Display string kept.' },\n    { from_type: 'user_story', scalar_property: 'assignee', target_type: 'person', edge_type: 'node_assigned_to_person', drop_scalar: false,\n      reason: 'P14 actor: user_story has carried `assignee` since 0.20.0 and had no promotion rule at all; an asymmetry with task and bug that this closes. Display string kept.' },\n  ],\n  '0.12.0': [\n    // ── Bucket A1 — orphan scalars (no edge existed): add edge + migrate + drop ──\n    {\n      from_type: 'business_model', scalar_property: 'north_star_metric',\n      target_type: 'metric', edge_type: 'business_model_guided_by_metric',\n      target_match: 'title', target_defaults: { designation: 'north_star' },\n      drop_scalar: true,\n      reason:\n        'P14: the optimised metric is a first-class entity you query across business models (\"which models optimise for this metric\"), not a label. Mint metric{designation:north_star} + link via business_model_guided_by_metric; drop the orphan string.',\n    },\n    // NOTE: revenue_stream.forecast is NOT promoted — its JSDoc (\"Free-text\n    // forecast or projection\") is narrative prose, not a ref to a forecast\n    // entity. The additive revenue_stream_projected_by_forecast edge exists for\n    // an explicit stream→forecast link; the free-text field stays.\n    { from_type: 'metric', scalar_property: 'data_source', target_type: 'data_source', edge_type: 'metric_fed_by_data_source', drop_scalar: true,\n      reason: 'P14: the data source feeding a metric is queryable across metrics (\"everything fed by this source\"); promote the string to a metric_fed_by_data_source edge.' },\n    { from_type: 'hallucination_report', scalar_property: 'root_cause', target_type: 'root_cause', edge_type: 'hallucination_report_has_root_cause', drop_scalar: true,\n      reason: 'P14: a root_cause is a first-class entity reused across reports; link it rather than restating the cause as a string.' },\n    // NOTE: prompt_version.template is NOT promoted — its JSDoc (\"Template body\n    // with variable placeholders\") is the prompt CONTENT, not a ref to a\n    // prompt_template entity. The additive prompt_version_child_of_prompt_template\n    // edge exists for an explicit version→template link; the content field stays.\n    { from_type: 'model_comparison', scalar_property: 'model_ids', target_type: 'ai_model', edge_type: 'model_comparison_compares_ai_model', multi: true, drop_scalar: true,\n      reason: 'P14: the models being compared are first-class ai_model entities; one compares edge per model replaces the id-string list.' },\n    { from_type: 'launch', scalar_property: 'success_metrics', target_type: 'metric', edge_type: 'launch_measured_by_metric', multi: true, drop_scalar: true,\n      reason: 'P14: success metrics are first-class metric entities measured across launches; one measured_by edge per metric replaces the string list.' },\n    // NOTE: user_story.as_a is NOT promoted — it is a load-bearing field of the\n    // user_story → story_statement split (the \"As a <persona>\" templated promise),\n    // and the value is often a role descriptor, not a persona node. Left in place.\n    { from_type: 'wireframe', scalar_property: 'screen_name', target_type: 'screen', edge_type: 'wireframe_depicts_screen', drop_scalar: true,\n      reason: 'P14: the depicted screen is a first-class entity; link it via wireframe_depicts_screen rather than naming it in a string.' },\n    { from_type: 'service_level_indicator', scalar_property: 'metric_name', target_type: 'metric', edge_type: 'service_level_indicator_measures_metric', drop_scalar: true,\n      reason: 'P14: the SLI’s metric is a first-class entity; link it via service_level_indicator_measures_metric rather than naming it in a string.' },\n    { from_type: 'agent_definition', scalar_property: 'model_ref', target_type: 'ai_model', edge_type: 'agent_definition_uses_ai_model', drop_scalar: true,\n      reason: 'P14: the model an agent uses is a first-class ai_model entity (\"every agent on this model\"); promote the ref string to a uses edge.' },\n    { from_type: 'privacy_policy', scalar_property: 'regulations', target_type: 'compliance_requirement', edge_type: 'privacy_policy_governs_compliance_requirement', multi: true, drop_scalar: true,\n      reason: 'P14: each regulation is a first-class compliance_requirement entity tracked across policies; one governs edge per requirement replaces the string list.' },\n    { from_type: 'a11y_annotation', scalar_property: 'target_component', target_type: 'design_component', edge_type: 'a11y_annotation_targets_design_component', drop_scalar: true,\n      reason: 'P14: the annotated component is a real design_component entity; link it so accessibility coverage rolls up by component.' },\n    { from_type: 'metric_quality_assessment', scalar_property: 'proxy_alternatives', target_type: 'metric', edge_type: 'metric_quality_assessment_considers_proxy_metric', multi: true, drop_scalar: true,\n      reason: 'P14: proxy alternatives are first-class metric entities; one considers_proxy edge per metric replaces the name list.' },\n    { from_type: 'ai_experiment', scalar_property: 'foundation_model', target_type: 'ai_model', edge_type: 'ai_experiment_based_on_ai_model', drop_scalar: true,\n      reason: 'P14: the foundation model is a first-class ai_model entity reused across experiments; promote the string to a based_on edge.' },\n    { from_type: 'rebuttal', scalar_property: 'evidence_refs', target_type: 'evidence', edge_type: 'rebuttal_supported_by_evidence', multi: true, drop_scalar: true,\n      reason: 'P14: each evidence ref is a first-class evidence entity; one supported_by edge per item replaces the ref-string list.' },\n    { from_type: 'bug', scalar_property: 'affected_version', target_type: 'release', edge_type: 'bug_observed_in_release', drop_scalar: true,\n      reason: 'P14: the affected version is a first-class release entity (\"every bug in this release\"); promote the version string to an observed_in edge.' },\n    { from_type: 'vulnerability', scalar_property: 'affected_package', target_type: 'library_dependency', edge_type: 'vulnerability_affects_library_dependency', drop_scalar: true,\n      reason: 'P14: the affected package is a first-class library_dependency entity; link it so vulnerabilities roll up by dependency.' },\n    { from_type: 'a11y_issue', scalar_property: 'discovered_in', target_type: 'screen', edge_type: 'a11y_issue_found_in_screen', drop_scalar: true,\n      reason: 'P14: the screen an issue was found in is a real screen entity; link it so issues roll up by screen rather than naming it in a string.' },\n    { from_type: 'team_okr', scalar_property: 'cascade_from', target_type: 'team_okr', edge_type: 'team_okr_cascades_from_team_okr', drop_scalar: true,\n      reason: 'P14: a cascaded OKR points at its parent OKR (a real entity); the cascade is a self-referential edge, not a name string.' },\n    { from_type: 'agent_session', scalar_property: 'tools_invoked', target_type: 'agent_skill', edge_type: 'agent_session_invoked_agent_skill', multi: true, drop_scalar: true,\n      reason: 'P14: invoked tools are first-class agent_skill entities tracked across sessions; one invoked edge per skill replaces the string list.' },\n    { from_type: 'agent_task', scalar_property: 'tools', target_type: 'agent_skill', edge_type: 'agent_task_uses_agent_skill', multi: true, drop_scalar: true,\n      reason: 'P14: the tools a task uses are first-class agent_skill entities; one uses edge per skill replaces the string list.' },\n    { from_type: 'participant', scalar_property: 'segment', target_type: 'behavioral_segment', edge_type: 'participant_belongs_to_behavioral_segment', drop_scalar: true,\n      reason: 'P14: a participant’s segment is a first-class behavioral_segment entity queried across studies; promote the string to a belongs_to edge.' },\n    { from_type: 'classification_axis', scalar_property: 'owner_product', target_type: 'product', edge_type: 'classification_axis_owned_by_product', target_match: 'id', drop_scalar: true,\n      reason: 'P14: the product that owns an axis is a first-class entity; link it via classification_axis_owned_by_product. The scalar holds a product id, so match by id (no mint).' },\n\n    // ── Bucket A2 — shadow scalars (the canonical edge ALREADY exists): backfill + drop ──\n    { from_type: 'growth_campaign', scalar_property: 'channels_targeted', target_type: 'acquisition_channel', edge_type: 'acquisition_channel_runs_growth_campaign', reverse: true, multi: true, drop_scalar: true,\n      reason: 'P14 shadow: the acquisition_channel_runs_growth_campaign edge already exists (channel→campaign). Backfill any string-only channels as edges, then drop the drift-prone list.' },\n    { from_type: 'journey_step', scalar_property: 'touchpoint', target_type: 'touchpoint', edge_type: 'touchpoint_occurs_in_journey_step', reverse: true, drop_scalar: true,\n      reason: 'P14 shadow: the touchpoint_occurs_in_journey_step edge already exists (touchpoint→journey_step) and the field was @deprecated 0.9.9. Backfill + finish the drop.' },\n    { from_type: 'decision', scalar_property: 'superseded_by', target_type: 'decision', edge_type: 'decision_superseded_by_decision', drop_scalar: true,\n      reason: 'P14 shadow: the decision_superseded_by_decision edge already exists. Backfill the superseding decision as an edge, then drop the reference string.' },\n    { from_type: 'subscription', scalar_property: 'plan_name', target_type: 'pricing_tier', edge_type: 'subscription_subscribes_to_pricing_tier', drop_scalar: true,\n      reason: 'P14 shadow: the subscription_subscribes_to_pricing_tier edge already exists. Backfill the plan as a pricing_tier edge, then drop the name string.' },\n  ],\n  '0.12.4': [\n    // ── Bucket B — actor-as-string (ADDITIVE: add the ownership edge, KEEP the display string) ──\n    // Per the scalar-vs-edge ADR display-cache rule (2026-06-16) and T3.1 (reuse the\n    // polymorphic node_owned_by_* family; do NOT mint typed actor edges). `drop_scalar`\n    // is FALSE for every entry: the string stays as a human-readable display-cache, and\n    // the edge makes \"everything owned by X\" queryable across instances. OPT-IN — consumers\n    // run promote_scalars_to_edges when they want the edges; nothing is forced on upgrade.\n    // person-vs-team is the field-level call (ratified 2026-06-16): org units + durable\n    // platform/components → team (9); work items, authored artifacts, and DRIs → person.\n    // Two single-string participant fields (threat_model.participants, ceremony.participants)\n    // are intentionally NOT here: a free-text name list cannot be promoted to one edge\n    // without guessing — they are re-doc'd as display-cache only.\n\n    // ── owned by a team (org units + durable platform/components) ──\n    { from_type: 'feature_area', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: a feature area is owned by a team; link node_owned_by_team so \"everything this team owns\" is queryable. Display string kept as a cache.' },\n    { from_type: 'bounded_context', scalar_property: 'team_owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: the owning team is a first-class entity; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'service', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: Backstage-style service ownership rolls up by team; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'product_area', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: a product area is an org unit owned by a team; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'api_contract', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: an API contract is a service-interface component owned by the team that owns the service (Backstage); link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'database_schema', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: a database schema is a data component owned by the team responsible for it; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'design_system', scalar_property: 'maintainer', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: a design system is a shared platform maintained by a team; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'service_level_agreement', scalar_property: 'owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: an SLA is a service-provider-side commitment owned by a team; link node_owned_by_team. Display string kept as a cache.' },\n    { from_type: 'key_activity', scalar_property: 'operational_owner', target_type: 'team', edge_type: 'node_owned_by_team', drop_scalar: false,\n      reason: 'P14 actor: the operationally accountable owner of a recurring activity is a team; link node_owned_by_team. Display string kept as a cache.' },\n\n    // ── owned by a person (DRIs, work items, authored artifacts; the string is a name, handle, or email) ──\n    { from_type: 'strategic_theme', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the theme owner is a first-class person; link node_owned_by_person so cross-theme ownership is queryable. Display string kept.' },\n    { from_type: 'initiative', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the initiative owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'strategic_pillar', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the pillar owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'metric', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the metric owner is a first-class person (\"every metric this person owns\"); link node_owned_by_person. Display string kept.' },\n    { from_type: 'data_domain', scalar_property: 'steward', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the data steward is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'partnership', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the partnership owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'key_resource', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the resource owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'document', scalar_property: 'author', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the author is a first-class person (\"every document by this author\"); link node_owned_by_person. Display string kept.' },\n    { from_type: 'outcome', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the outcome owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'feature', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the feature owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'epic', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the epic owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'release', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the release owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    // NOTE (0.32.0): the task/bug `assignee` rules that lived here are SUPERSEDED\n    // by the '0.32.0' block below, which routes them to node_assigned_to_person.\n    // They are removed rather than left to double-run: two rules over one scalar\n    // would mint the person once and link it twice, under two verbs that now mean\n    // different things. Graphs promoted before 0.32.0 keep the ownership edges\n    // they were given — see the 0.32.0 block for why those are not rewritten.\n    { from_type: 'roadmap', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the roadmap owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'journey_step', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the journey-step owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'design_concept', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the design-concept owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'technical_debt_item', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the debt-item owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'feature_flag', scalar_property: 'owner', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the flag owner is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'deployment', scalar_property: 'deployer', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the deployer is a first-class person (\"every deployment by this person\"); link node_owned_by_person. Display string kept.' },\n    { from_type: 'investigation', scalar_property: 'lead_investigator', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the lead investigator is a first-class person; link node_owned_by_person. Display string kept.' },\n    { from_type: 'department', scalar_property: 'leader', target_type: 'person', edge_type: 'node_owned_by_person', drop_scalar: false,\n      reason: 'P14 actor: the department leader is a first-class person; link node_owned_by_person. Display string kept.' },\n\n    // ── owned by people (multi: string[] of names) ──\n    { from_type: 'decision', scalar_property: 'decision_makers', target_type: 'person', edge_type: 'node_owned_by_person', multi: true, drop_scalar: false,\n      reason: 'P14 actor: each decision-maker is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache.' },\n    { from_type: 'review_gate', scalar_property: 'required_approvers', target_type: 'person', edge_type: 'node_owned_by_person', multi: true, drop_scalar: false,\n      reason: 'P14 actor: each required approver is a first-class person; one node_owned_by_person edge per name. Display list kept as a cache.' },\n  ],\n}\n\n/**\n * Get all scalar→edge promotions between two versions. Mirrors `getSplitMigrations`.\n *\n * @example\n * const rules = getScalarToEdgeMigrations('0.11.6', '0.12.0')\n * // rules[0].from_type === 'business_model'\n */\nexport function getScalarToEdgeMigrations(\n  fromVersion: string,\n  toVersion: string,\n): UPGScalarToEdgeMigration[] {\n  const result: UPGScalarToEdgeMigration[] = []\n  for (const [version, migrations] of Object.entries(UPG_SCALAR_TO_EDGE_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      result.push(...migrations)\n    }\n  }\n  return result\n}\n\n// ─── Edge type migrations ───────────────────────────────────────────\n//\n// When a canonical edge key is renamed or dropped, `UPG_EDGE_MIGRATIONS`\n// records the rule. Mirrors the discriminated-union shape used by\n// `UPG_MIGRATIONS` and `UPG_PROPERTY_MIGRATIONS`: each version key maps to\n// an array of rules; each rule carries a required `reason` quoting the\n// originating CHANGELOG section so load-time warnings and changelog\n// generation share one canonical source.\n//\n// **Composition with node migration.** `UPG_EDGE_MIGRATIONS` runs *after*\n// entity migration. The runtime contract is:\n//\n//   1. Entity migration first via `migrateNode` (1→1 aliases) and/or\n//      `applySplit` (1→N rules).\n//   2. Edge migration second via `migrateEdge`;\n//      `requires_source_type` / `requires_target_type` guards check the\n//      *post-migration* endpoint types.\n//\n// This is what makes the \"legacy edges on already-migrated nodes\" case\n// safe. The 1→N split rules already emit canonical edges between spawned\n// targets via `UPG_SPLIT_MIGRATIONS[].edges`; edge migration only handles\n// the residue.\n\n/**\n * A single edge-key migration rule. Discriminated by `kind`.\n *\n * `rename` retargets `from` to `to` (optionally swapping endpoints when\n * `flip` is true) and may gate on endpoint identity via\n * `requires_source_type` / `requires_target_type`.\n *\n * `drop` removes the edge entirely (no replacement key); used when a\n * legacy edge has been superseded by a structurally different canonical\n * edge whose endpoints don't match the legacy rule's `from`.\n */\nexport type UPGEdgeMigration =\n  | {\n      kind: 'rename'\n      /** The old edge type key. */\n      from: string\n      /** The new canonical edge type key. */\n      to: string\n      /** When true, swap source/target on each migrated edge. */\n      flip?: boolean\n      /** Required source-node type (post-migration) for this rule to fire. */\n      requires_source_type?: string\n      /** Required target-node type (post-migration) for this rule to fire. */\n      requires_target_type?: string\n      /** Human-readable reason quoting the originating CHANGELOG section. */\n      reason: string\n    }\n  | {\n      kind: 'drop'\n      /** The old edge type key being removed without replacement. */\n      from: string\n      /** Human-readable reason quoting the originating CHANGELOG section. */\n      reason: string\n    }\n\n/**\n * Version-scoped edge migration registry.\n * Key is the version that INTRODUCES the migration (target version).\n */\nexport const UPG_EDGE_MIGRATIONS: Record<string, UPGEdgeMigration[]> = {\n  '0.33.0': [\n    // G1 — the project membership edge widens from epic to the work-item set.\n    // Same construction as the 0.32.0 cadence rename directly below, and for the\n    // same measured reason: the adapters default an unrecognised issue to `task`,\n    // so the type a project most needed to deliver was the one type it could not\n    // reach. No requires_target_type, because the destination's target_type is\n    // the `node` wildcard and endpoint guards check the catalog's declared type\n    // rather than the concrete instance. Gate only on the unwidened source.\n    { kind: 'rename', from: 'project_delivers_epic', to: 'project_delivers_work_item', requires_source_type: 'project', reason: '0.33.0: a project could only deliver an epic, while a Linear dry-run carried 651 project memberships as properties.linear_project_id and emitted zero edges. Widened to the polymorphic work-item endpoint; no flip, source unchanged. Measured live population of the old type at release: one, in the CI saturation fixture, so this rename is a vocabulary change rather than a data migration.' },\n  ],\n  '0.32.0': [\n    // C5 — the cadence scheduling edge widens from user_story to the work-item\n    // set. No requires_target_type: the destination's target_type is the `node`\n    // wildcard, and endpoint guards are checked against the catalog's declared\n    // type rather than the concrete instance (same reasoning as the 0.22.0\n    // workspace_produced_node rename below). Gate only on the unwidened source.\n    { kind: 'rename', from: 'planning_cycle_schedules_user_story', to: 'planning_cycle_schedules_work_item', requires_source_type: 'planning_cycle', reason: '0.32.0: a cycle could only schedule a user_story, while tracker imports produce `task` by default; the type a cadence most needed to hold was the one it could not reach. Widened to the polymorphic work-item endpoint; no flip, source unchanged. Measured live population of the old type at release: zero (no .upg in the repo or the dogfood graph carried it), so this rename is a vocabulary change, not a data migration.' },\n  ],\n  // (target version TBD at release ceremony — pencilled at 0.22.0, the next\n  // breaking slot after 0.21.0 per the docket; adjust the key if Wave 4\n  // claims it first.) WS3 commit-provenance collapse (2026-07-05, ratified):\n  // `workspace_produced_decision` widens to the `node` wildcard endpoint —\n  // a workspace's commit loop can legitimately produce any entity type\n  // arranged in it (decision, feature, persona, ...), not just decisions.\n  // No flip (source stays workspace); the target node's concrete type is\n  // unchanged (still a decision), only the edge key + catalog target_type\n  // widen. See the enum-vs-polymorphism ADR and the WS3 proposal doc for\n  // the full reasoning (mirrors decision_produces_node).\n  '0.22.0': [\n    // No requires_target_type: the destination's target_type is the `node`\n    // wildcard, and the endpoint guard is checked against the catalog's\n    // declared type (per the spec-integrity \"endpoint guards match the\n    // catalog entry\" test), not the concrete instance type — a concrete\n    // `decision` instance would never satisfy a literal 'node' guard at\n    // runtime. Gate only on the unwidened source endpoint.\n    { kind: 'rename', from: 'workspace_produced_decision', to: 'workspace_produced_node', requires_source_type: 'workspace', reason: 'WS3 commit-provenance collapse (2026-07-05, Captain-ratified). workspace_produced_decision widens to the polymorphic workspace_produced_node: a workspace commit can legitimately produce any entity type, not just a decision. No flip; only the target_type widens from decision to the node wildcard.' },\n  ],\n  '0.9.9': [\n    // (since v0.9.9, UPG-664/UPG-678) Validation experiment-model + test_plan\n    // re-home. The validation chain is reshaped to the single-parent line\n    // hypothesis → experiment_plan → experiment → experiment_run, `experiment`\n    // gains its stable hypothesis loop, and `test_plan` re-homes to the QA\n    // domain (its planning role absorbed by `experiment_plan`).\n    //\n    // The plan→experiment containment inverts: the old `experiment_has_plan`\n    // (experiment → experiment_plan, hierarchy) becomes\n    // `experiment_plan_designs_experiment` (experiment_plan → experiment). Flip\n    // swaps endpoints. Endpoint guards reference the post-flip orientation: the\n    // original source (experiment) becomes the new target, the original target\n    // (experiment_plan) becomes the new source.\n    { kind: 'rename', from: 'experiment_has_plan', to: 'experiment_plan_designs_experiment', flip: true, requires_source_type: 'experiment', requires_target_type: 'experiment_plan', reason: 'Validation experiment-model reshape (UPG-664). The plan owns the experiment it designs; the containment direction inverts from experiment → experiment_plan to experiment_plan → experiment. Flip swaps endpoints so the surviving edge reads plan-designs-experiment.' },\n    // test_plan re-homed validation → QA (UPG-678). Its two validation-side\n    // edges are dropped: a hypothesis no longer plans via a QA test_plan (it\n    // requires an experiment_plan), and the test_plan → experiment_run ran-as\n    // bridge is superseded by the experiment_plan → experiment flow.\n    { kind: 'drop', from: 'hypothesis_planned_via_test_plan', reason: 'test_plan re-homed validation → QA (UPG-678). A hypothesis no longer plans via test_plan; the validation plan is experiment_plan (hypothesis_requires_experiment_plan).' },\n    { kind: 'drop', from: 'test_plan_ran_as_experiment_run', reason: 'test_plan re-homed validation → QA (UPG-678). The Strategyzer Test Card flow now runs hypothesis → experiment_plan → experiment → experiment_run; the test_plan → experiment_run bridge is superseded by experiment_plan_designs_experiment.' },\n\n    // (since v0.9.9, UPG-665) AI prompt-model correction. The prompt abstraction\n    // is inverted to the correct ai_model → prompt_template → prompt_version\n    // containment. The backwards/obsolete edges are dropped, and the\n    // prompt_template → ai_model \"targets\" relationship is flipped into the new\n    // ai_model → prompt_template ownership.\n    { kind: 'rename', from: 'prompt_template_targets_ai_model', to: 'ai_model_defines_prompt_template', flip: true, requires_source_type: 'prompt_template', requires_target_type: 'ai_model', reason: 'AI prompt-model correction (UPG-665). The model owns its templates; the prompt_template → ai_model \"targets\" edge becomes the ai_model → prompt_template ownership edge. Flip swaps endpoints so the surviving edge reads model-defines-template.' },\n    { kind: 'drop', from: 'prompt_version_evolves_prompt_template', reason: 'AI prompt-model correction (UPG-665). The backwards prompt_version → prompt_template edge is retired; prompt_template now contains its versions (prompt_template_contains_prompt_version).' },\n    { kind: 'drop', from: 'ai_model_prompted_via_prompt_version', reason: 'AI prompt-model correction (UPG-665). The model no longer owns prompt_version directly; the chain is ai_model → prompt_template → prompt_version.' },\n    { kind: 'drop', from: 'product_prompted_via_prompt_template', reason: 'AI prompt-model correction (UPG-665). prompt_template re-parented product → ai_model (ai_model_defines_prompt_template); the product-level containment is removed.' },\n    { kind: 'drop', from: 'content_calendar_schedules_prompt_template', reason: 'AI prompt-model correction (UPG-665). prompt_template re-homed into the ai_model containment tree; it is an AI artefact, not a content-calendar-scheduled item.' },\n\n    // (since v0.9.9, UPG-676) Strategic-theme containment edge rename. The\n    // malformed `objective_rolls_up_to_strategic_theme` (key read object-first\n    // while source_type was strategic_theme; forward_verb was the malformed\n    // `contains_objective`) is renamed to the clean source-first\n    // `strategic_theme_contains_objective`. Endpoints unchanged\n    // (strategic_theme → objective); only the key and forward verb change.\n    { kind: 'rename', from: 'objective_rolls_up_to_strategic_theme', to: 'strategic_theme_contains_objective', requires_source_type: 'strategic_theme', requires_target_type: 'objective', reason: 'Strategic-theme containment edge rename (UPG-676). The key now reads source-first and the forward verb is the clean `contains` (was the malformed `contains_objective`). Endpoints unchanged (strategic_theme → objective); satisfies the F2 prefix gate.' },\n\n    // (since v0.9.9, UPG-677) Duplicate / shadow edge collapse. Each retired key\n    // is dual-read to the surviving canonical key. Tier 1 = byte-identical\n    // shadows; Tier 2 = tense/suffix twins; Tier 3 = near-synonyms collapsed per\n    // Captain's lean. Inverse pairs flip the direction onto the kept containment\n    // edge. Collapsing these lowers the edge-duplicate gate collision bound.\n    // ── Tier 1: byte-identical shadows ──\n    { kind: 'rename', from: 'insight_informs_opportunity_cross_domain', to: 'insight_informs_opportunity', requires_source_type: 'insight', requires_target_type: 'opportunity', reason: 'Duplicate collapse (UPG-677). Byte-identical shadow of insight_informs_opportunity; the suffixed twin never resolved.' },\n    { kind: 'rename', from: 'product_experiences_incident_hierarchy', to: 'product_experiences_incident', requires_source_type: 'product', requires_target_type: 'incident', reason: 'Duplicate collapse (UPG-677). Byte-identical shadow of product_experiences_incident; the suffixed twin never resolved.' },\n    { kind: 'rename', from: 'value_proposition_targets_persona_cross_domain', to: 'value_proposition_targets_persona', requires_source_type: 'value_proposition', requires_target_type: 'persona', reason: 'Duplicate collapse (UPG-677). Byte-identical shadow of value_proposition_targets_persona; the suffixed twin never resolved.' },\n    { kind: 'rename', from: 'metric_measures_metric_cross_domain', to: 'metric_measures_metric', requires_source_type: 'metric', requires_target_type: 'metric', reason: 'Duplicate collapse (UPG-677). Byte-identical shadow of metric_measures_metric; the suffixed twin never resolved.' },\n    { kind: 'rename', from: 'insight_validates_need_cross_domain', to: 'insight_validates_need', requires_source_type: 'insight', requires_target_type: 'need', reason: 'Duplicate collapse (UPG-677). Byte-identical shadow of insight_validates_need; the suffixed twin never resolved.' },\n    { kind: 'rename', from: 'revenue_stream_measured_by_metric_cross_domain', to: 'revenue_stream_measured_by_metric', requires_source_type: 'revenue_stream', requires_target_type: 'metric', reason: 'Duplicate collapse (UPG-685 T0.1, 0.13.0 Wave 1). Cross-domain-classified shadow of revenue_stream_measured_by_metric (same measured_by/measures verbs); pickCanonicalEdge never returned it (the semantic key wins the pair; revenue_stream_drives_metric serves the cross-domain ask). Verb-preserving collapse onto the semantic canonical.' },\n    // ── Tier 2: tense / suffix twins ──\n    { kind: 'rename', from: 'metric_decomposed_into_metric', to: 'metric_decomposes_into_metric', requires_source_type: 'metric', requires_target_type: 'metric', reason: 'Duplicate collapse (UPG-677). Tense-twin of the active-voice metric_decomposes_into_metric.' },\n    { kind: 'rename', from: 'product_decided_via_decision_hierarchy', to: 'product_decided_via_decision', requires_source_type: 'product', requires_target_type: 'decision', reason: 'Duplicate collapse (UPG-677). Suffix-twin of product_decided_via_decision.' },\n    { kind: 'rename', from: 'support_ticket_reveals_need_cross_domain', to: 'support_ticket_reveals_need', requires_source_type: 'support_ticket', requires_target_type: 'need', reason: 'Duplicate collapse (UPG-677). Near-duplicate of support_ticket_reveals_need (whose reverse_verb is normalised to revealed_by).' },\n    // ── Tier 3: near-synonyms (Captain's lean = collapse) ──\n    { kind: 'rename', from: 'outcome_tracked_by_metric', to: 'outcome_measured_by_metric', requires_source_type: 'outcome', requires_target_type: 'metric', reason: 'Duplicate collapse (UPG-677). Near-synonym of outcome_measured_by_metric (keep measured_by, drop tracked_by).' },\n    { kind: 'rename', from: 'key_result_tracked_by_metric', to: 'key_result_quantified_by_metric', requires_source_type: 'key_result', requires_target_type: 'metric', reason: 'Duplicate collapse (UPG-677). Near-synonym of key_result_quantified_by_metric (keep quantified_by, drop tracked_by).' },\n    { kind: 'rename', from: 'business_model_reaches_via_distribution_channel', to: 'business_model_distributes_via_distribution_channel', requires_source_type: 'business_model', requires_target_type: 'distribution_channel', reason: 'Duplicate collapse (UPG-677). Near-synonym of business_model_distributes_via_distribution_channel (the Business Model Canvas Channels verb).' },\n    // ── Inverse pairs: flip onto the kept containment edge ──\n    // Flip guards reference the PRE-flip (original-edge) endpoints: the original\n    // source becomes the new target after flip, so requires_source_type matches\n    // the new edge's target_type and requires_target_type matches its source_type.\n    { kind: 'rename', from: 'product_categorised_in_product_area', to: 'product_area_contains_product', flip: true, requires_source_type: 'product', requires_target_type: 'product_area', reason: 'Duplicate collapse (UPG-677). Inverse of the containment edge product_area_contains_product (product_area → product). Flip swaps endpoints; the \"categorised in\" read survives as the reverse_verb belongs_to.' },\n    { kind: 'rename', from: 'changelog_documents_release', to: 'release_documented_in_changelog', flip: true, requires_source_type: 'changelog', requires_target_type: 'release', reason: 'Duplicate collapse (UPG-677). Inverse of the containment edge release_documented_in_changelog (release → changelog, matching hierarchy release: [changelog]). Flip swaps endpoints; the \"changelog documents release\" read survives as the reverse_verb documents.' },\n  ],\n\n  '0.9.2': [\n    // (since v0.9.2, UPG-663) Journey-model disambiguation. A journey_phase\n    // is a temporal BAND over the journey's single step timeline, not a\n    // container that owns steps. The owning hierarchy edge\n    // `journey_phase_has_step` is renamed to the non-owning\n    // `journey_phase_spans_journey_step` (mirroring the marketing precedent\n    // `customer_journey_stage_spans_journey_step`). Steps stay owned by the\n    // journey via `user_journey_contains_journey_step` (the stable 0.1.0\n    // spine), so each step keeps a single containment parent and the journey\n    // renders one canonical step list. Endpoints are unchanged\n    // (journey_phase → journey_step); only the edge key and its grammar\n    // (verb has_step → spans, classification hierarchy → cross-domain) change.\n    { kind: 'rename', from: 'journey_phase_has_step', to: 'journey_phase_spans_journey_step', requires_source_type: 'journey_phase', requires_target_type: 'journey_step', reason: 'Journey-model disambiguation (UPG-663): a phase spans steps, it does not own them. The phase to step edge becomes non-owning (verb has_step to spans), so the step keeps a single containment parent (the journey) and the journey has one canonical step list.' },\n  ],\n\n  '0.9.0': [\n    // (since v0.9.0, UPG-660) theme → roadmap_theme. The four canonical edges that\n    // touch the roadmap theme are renamed to the roadmap_theme form. Endpoint guards\n    // reference the POST-migration (roadmap_theme) types; edge migration runs after\n    // node migration, so by the time these rules apply the node has already been\n    // renamed theme → roadmap_theme (UPG_MIGRATIONS['0.9.0']).\n    { kind: 'rename', from: 'product_categorises_by_theme', to: 'product_categorises_by_roadmap_theme', requires_source_type: 'product', requires_target_type: 'roadmap_theme', reason: 'theme → roadmap_theme (UPG-660). Product categorises by the roadmap theme; edge key updated to the renamed target type.' },\n    { kind: 'rename', from: 'roadmap_categorised_by_theme', to: 'roadmap_categorised_by_roadmap_theme', requires_source_type: 'roadmap', requires_target_type: 'roadmap_theme', reason: 'theme → roadmap_theme (UPG-660). Roadmap is categorised by the roadmap theme; edge key updated to the renamed target type.' },\n    { kind: 'rename', from: 'theme_groups_feature', to: 'roadmap_theme_groups_feature', requires_source_type: 'roadmap_theme', requires_target_type: 'feature', reason: 'theme → roadmap_theme (UPG-660). The roadmap theme groups features; edge key updated to the renamed source type.' },\n    { kind: 'rename', from: 'theme_spans_feature_area', to: 'roadmap_theme_spans_feature_area', requires_source_type: 'roadmap_theme', requires_target_type: 'feature_area', reason: 'theme → roadmap_theme (UPG-660). The roadmap theme spans feature areas; edge key updated to the renamed source type.' },\n  ],\n\n  '0.7.0': [\n    // (since v0.7.0, UPG-571) story_statement → user_story re-canon. The four\n    // canonical edges that touch the statement are renamed to the user_story\n    // form. Endpoint guards reference the POST-migration (user_story) types;\n    // edge migration runs after node migration, so by the time these rules\n    // apply the statement node has already been renamed story_statement →\n    // user_story (UPG_MIGRATIONS['0.7.0']).\n    { kind: 'rename', from: 'task_implements_story_statement', to: 'task_implements_user_story', requires_source_type: 'task', requires_target_type: 'user_story', reason: 'story_statement → user_story (UPG-571). Task still implements the statement; edge key updated to the re-canonicalised target type.' },\n    { kind: 'rename', from: 'epic_specified_by_story_statement', to: 'epic_specified_by_user_story', requires_source_type: 'epic', requires_target_type: 'user_story', reason: 'story_statement → user_story (UPG-571). Epics specify the statement; edge key updated to the re-canonicalised target type.' },\n    { kind: 'rename', from: 'story_statement_verified_by_acceptance_criterion', to: 'user_story_verified_by_acceptance_criterion', requires_source_type: 'user_story', requires_target_type: 'acceptance_criterion', reason: 'story_statement → user_story (UPG-571). Acceptance criteria verify the statement; edge key updated to the re-canonicalised source type.' },\n    { kind: 'rename', from: 'test_case_covers_story_statement', to: 'test_case_covers_user_story', requires_source_type: 'test_case', requires_target_type: 'user_story', reason: 'story_statement → user_story (UPG-571). Test cases cover the statement; edge key updated to the re-canonicalised target type.' },\n  ],\n\n  '0.4.0': [\n    // ── hypothesis_claim → hypothesis reverse rename ───────────────\n    // Every edge that was renamed FROM hypothesis_* TO hypothesis_claim_* in\n    // v0.2.8 is renamed back. The canonical entity name\n    // reverts; \"claim\" was redundant. hypothesis_evidence_* edges are NOT\n    // renamed here; hypothesis_evidence is deprecated; use evidence +\n    // hypothesis_has_evidence instead.\n    { kind: 'rename', from: 'solution_proposes_hypothesis_claim', to: 'solution_proposes_hypothesis', requires_source_type: 'solution', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'hypothesis_claim_requires_experiment_plan', to: 'hypothesis_requires_experiment_plan', requires_source_type: 'hypothesis', requires_target_type: 'experiment_plan', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'hypothesis_claim_planned_via_test_plan', to: 'hypothesis_planned_via_test_plan', requires_source_type: 'hypothesis', requires_target_type: 'test_plan', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'hypothesis_claim_investigated_via_research_plan', to: 'hypothesis_investigated_via_research_plan', requires_source_type: 'hypothesis', requires_target_type: 'research_plan', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'learning_updates_hypothesis_claim', to: 'learning_updates_hypothesis', requires_source_type: 'learning', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'learning_refines_hypothesis_claim', to: 'learning_refines_hypothesis', requires_source_type: 'learning', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'assumption_becomes_hypothesis_claim', to: 'assumption_becomes_hypothesis', requires_source_type: 'assumption', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'experiment_run_validates_hypothesis_claim', to: 'experiment_run_validates_hypothesis', requires_source_type: 'experiment_run', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'variant_tests_hypothesis_claim', to: 'variant_tests_hypothesis', requires_source_type: 'variant', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'feature_tests_hypothesis_claim', to: 'feature_tests_hypothesis', requires_source_type: 'feature', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'prototype_tests_hypothesis_claim', to: 'prototype_tests_hypothesis', requires_source_type: 'prototype', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    { kind: 'rename', from: 'churn_reason_generates_hypothesis_claim', to: 'churn_reason_generates_hypothesis', requires_source_type: 'churn_reason', requires_target_type: 'hypothesis', reason: 'Reverse of the v0.2.8 rename. hypothesis_claim reverts to hypothesis.' },\n    // ── hypothesis_evidence_* → drop (type deprecated) ────────────\n    // hypothesis_evidence is deprecated at v0.4.0. All edges sourced from it\n    // are dropped; the new pattern is hypothesis_has_evidence + evidence.direction.\n    { kind: 'drop', from: 'hypothesis_evidence_supports_hypothesis_claim', reason: 'hypothesis_evidence deprecated; use hypothesis_has_evidence edge + evidence.direction=\"supports\".' },\n    { kind: 'drop', from: 'hypothesis_evidence_refutes_hypothesis_claim', reason: 'hypothesis_evidence deprecated; use hypothesis_has_evidence edge + evidence.direction=\"refutes\".' },\n    { kind: 'drop', from: 'hypothesis_evidence_derived_from_experiment_run', reason: 'hypothesis_evidence deprecated; evidence.source captures provenance.' },\n    { kind: 'drop', from: 'hypothesis_evidence_derived_from_insight', reason: 'hypothesis_evidence deprecated; evidence.source captures provenance.' },\n    { kind: 'drop', from: 'hypothesis_evidence_derived_from_observation', reason: 'hypothesis_evidence deprecated; evidence.source captures provenance.' },\n    { kind: 'drop', from: 'hypothesis_evidence_derived_from_metric', reason: 'hypothesis_evidence deprecated; evidence.source captures provenance.' },\n    // ── story_task → task rename ───────────────────────────────────\n    { kind: 'rename', from: 'story_task_implements_story_statement', to: 'task_implements_story_statement', requires_source_type: 'task', requires_target_type: 'story_statement', reason: 'story_task collapsed into task; edge key updated to match canonical source type.' },\n  ],\n\n  '0.2.0': [\n    // ── jtbd → job edge-key backfill ─────────────────────────────\n    // The v0.2.0 entity-type rename `jtbd → job` (UPG_MIGRATIONS['0.2.0'])\n    // shipped alongside an edge-key rename pass (the `_has_` → forward_verb\n    // sweep) but the runtime translation rules were never landed in this\n    // registry. Backfilled here so loaders chasing pre-0.2.0 data get a\n    // single retarget hop instead of inventing their own map.\n    //\n    // Entity migration runs first, so source/target_type guards check the\n    // post-migration types (`persona`, `user_journey`, `insight`, `job`,\n    // etc.). The reason field cites the v0.2.0 CHANGELOG.\n    {\n      kind: 'rename',\n      from: 'persona_has_jtbd',\n      to: 'persona_pursues_job',\n      requires_source_type: 'persona',\n      requires_target_type: 'job',\n      reason: 'Renamed alongside the jtbd→job entity rename and the _has_ → forward_verb sweep. The canonical edge changes verb from has→pursues; pursued_by reverses the relationship. Source remains persona; target migrates jtbd→job via UPG_MIGRATIONS[\"0.2.0\"], so this rule fires after node migration completes.',\n    },\n    {\n      kind: 'rename',\n      from: 'journey_addresses_jtbd',\n      to: 'user_journey_addresses_job',\n      requires_source_type: 'user_journey',\n      requires_target_type: 'job',\n      reason: 'Renamed alongside the jtbd→job entity rename and the _has_ → forward_verb sweep. Source key prefix `journey` → `user_journey` matches the canonical entity name (no entity-type alias was needed because `journey` was never a registered type; it was an informal key prefix).',\n    },\n    {\n      kind: 'rename',\n      from: 'vp_addresses_jtbd',\n      to: 'value_proposition_addresses_job',\n      requires_source_type: 'value_proposition',\n      requires_target_type: 'job',\n      reason: 'Renamed alongside the jtbd→job entity rename. Source key prefix `vp` (acronym) expanded to canonical `value_proposition` matching the entity name.',\n    },\n    {\n      kind: 'rename',\n      from: 'finding_informs_jtbd',\n      to: 'insight_informs_job',\n      requires_source_type: 'insight',\n      requires_target_type: 'job',\n      reason: 'Source `finding` migrated to `insight` in v0.1.0 (UPG_MIGRATIONS[\"0.1.0\"], with insight_level=\"finding\" default); target `jtbd` migrated to `job` in v0.2.0. Edge-migration runs after both node migrations, so the rule fires once endpoints are post-migration.',\n    },\n    {\n      kind: 'rename',\n      from: 'quote_evidences_jtbd',\n      to: 'quote_evidences_job',\n      requires_source_type: 'quote',\n      requires_target_type: 'job',\n      reason: 'Renamed alongside the jtbd→job entity rename. Verb unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'learning_validates_jtbd',\n      to: 'learning_validates_job',\n      requires_source_type: 'learning',\n      requires_target_type: 'job',\n      reason: 'Renamed alongside the jtbd→job entity rename. Verb unchanged.',\n    },\n\n    // ── v0.2.0 backfill: classification-suffix renames ─────────────\n    // Pre-v0.2 era graphs annotated edge classification by appending\n    // `_causal` / `_semantic` to the edge key. Classification became a\n    // catalog property in v0.2.0 (`classification: 'causal' | 'semantic' |\n    // 'hierarchy' | 'cross-domain'`), making the suffix redundant. The\n    // stem keys are canonical; the suffixed forms are pure renames.\n    {\n      kind: 'rename',\n      from: 'outcome_reveals_opportunity_causal',\n      to: 'outcome_reveals_opportunity',\n      reason: 'The `_causal` suffix annotated the edge\\'s classification before v0.2 moved classification onto the catalog entry itself. Stem `outcome_reveals_opportunity` is canonical (classification: causal). Cross-graph audit: 15 edges across entopo.upg + unified-product-graph.upg.',\n    },\n    {\n      kind: 'rename',\n      from: 'persona_pursues_job_semantic',\n      to: 'persona_pursues_job',\n      reason: 'The `_semantic` suffix annotated the edge\\'s classification before v0.2 moved classification onto the catalog entry itself. Stem `persona_pursues_job` is canonical (classification: semantic). Cross-graph audit: 6 edges in unified-product-graph.upg.',\n    },\n\n    // ── v0.2.0 cleanup: informal-edge drops ────────────────────────\n    //\n    // Pre-v0.2 graphs minted `product_contains_<entity>` edges to express\n    // graph membership (\"this entity belongs to this product\"). v0.2 models\n    // product membership through portfolio scope + the `upg_product`\n    // frontmatter / file association, NOT through typed edges. The\n    // `product_contains_*` family in the canonical catalog is intentionally\n    // narrow: only `research_study` and `screen` (entities a product\n    // structurally owns as artefacts). Everything else is graph-membership\n    // noise being cleaned up at the v0.2.0 baseline.\n    //\n    // Doctrine: a product is a portfolio scope, not an entity container.\n    // Structural containment is reserved for entities the product\n    // physically owns. If a future v0.3 catalog elevates any of these to\n    // canonical, the drop rules below become rename rules; today they're\n    // drops with explicit reason.\n    //\n    // Sources: cross-graph audit (entopo.upg + unified-product-graph.upg)\n    // surfaced these as `unmapped_legacy_edges` after `migrate_type` ran.\n    {\n      kind: 'drop',\n      from: 'product_contains_persona',\n      reason: 'Cleanup (since v0.2.0). Personas are scoped to a product via portfolio membership, not contained as a typed edge. v0.2 catalog reserves `product_contains_*` for structural artefacts (research_study, screen). Cross-graph audit: 8 edges total.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_market_segment',\n      reason: 'Cleanup (since v0.2.0). Market segments belong to a product via portfolio scope. Not a structural containment relationship. Cross-graph audit: 5 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_market_trend',\n      reason: 'Cleanup (since v0.2.0). Market trends are environmental context, not contained artefacts. Cross-graph audit: 5 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_proof_point',\n      reason: 'Cleanup (since v0.2.0). Proof points belong to positioning / value proposition entities, not directly to the product as a container. Cross-graph audit: 7 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_value_proposition',\n      reason: 'Cleanup (since v0.2.0). Value propositions are scoped to a product via portfolio membership. Cross-graph audit: 3 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_hypothesis',\n      reason: 'Cleanup (since v0.2.0). Hypotheses (now hypothesis_claim post v0.2.8) belong to a product via portfolio scope. Cross-graph audit: 8 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_positioning',\n      reason: 'Cleanup (since v0.2.0). Positioning belongs to a product via portfolio scope. Cross-graph audit: 2 edges.',\n    },\n    // restoration: this edge is being re-introduced as a\n    // canonical anchor. The v0.2.0 cleanup retired it on the assumption that\n    // \"competitive analysis is scoped to a product via portfolio scope\", but\n    // chain validation showed that assumption produces orphan analyses\n    // for any single-product graph. The edge is back in `UPG_EDGE_CATALOG`\n    // with `forward_verb: contains`, mirroring `product_contains_research_study`.\n    // The historical drop rule is intentionally omitted; keeping it would\n    // contradict the catalog and trip the `edge-migrations` invariant test\n    // (\"drop rule `from` keys are no longer in the canonical catalog\").\n    {\n      kind: 'drop',\n      from: 'product_contains_content_strategy',\n      reason: 'Cleanup (since v0.2.0). Content strategy is scoped to a product via portfolio scope. Cross-graph audit: 1 edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_epic',\n      reason: 'Cleanup (since v0.2.0). Epics belong to a product via portfolio scope and to features/work-units via hierarchy. Cross-graph audit: 1 edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_ideal_customer_profile',\n      reason: 'Cleanup (since v0.2.0). ICPs are scoped to a product via portfolio scope. Cross-graph audit: 1 edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_insight',\n      reason: 'Cleanup (since v0.2.0). Insights belong to a product via portfolio scope and to research artefacts via hierarchy. Cross-graph audit: 6 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_competitor',\n      reason: 'Cleanup (since v0.2.0). Competitors are environmental context scoped to a product, not contained artefacts. Cross-graph audit: 4 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_learning',\n      reason: 'Cleanup (since v0.2.0). Learnings belong to experiment_run via the canonical `experiment_run_produces_learning` edge, not directly to the product. Cross-graph audit: 2 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'hypothesis_contains_persona',\n      reason: 'Cleanup (since v0.2.0). Hypotheses do not contain personas; the relationship is the reverse (personas surface needs that ground hypotheses). Cross-graph audit: 5 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'positioning_contains_content_piece',\n      reason: 'Cleanup (since v0.2.0). Positioning is itself a content artefact; \"containing\" content pieces is informal. The canonical relationship runs through content_strategy. Cross-graph audit: 3 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'feature_contains_feature',\n      reason: 'Cleanup (since v0.2.0). Feature self-nesting is handled via UPG_VALID_CHILDREN hierarchy (entity-tree relationship), not as a typed edge. Cross-graph audit: 4 edges.',\n    },\n    {\n      kind: 'drop',\n      from: 'parent_of',\n      reason: 'Cleanup (since v0.2.0). Parent-child relationships are handled via UPG_VALID_CHILDREN hierarchy at the entity-tree level, not as a typed edge. Cross-graph audit: 1 edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'related_to',\n      reason: 'Cleanup (since v0.2.0). Generic \"related to\" has no canonical pair semantics; every real relationship has a specific verb in UPG_EDGE_CATALOG. Cross-graph audit: 1 edge.',\n    },\n\n    // ── v0.2.0 cleanup: informal-containment drops for v0.2.6+ children ─\n    //\n    // Same doctrine as above: `product_contains_*` is a portfolio\n    // membership concern, not a typed edge. The original audit\n    // covered the entity types in cross-graph data at the time. Several\n    // canonical types introduced AFTER v0.2.0 (story_statement v0.2.7,\n    // experiment_plan / experiment_run v0.2.6, plus metric / outcome /\n    // decision which were always canonical but didn't surface in the\n    // original audit) are surfaced by v0.3 round-trip fixtures with the\n    // same informal `product_contains_<type>` shape. Add drops so they\n    // canonicalise via the same `product is a scope, not a container`\n    // rule. Sourced from `.upg/v03-roundtrip.upg` round-trip fixture.\n    {\n      kind: 'drop',\n      from: 'product_contains_metric',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Metrics belong to a product via portfolio scope and to features/outcomes via canonical edges, not as a typed product-containment edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_outcome',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Outcomes belong to a product via portfolio scope; the canonical chain is opportunity_pursues_outcome / job_motivates_desired_outcome.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_decision',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Decisions belong to a product via portfolio scope and use the polymorphic decision_influences_node family for relational links.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_story_statement',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Story statements belong to a product via portfolio scope and to story_task via canonical implements edges. Type was introduced in v0.2.7 (post-original-audit).',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_experiment',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Experiments (canonical alongside experiment_plan / experiment_run) belong to a product via portfolio scope, not as a typed containment edge.',\n    },\n    {\n      kind: 'drop',\n      from: 'product_contains_experiment_run',\n      reason: 'Cleanup follow-on (since v0.2.0; `product is a scope, not a container` doctrine). Experiment runs belong to experiment_plan via canonical experiment_plan_ran_as_experiment_run, not directly to the product as a containment edge. Type was introduced in v0.2.6 (post-original-audit).',\n    },\n\n    // ── v0.2.0 backfill: persona-chain verb canonicalisation ──────────────\n    //\n    // The persona chain (v0.2 model) settled on the canonical edge\n    // verbs `aspires_to` (persona → desired_outcome, hierarchy) and\n    // `incurs` (persona → switching_cost, hierarchy). Some pre-canon\n    // graphs minted these edges with informal verbs (`seeks`, `faces`)\n    // that read more naturally but never made it into the catalog. Rename\n    // so the canonical verb set stays the one authority and\n    // validate_graph offers a single-hop fix.\n    //\n    // Sourced from `.upg/v03-roundtrip.upg` round-trip fixture.\n    {\n      kind: 'rename',\n      from: 'persona_seeks_desired_outcome',\n      to: 'persona_aspires_to_desired_outcome',\n      requires_source_type: 'persona',\n      requires_target_type: 'desired_outcome',\n      reason: 'The canonical persona-chain verb is `aspires_to` (catalog: classification=hierarchy, source=persona, target=desired_outcome). `seeks` was an informal authoring shorthand; renaming surfaces a single canonical chain.',\n    },\n    {\n      kind: 'rename',\n      from: 'persona_faces_switching_cost',\n      to: 'persona_incurs_switching_cost',\n      requires_source_type: 'persona',\n      requires_target_type: 'switching_cost',\n      reason: 'The canonical persona-chain verb is `incurs` (catalog: classification=hierarchy, source=persona, target=switching_cost). `faces` was an informal authoring shorthand; renaming surfaces a single canonical chain.',\n    },\n  ],\n\n  '0.2.7': [\n    // ── split 1 closure: 18 experiment-edge retargets ──────────────\n    // CHANGELOG v0.2.7 §\"Breaking split 1 closure\" enumerates\n    // the full retarget list. Each rule guards on the canonical\n    // post-migration endpoint type so legacy edges on already-migrated\n    // nodes (post-applySplit) translate cleanly. `experiment` → `experiment_run`\n    // 1→1 alias lives in UPG_MIGRATIONS[\"0.2.7\"]; full plan+run split lives\n    // in UPG_SPLIT_MIGRATIONS[\"0.2.6\"].\n    {\n      kind: 'rename',\n      from: 'hypothesis_requires_experiment',\n      to: 'hypothesis_requires_experiment_plan',\n      requires_source_type: 'hypothesis',\n      requires_target_type: 'experiment_plan',\n      reason: 'Split 1 closure (since v0.2.7). Hypothesis requires the planning artefact, not the run. Target retargets to experiment_plan; source retargets to hypothesis_claim in v0.2.8 (then registered as hypothesis_claim_requires_experiment_plan).',\n    },\n    {\n      kind: 'rename',\n      from: 'growth_campaign_tests_via_experiment',\n      to: 'growth_campaign_tests_via_experiment_plan',\n      requires_source_type: 'growth_campaign',\n      requires_target_type: 'experiment_plan',\n      reason: 'Split 1 closure (since v0.2.7). Growth campaigns reference the planning artefact (which experiments the campaign tests via).',\n    },\n    {\n      kind: 'rename',\n      from: 'pricing_strategy_tests_experiment',\n      to: 'pricing_strategy_tests_experiment_plan',\n      requires_source_type: 'pricing_strategy',\n      requires_target_type: 'experiment_plan',\n      reason: 'Split 1 closure (since v0.2.7). Pricing strategies reference the plan, not the run.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_targets_behavioral_segment',\n      to: 'experiment_plan_targets_behavioral_segment',\n      requires_source_type: 'experiment_plan',\n      requires_target_type: 'behavioral_segment',\n      reason: 'Split 1 closure (since v0.2.7). Targeting is a planning concern (decided pre-execution), so retargets to experiment_plan.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_produces_learning',\n      to: 'experiment_run_produces_learning',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'learning',\n      reason: 'Split 1 closure (since v0.2.7). Learnings are produced by the run (execution evidence), not the plan.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_yields_evidence',\n      to: 'experiment_run_yields_evidence',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'evidence',\n      reason: 'Split 1 closure (since v0.2.7). Evidence yields from execution; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'beta_program_runs_experiment',\n      to: 'beta_program_runs_experiment_run',\n      requires_source_type: 'beta_program',\n      requires_target_type: 'experiment_run',\n      reason: 'Split 1 closure (since v0.2.7). Beta programs run experiment_run instances (the actual executions).',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_tests_variant',\n      to: 'experiment_run_tests_variant',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'variant',\n      reason: 'Split 1 closure (since v0.2.7). Variant tests happen during run execution; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'cohort_exposed_to_experiment',\n      to: 'cohort_exposed_to_experiment_run',\n      requires_source_type: 'cohort',\n      requires_target_type: 'experiment_run',\n      reason: 'Split 1 closure (since v0.2.7). Exposure is a run-time event; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_tests_pricing_tier',\n      to: 'experiment_run_tests_pricing_tier',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'pricing_tier',\n      reason: 'Split 1 closure (since v0.2.7). Pricing tier tests happen during run execution; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'dashboard_contains_experiment',\n      to: 'dashboard_contains_experiment_run',\n      requires_source_type: 'dashboard',\n      requires_target_type: 'experiment_run',\n      reason: 'Split 1 closure (since v0.2.7). Dashboards surface run results (the live data), not plans.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_tests_feature',\n      to: 'experiment_run_tests_feature',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'feature',\n      reason: 'Split 1 closure (since v0.2.7). Feature tests happen during run execution; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_measures_metric',\n      to: 'experiment_run_measures_metric',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'metric',\n      reason: 'Split 1 closure (since v0.2.7). Measurement is a run-time concern; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_guards_metric',\n      to: 'experiment_run_guards_metric',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'metric',\n      reason: 'Split 1 closure (since v0.2.7). Guard-metric checks are a run-time concern; retargets to experiment_run.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_measured_by_metric',\n      to: 'experiment_run_measured_by_metric',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'metric',\n      reason: 'Split 1 closure (since v0.2.7). Run-level measurement; retargets to experiment_run.',\n    },\n    // Edge consolidation: experiment_tested_via_experiment + duplicate\n    // experiment_tests_experiment both collapse into the single canonical\n    // experiment_run_tested_via_experiment_run.\n    {\n      kind: 'rename',\n      from: 'experiment_tested_via_experiment',\n      to: 'experiment_run_tested_via_experiment_run',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'experiment_run',\n      reason: 'Split 1 closure (since v0.2.7). Multi-armed iterations and replications now express run-to-run; CHANGELOG v0.2.7: \"the duplicate pair experiment_tested_via_experiment + experiment_tests_experiment consolidates into a single canonical experiment_run_tested_via_experiment_run\".',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_tests_experiment',\n      to: 'experiment_run_tested_via_experiment_run',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'experiment_run',\n      reason: 'Split 1 closure (since v0.2.7). Near-duplicate of experiment_tested_via_experiment; consolidated into the canonical run-to-run testing edge.',\n    },\n    // Drop: experiment_tests_hypothesis superseded by canonical\n    // experiment_run_validates_hypothesis (v0.2.6, then retargeted to\n    // hypothesis_claim in v0.2.8).\n    {\n      kind: 'drop',\n      from: 'experiment_tests_hypothesis',\n      reason: 'Split 1 closure (since v0.2.7). Superseded by the canonical experiment_run_validates_hypothesis (causal) introduced in v0.2.6; the run is what validates the hypothesis, not an abstract experiment. CHANGELOG v0.2.7: \"Edge dropped: experiment_tests_hypothesis is removed; superseded by the canonical experiment_run_validates_hypothesis (causal) introduced in v0.2.6.\"',\n    },\n\n    // ── split 2: 5 user_story-edge retargets + 2 drops ─────────────\n    // CHANGELOG v0.2.7 §\"Breaking split 2\" enumerates the full\n    // list. user_story → story_task 1→1 alias lives in\n    // UPG_MIGRATIONS[\"0.2.7\"]; full statement+task split lives in\n    // UPG_SPLIT_MIGRATIONS[\"0.2.7\"].\n    {\n      kind: 'rename',\n      from: 'epic_specified_by_user_story',\n      to: 'epic_specified_by_story_statement',\n      requires_source_type: 'epic',\n      requires_target_type: 'story_statement',\n      reason: 'Epics own the spec (statement), not the work (task). Retargets to story_statement.',\n    },\n    {\n      kind: 'rename',\n      from: 'user_story_verified_by_acceptance_criterion',\n      to: 'story_statement_verified_by_acceptance_criterion',\n      requires_source_type: 'story_statement',\n      requires_target_type: 'acceptance_criterion',\n      reason: 'Acceptance criteria define what done looks like for the spec; retargets source to story_statement.',\n    },\n    {\n      kind: 'rename',\n      from: 'test_case_covers_user_story',\n      to: 'test_case_covers_story_statement',\n      requires_source_type: 'test_case',\n      requires_target_type: 'story_statement',\n      reason: 'Test cases cover the spec, not the work; retargets target to story_statement.',\n    },\n    // user_story_broken_into_task drops; consolidated into the implements edge.\n    {\n      kind: 'drop',\n      from: 'user_story_broken_into_task',\n      reason: 'Consolidated into the canonical implements edge (the relationship now flows from task to statement directly). CHANGELOG v0.2.7: \"user_story_broken_into_task → dropped.\"',\n    },\n    // NOTE: the v0.2.7 drop of `task_implements_user_story` was REMOVED at v0.7.0\n    // (UPG-571). Re-canonicalising story_statement → user_story makes\n    // `task_implements_user_story` the canonical implements edge again, so the\n    // name is no longer retired (a drop rule must never name a canonical edge).\n    // Legacy pre-0.2.7 instances are reconnected by the v0.2.7 split's emitted\n    // implements edge; any residual dangling edge is handled by\n    // repair_dangling_edges.\n  ],\n\n  '0.2.8': [\n    // ── split 3: 12 hypothesis-edge retargets + 1 drop ─────────────\n    // PR #1151 diff of UPG_EDGE_CATALOG enumerates the full retarget list.\n    // The 12 retargets all change a `hypothesis` endpoint (source or\n    // target, occasionally both) to `hypothesis_claim`. The dropped edge\n    // (`evidence_supports_hypothesis`) is structurally superseded by\n    // `hypothesis_evidence_supports_hypothesis_claim` whose source is a\n    // *different* entity type (`hypothesis_evidence`); so it cannot\n    // round-trip via a flat rename and is registered as a drop.\n    {\n      kind: 'rename',\n      from: 'solution_proposes_hypothesis',\n      to: 'solution_proposes_hypothesis_claim',\n      requires_source_type: 'solution',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim (the canonical \"hypothesis\" is now the claim); source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'hypothesis_requires_experiment_plan',\n      to: 'hypothesis_claim_requires_experiment_plan',\n      requires_source_type: 'hypothesis_claim',\n      requires_target_type: 'experiment_plan',\n      reason: 'Source hypothesis migrated to hypothesis_claim. (This edge was already retargeted target-side from experiment to experiment_plan in v0.2.7; v0.2.8 closes the source-side retarget.)',\n    },\n    {\n      kind: 'rename',\n      from: 'hypothesis_planned_via_test_plan',\n      to: 'hypothesis_claim_planned_via_test_plan',\n      requires_source_type: 'hypothesis_claim',\n      requires_target_type: 'test_plan',\n      reason: 'Source hypothesis migrated to hypothesis_claim; target unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'hypothesis_investigated_via_research_plan',\n      to: 'hypothesis_claim_investigated_via_research_plan',\n      requires_source_type: 'hypothesis_claim',\n      requires_target_type: 'research_plan',\n      reason: 'Source hypothesis migrated to hypothesis_claim; target unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'learning_updates_hypothesis',\n      to: 'learning_updates_hypothesis_claim',\n      requires_source_type: 'learning',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'assumption_becomes_hypothesis',\n      to: 'assumption_becomes_hypothesis_claim',\n      requires_source_type: 'assumption',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'experiment_run_validates_hypothesis',\n      to: 'experiment_run_validates_hypothesis_claim',\n      requires_source_type: 'experiment_run',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Closes the deferred target retarget from v0.2.6 (experiment_run_validates_hypothesis was introduced in v0.2.6 with target=hypothesis; v0.2.8 retargets to hypothesis_claim).',\n    },\n    {\n      kind: 'rename',\n      from: 'variant_tests_hypothesis',\n      to: 'variant_tests_hypothesis_claim',\n      requires_source_type: 'variant',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'churn_reason_generates_hypothesis',\n      to: 'churn_reason_generates_hypothesis_claim',\n      requires_source_type: 'churn_reason',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'learning_refines_hypothesis',\n      to: 'learning_refines_hypothesis_claim',\n      requires_source_type: 'learning',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'feature_tests_hypothesis',\n      to: 'feature_tests_hypothesis_claim',\n      requires_source_type: 'feature',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    {\n      kind: 'rename',\n      from: 'prototype_tests_hypothesis',\n      to: 'prototype_tests_hypothesis_claim',\n      requires_source_type: 'prototype',\n      requires_target_type: 'hypothesis_claim',\n      reason: 'Target hypothesis migrated to hypothesis_claim; source unchanged.',\n    },\n    // Drop: evidence_supports_hypothesis superseded by canonical\n    // hypothesis_evidence_supports_hypothesis_claim (different source type).\n    {\n      kind: 'drop',\n      from: 'evidence_supports_hypothesis',\n      reason: 'Superseded by the canonical hypothesis_evidence_supports_hypothesis_claim. The source type changes (evidence → hypothesis_evidence, the new dedicated P2 scored-assessment entity), so this is a structural drop rather than a key rename. Consumers walking dropped edges may opt to spawn hypothesis_evidence rows post-migration (out-of-band adapter logic). CHANGELOG v0.2.8: \"Edge dropped: evidence_supports_hypothesis; superseded by the canonical hypothesis_evidence_supports_hypothesis_claim.\"',\n    },\n\n    // ── v0.2.8 closure: direction-flip rename ──────────────────────\n    // Pre-v0.2 graphs minted `hypothesis_contains_feature` (source=hypothesis,\n    // target=feature) to express \"this hypothesis is tested by this feature\".\n    // The canonical relationship runs the OTHER way: `feature_tests_hypothesis_claim`\n    // (source=feature, target=hypothesis_claim, classification: cross-domain)\n    // because a feature is what tests a claim, not the reverse. After\n    // node migration of hypothesis → hypothesis_claim, the legacy edge has\n    // post-migration endpoints (source: hypothesis_claim, target: feature);\n    // flipping endpoints + retyping produces the canonical edge.\n    //\n    // First real consumer of `flip: true` since the field was introduced\n    // in.\n    {\n      kind: 'rename',\n      from: 'hypothesis_contains_feature',\n      to: 'feature_tests_hypothesis_claim',\n      flip: true,\n      requires_source_type: 'hypothesis_claim',\n      requires_target_type: 'feature',\n      reason: 'Closure (since v0.2.8). Pre-v0.2 graphs minted hypothesis_contains_feature (source=hypothesis → target=feature). The canonical relationship runs the other way: feature_tests_hypothesis_claim (source=feature → target=hypothesis_claim, cross-domain). Post node migration of hypothesis → hypothesis_claim, this rule flips endpoints and retypes. Cross-graph audit: 10 edges in entopo.upg.',\n    },\n  ],\n}\n\n/**\n * Get all edge migration rules between two versions, in version order.\n *\n * @example\n * // v0.2.0 backfill: six jtbd→job edge renames.\n * const rules = getUPGEdgeMigrations('0.0.0', '0.2.0')\n * rules.length // → 6\n * rules.every(r => r.kind === 'rename') // → true\n *\n * @example\n * // Full v0.2.x range: every rule from v0.2.0 + v0.2.7 + v0.2.8.\n * getUPGEdgeMigrations('0.0.0', '0.2.8').filter(r => r.kind === 'drop').length // → 4\n */\nexport function getUPGEdgeMigrations(\n  fromVersion: string,\n  toVersion: string,\n): UPGEdgeMigration[] {\n  const result: UPGEdgeMigration[] = []\n  for (const [version, migrations] of Object.entries(UPG_EDGE_MIGRATIONS)) {\n    if (versionInRange(version, fromVersion, toVersion)) {\n      result.push(...migrations)\n    }\n  }\n  return result\n}\n\n/**\n * Endpoint context for `migrateEdge` guard evaluation.\n *\n * Both `sourceType` and `targetType` should be the *post-migration* node\n * types (i.e. after `migrateNode` / `applySplit` has run on the endpoints).\n * When omitted, rules with `requires_source_type` / `requires_target_type`\n * guards are skipped (safer default; a guard that cannot be evaluated\n * does not fire).\n */\nexport interface UPGEdgeMigrationEndpoints {\n  /** Post-migration source-node type (after `migrateNode` / `applySplit`). */\n  sourceType?: string\n  /** Post-migration target-node type (after `migrateNode` / `applySplit`). */\n  targetType?: string\n}\n\n/**\n * Walk the edge-migration chain for `edge_type` until reaching a value that\n * exists in `UPG_EDGE_CATALOG` (the current canonical name) or the chain\n * dead-ends.\n *\n * **Why this exists.** `UPG_EDGE_MIGRATIONS` accumulates rules across the\n * spec's history. A single edge can be renamed multiple times, and the\n * direction can reverse (e.g. v0.2.8 renamed `solution_proposes_hypothesis`\n * → `solution_proposes_hypothesis_claim`, then v0.4.0 renamed the latter\n * back to the former). Naively picking \"the first rule whose `from` matches\"\n * surfaces a stale migration target. The validator's `edge_drift`\n * suggestions need to land on the *current* canonical name, not whatever\n * intermediate the chain hop happens to be next.\n *\n * **Resolution strategy.** Process all rules across all versions, sorted\n * latest-version first per `from` key. From a given starting key, follow\n * the highest-version `rename` rule whose `from` matches; if the result is\n * in `UPG_EDGE_CATALOG`, return it (canonical). Otherwise re-enter with the\n * new key and continue. Cycles are detected and broken to return a `cycle`\n * outcome rather than loop forever.\n *\n * **Return values.**\n *  - `{ kind: 'canonical', to }`: the walk landed on a key present in\n *    `UPG_EDGE_CATALOG`. Callers should suggest `to` as the migration target.\n *  - `{ kind: 'drop' }`: the walk encountered a `drop` rule. The edge has\n *    no canonical replacement.\n *  - `{ kind: 'dead_end', last }`: no rule matched and `last` is not in\n *    `UPG_EDGE_CATALOG`. The edge is non-canonical with no known migration\n *    target.\n *  - `{ kind: 'cycle', visited }`: a cycle was detected. Returned so\n *    callers can degrade gracefully. Should not happen in practice given\n *    the version-ordered structure of `UPG_EDGE_MIGRATIONS`.\n *\n * **Caller note.** Callers that already know `edge_type` is canonical\n * (i.e. `edge_type in UPG_EDGE_CATALOG`) should NOT call this helper;\n * there's nothing to suggest. The helper is for the case where the edge\n * type is deprecated and the caller needs to find its canonical successor.\n *\n * @example\n * // Single-hop walk: deprecated → canonical in one step.\n * walkMigrationChainToCanonical('solution_proposes_hypothesis_claim', UPG_EDGE_CATALOG)\n * // → { kind: 'canonical', to: 'solution_proposes_hypothesis' }\n *\n * @example\n * // Drop rule short-circuits the walk.\n * walkMigrationChainToCanonical('experiment_tests_hypothesis', UPG_EDGE_CATALOG)\n * // → { kind: 'drop' }\n *\n * @example\n * // Already-canonical edge type: returns dead_end because the helper is\n * // intended for non-canonical callers. The 'canonical' branch fires only\n * // when the chain ENDS on a catalog entry, not when it STARTS on one.\n * // (In practice the validator skips this case before calling.)\n */\nexport type WalkMigrationChainResult =\n  | { kind: 'canonical'; to: string }\n  | { kind: 'drop' }\n  | { kind: 'dead_end'; last: string }\n  | { kind: 'cycle'; visited: readonly string[] }\n\nexport function walkMigrationChainToCanonical(\n  edge_type: string,\n  catalog: Readonly<Record<string, unknown>>,\n): WalkMigrationChainResult {\n  // Build a deduplicated `from → highest-version rule` map. Sorting versions\n  // ascending and overwriting ensures the latest rule wins per `from` key;\n  // so a v0.4.0 rule beats a v0.2.8 rule for the same `from`.\n  const latestRuleByFrom = new Map<string, UPGEdgeMigration>()\n  const sortedVersions = Object.keys(UPG_EDGE_MIGRATIONS).sort(compareVersions)\n  for (const version of sortedVersions) {\n    for (const rule of UPG_EDGE_MIGRATIONS[version]) {\n      latestRuleByFrom.set(rule.from, rule)\n    }\n  }\n\n  const visited = new Set<string>()\n  let current = edge_type\n  // Cap iteration as a defensive guard against pathological chains.\n  // No real migration chain exceeds a handful of hops; this just bounds the\n  // worst case.\n  const MAX_HOPS = 32\n  for (let hop = 0; hop < MAX_HOPS; hop++) {\n    if (visited.has(current)) {\n      return { kind: 'cycle', visited: Array.from(visited) }\n    }\n    visited.add(current)\n\n    // Canonical: we've landed on something the catalog declares; stop.\n    if (current in catalog) {\n      return { kind: 'canonical', to: current }\n    }\n\n    const rule = latestRuleByFrom.get(current)\n    if (!rule) {\n      // No rule for the current key and it's not canonical; chain dead-ends.\n      return { kind: 'dead_end', last: current }\n    }\n    if (rule.kind === 'drop') {\n      return { kind: 'drop' }\n    }\n    // rename: hop to the next key. Endpoint guards are intentionally\n    // ignored here: the walker resolves the *type chain*, not whether a\n    // specific edge instance can apply the rule. The caller (validator\n    // edge_drift logic) only needs the final canonical name to suggest.\n    current = rule.to\n  }\n  return { kind: 'dead_end', last: current }\n}\n\n/**\n * Apply edge migrations to a single edge.\n *\n * Returns:\n *   - the original edge (un-shaped, referentially equal) if no rule matched;\n *   - a new edge with retyped `type` (and possibly swapped `source`/`target`\n *     when the rule sets `flip: true`) if a `rename` rule matched;\n *   - `null` if a `drop` rule matched; caller should remove the edge.\n *\n * Endpoint guards (`requires_source_type` / `requires_target_type`) check\n * the *post-migration* endpoint types provided via `endpoints`. When\n * `endpoints` is omitted, guarded rules are skipped; callers running edge\n * migration in isolation (without endpoint type context) get only the\n * un-guarded rules.\n *\n * `T` is the caller's edge shape; only `type` is required. `source` and\n * `target` are touched only when `flip: true` and are otherwise preserved\n * verbatim.\n *\n * @example\n * // No rule matches; edge passes through unchanged.\n * const edge = { id: 'e1', type: 'persona_pursues_job' }\n * migrateEdge(edge, '0.2.0', '0.2.8') === edge // → true\n *\n * @example\n * // Rename rule matches with endpoint guards satisfied.\n * const legacy = { id: 'e2', source: 'p1', target: 'j1', type: 'persona_has_jtbd' }\n * const migrated = migrateEdge(legacy, '0.0.0', '0.2.0', { sourceType: 'persona', targetType: 'job' })\n * migrated?.type // → 'persona_pursues_job'\n *\n * @example\n * // Drop rule matches; null signals \"remove this edge\".\n * const dropped = { id: 'e3', type: 'experiment_tests_hypothesis' }\n * migrateEdge(dropped, '0.0.0', '0.2.7') // → null\n */\nexport function migrateEdge<T extends { type: string; source?: unknown; target?: unknown }>(\n  edge: T,\n  fromVersion: string,\n  toVersion: string,\n  endpoints?: UPGEdgeMigrationEndpoints,\n): T | null {\n  const rules = getUPGEdgeMigrations(fromVersion, toVersion)\n  for (const rule of rules) {\n    if (rule.from !== edge.type) continue\n    if (rule.kind === 'drop') return null\n    // rename: evaluate endpoint guards.\n    if (rule.requires_source_type !== undefined) {\n      if (endpoints?.sourceType !== rule.requires_source_type) continue\n    }\n    if (rule.requires_target_type !== undefined) {\n      if (endpoints?.targetType !== rule.requires_target_type) continue\n    }\n    if (rule.flip) {\n      return { ...edge, type: rule.to, source: edge.target, target: edge.source }\n    }\n    return { ...edge, type: rule.to }\n  }\n  return edge\n}\n","/**\n * UPG Status Migrations. Maps legacy status values to canonical lifecycle\n * phases per entity type, surfacing automated cleanup for the largest single\n * drift class in real product graphs.\n *\n * Sibling to `migrations.ts`. The other migration maps (`UPG_MIGRATIONS`,\n * `UPG_PROPERTY_MIGRATIONS`, `UPG_EDGE_MIGRATIONS`, `UPG_SPLIT_MIGRATIONS`)\n * cover entity-type renames, property-shape evolution, edge-key retargeting,\n * and 1→N splits respectively. This map fills the remaining axis: when a\n * type's lifecycle exists but the graph carries pre-canonical status values\n * the lifecycle never had.\n *\n * Source: live drift in `.upg/entopo.upg`, `.upg/nimbus.upg`, and\n * `.upg/inkling.upg` surveyed during the v0.5 launch train (UPG-527).\n * Highest single drift class: 173 `service` nodes with `status: \"active\"`\n * against the canonical `[development, staging, production, deprecated]`\n * lifecycle.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGEntityType } from '../catalog/entity-catalog.js'\nimport { getLifecycleForType } from './lifecycles.js'\n\n/**\n * Per-entity-type map of legacy status values to canonical lifecycle phases.\n *\n * Each top-level key is an entity type; each inner key is a legacy status\n * value observed in real graphs; the value is the canonical phase id from\n * that type's lifecycle. Entity types absent from this map have no\n * registered status migration; `migrateStatusValue` returns `null` for\n * them, signalling \"no automated fix; surface to operator\".\n *\n * **Population strategy.** Only mappings that are unambiguous from observed\n * usage are included. Where a legacy value could plausibly map to two\n * different canonical phases, the type is left empty rather than guessing.\n *\n * **Why this is a map of maps rather than a list of rules.** Status values\n * are entity-type-scoped: `\"active\"` means different things on `service`,\n * `feature`, and `hypothesis`. A flat `[{ from, to, type }]` list would\n * force every lookup to filter; a map of maps gives O(1) `[type][value]`\n * lookup and makes the per-type registry obvious to readers.\n */\nexport const UPG_STATUS_MIGRATIONS: Partial<Record<UPGEntityType, Record<string, string>>> = {\n  // ── Engineering / Operations ─────────────────────────────────────────────\n  // ── Agent automation: WORK_ITEM -> OPERATIONAL (0.33.0) ──────────────────\n  // agent_skill and agent_hook carried WORK_ITEM until 0.33.0, so every graph\n  // written before it holds WORK_ITEM phase ids against an OPERATIONAL\n  // lifecycle. Measured population at release: 4 nodes, all `todo`. The other\n  // five entries cover the phases those graphs could legally have reached.\n  //\n  // in_review maps to `active` rather than to a review phase because OPERATIONAL\n  // has none: a hook awaiting review is still a hook that is running or about to.\n  // cancelled maps to `sunset` rather than `completed`: OPERATIONAL has no\n  // cancelled bucket and a discontinued trigger is wound down, not finished.\n  agent_skill: {\n    todo: 'planning',\n    backlog: 'planning',\n    in_progress: 'active',\n    in_review: 'active',\n    done: 'completed',\n    cancelled: 'sunset',\n  },\n  agent_hook: {\n    todo: 'planning',\n    backlog: 'planning',\n    in_progress: 'active',\n    in_review: 'active',\n    done: 'completed',\n    cancelled: 'sunset',\n    // The AgentHookProperties.hook_status vocabulary, @deprecated at 0.33.0 as a\n    // *_status shadow of the base `status`. `error` maps to `paused` and NOT to a\n    // failure phase: OPERATIONAL has none, and runtime health is store or\n    // telemetry state rather than a fact about the thing. That is the same cut\n    // that kept composition.rev, which is a fact, and excluded a concurrency\n    // token, which is not. The failure detail belongs in `description` or a\n    // diagnostic property.\n    disabled: 'paused',\n    error: 'paused',\n  },\n\n  service: {\n    // Lifecycle: [development, staging, production, deprecated]\n    // Authoring habit from before lifecycle adoption: every long-lived\n    // entity got `active`. For a service, \"active\" almost always means\n    // \"live in production\" (operators don't tag dev or staging services\n    // active).\n    active: 'production',\n    live: 'production',\n    inactive: 'deprecated',\n    retired: 'deprecated',\n  },\n\n  // ── Product Specification ────────────────────────────────────────────────\n  feature: {\n    // Lifecycle: [proposed, in_progress, shipped, archived]\n    // `active` on a feature is ambiguous between in_progress + shipped;\n    // for legacy graphs the most common authoring intent is \"this feature\n    // is live\", which maps to shipped.\n    active: 'shipped',\n    live: 'shipped',\n    done: 'shipped',\n    completed: 'shipped',\n    inactive: 'archived',\n    retired: 'archived',\n    deprecated: 'archived',\n  },\n\n  feature_area: {\n    // Lifecycle: [planned, active, deprecated]\n    // `active` IS canonical here, included as an identity mapping so\n    // callers don't accidentally re-rewrite it, AND so the only other\n    // observed drift values have a target.\n    live: 'active',\n    inactive: 'deprecated',\n    retired: 'deprecated',\n  },\n\n  // ── Discovery & Validation ───────────────────────────────────────────────\n  // (hypothesis moved to the VALIDATION template fold section below, 0.21.0)\n  opportunity: {\n    // Lifecycle: [identified, validated, deferred]  (no terminal phases)\n    // Common authoring leftovers from pre-canonical Lean Canvas\n    // vocabularies.\n    new: 'identified',\n    open: 'identified',\n    discovered: 'identified',\n    parked: 'deferred',\n    archived: 'deferred',\n  },\n\n  initiative: {\n    // Lifecycle: [proposed, in_progress, completed, abandoned]\n    active: 'in_progress',\n    running: 'in_progress',\n    done: 'completed',\n    shipped: 'completed',\n    cancelled: 'abandoned',\n    deferred: 'abandoned',\n  },\n\n  // ── Decisions: APPROVAL template ─────────────────────────────────────────\n  decision: {\n    // Lifecycle (APPROVAL): [proposed, reviewing, approved, rejected, deprecated]\n    open: 'proposed',\n    draft: 'proposed',\n    pending: 'reviewing',\n    in_review: 'reviewing',\n    accepted: 'approved',\n    declined: 'rejected',\n    superseded: 'deprecated',\n  },\n\n  // ── Engineering: deployment ──────────────────────────────────────────────\n  deployment: {\n    // Lifecycle: [rolling, success, failure]\n    // Deployments are events; once terminal they don't move. Most legacy\n    // values describe a settled outcome.\n    in_progress: 'rolling',\n    deploying: 'rolling',\n    completed: 'success',\n    succeeded: 'success',\n    done: 'success',\n    failed: 'failure',\n    rolled_back: 'failure',\n  },\n\n  // ── DevOps: monitor (OPERATIONAL template) ───────────────────────────────\n  monitor: {\n    // Lifecycle (OPERATIONAL): [planning, active, paused, completed, sunset]\n    inactive: 'paused',\n    disabled: 'paused',\n    archived: 'sunset',\n    retired: 'sunset',\n  },\n\n  // ── VALIDATION template fold (UPG-690, 0.21.0) ───────────────────────────\n  // Bespoke claim vocabularies remapped onto VALIDATION\n  // [untested, testing, validated, invalidated, archived].\n  // `assumption` already matches (untested, testing, validated, invalidated) —\n  // no migration entry needed.\n  prototype: {\n    // was [untested, testing, passed, failed]\n    passed: 'validated',\n    failed: 'invalidated',\n  },\n  value_proposition: {\n    // was [drafted, testing, validated, invalidated]\n    drafted: 'untested',\n  },\n  hypothesis: {\n    // was [drafted, active, validated, invalidated, archived] (HYPOTHESIS_CLAIM\n    // const, re-homed to entity_type 'hypothesis' at v0.4.0). The legacy\n    // pre-v0.2.8 [untested, testing, resolved] mapping already lived here; it is\n    // now consistent with the VALIDATION spine.\n    drafted: 'untested',\n    active: 'testing',\n    // pre-v0.2.8 legacy values (kept from the prior hypothesis migration):\n    proposed: 'untested',\n    deferred: 'archived',\n    resolved: 'validated', // ambiguous historically; prefer validated on resolve\n  },\n\n  // ── STUDY template fold (UPG-690, 0.21.0) ────────────────────────────────\n  // Bespoke run/study vocabularies remapped onto STUDY\n  // [planned, running, analysing, complete, abandoned].\n  experiment: {\n    // was [planned, running, analysing, done]\n    done: 'complete',\n  },\n  experiment_run: {\n    // was [in_progress, complete, aborted]\n    in_progress: 'running',\n    aborted: 'abandoned',\n  },\n  research_study: {\n    // was [planned, in_progress, analysing, complete]\n    in_progress: 'running',\n  },\n  design_sprint: {\n    // was [planning, in_progress, completed]\n    planning: 'planned',\n    in_progress: 'running',\n    completed: 'complete',\n  },\n  feasibility_study: {\n    // was [scoped, analysing, concluded, abandoned]\n    scoped: 'planned',\n    concluded: 'complete',\n  },\n  ai_experiment: {\n    // was [planned, running, analysed, completed, abandoned]\n    analysed: 'analysing',\n    completed: 'complete',\n  },\n  eval_run: {\n    // was [planned, running, complete, failed]. `failed` = the run did not\n    // finish cleanly (errored / killed) → abandoned. A completed run whose\n    // result was negative stays `complete` (the verdict lives elsewhere).\n    failed: 'abandoned',\n  },\n\n  // ── INCIDENT template fold (UPG-690, 0.21.0) ─────────────────────────────\n  // Bespoke triage vocabularies remapped onto INCIDENT\n  // [open, triaged, in_progress, resolved, closed, wont_fix]. `incident` itself\n  // is NOT folded (stays bespoke; see the DevOps entry below).\n  support_ticket: {\n    // was [opened, triaged, in_progress, resolved, closed]\n    opened: 'open',\n  },\n  bug: {\n    // was [open, in_progress, fixed, verified, wont_fix]\n    fixed: 'in_progress', // fixed-but-not-verified is still work in progress\n    verified: 'resolved',\n  },\n  a11y_issue: {\n    // was [open, triaged, in_progress, fixed, verified, accepted]\n    fixed: 'in_progress',\n    verified: 'resolved',\n    accepted: 'resolved', // verified-and-accepted == resolved\n  },\n  vulnerability: {\n    // was [open, triaged, in_progress, mitigated, resolved, accepted]\n    mitigated: 'in_progress', // mitigation applied, not yet fully resolved\n    accepted: 'resolved',\n  },\n  hallucination_report: {\n    // was [reported, investigating, resolved, accepted]\n    reported: 'open',\n    investigating: 'in_progress',\n    accepted: 'resolved',\n  },\n  technical_debt_item: {\n    // was [identified, acknowledged, in_progress, resolved, accepted]\n    identified: 'open',\n    acknowledged: 'triaged',\n    accepted: 'resolved',\n  },\n  customer_feedback: {\n    // was [received, triaged, actioned, acknowledged]\n    received: 'open',\n    actioned: 'resolved',\n    acknowledged: 'closed', // noted with no action == administratively closed\n  },\n\n  // ── DevOps: incident (stays bespoke — richer SRE flow, not folded) ────────\n  incident: {\n    // Lifecycle: [detected, triaged, contained, resolved, mitigated]\n    open: 'detected',\n    new: 'detected',\n    investigating: 'triaged',\n    in_progress: 'triaged',\n    closed: 'resolved',\n    fixed: 'resolved',\n  },\n\n  // ── UX/Design: screen (UPG-690 Q3/D.3, 0.21.0) — MATURITY → build-pipeline\n  // flip. Old lifecycle [alpha, beta, ga, deprecated]; new SCREEN_LIFECYCLE\n  // [draft, in_design, built, shipped, deprecated]. `deprecated` IS canonical\n  // in both (no rewrite needed); omitted per the no-identity-entries doctrine\n  // (see status-migrations.test.ts).\n  screen: {\n    alpha: 'built',\n    beta: 'shipped',\n    ga: 'shipped',\n  },\n}\n\n/**\n * Look up the canonical replacement for a legacy status value on the given\n * entity type. Returns `null` when no migration is registered.\n *\n * Caller contract: only invoke when the current status is known-invalid\n * for the entity's lifecycle. `null` signals \"no automated fix is on\n * file; surface to the operator\". The presence of a mapping does NOT\n * imply the current status is invalid; checking validity is the caller's\n * job (typically via `getLifecycleForType(entityType).phases`).\n *\n * @example\n * migrateStatusValue('service', 'active')      // → 'production'\n * migrateStatusValue('service', 'unknown_val') // → null\n * migrateStatusValue('persona', 'active')      // → null (no map registered)\n */\nexport function migrateStatusValue(\n  entityType: string,\n  currentStatus: string,\n): string | null {\n  const typeMap = (UPG_STATUS_MIGRATIONS as Record<string, Record<string, string> | undefined>)[entityType]\n  if (!typeMap) return null\n  return typeMap[currentStatus] ?? null\n}\n\n/**\n * Return true when the (entityType, currentStatus) pair has a registered\n * canonical replacement that ALSO differs from the current value.\n *\n * Useful for filter predicates: callers usually only care about migrations\n * that would actually mutate the node. An identity mapping\n * (`active → active` on `feature_area`) is a registered migration but\n * shouldn't trigger a rewrite.\n */\nexport function hasStatusMigration(\n  entityType: string,\n  currentStatus: string,\n): boolean {\n  const replacement = migrateStatusValue(entityType, currentStatus)\n  return replacement !== null && replacement !== currentStatus\n}\n\n/**\n * Audit helper: enumerate every (entityType, legacyStatus, canonicalStatus)\n * triple in the registry. Useful for changelogs, doc generation, and\n * spec-coverage tests.\n */\nexport function listStatusMigrations(): Array<{\n  entity_type: string\n  from: string\n  to: string\n}> {\n  const out: Array<{ entity_type: string; from: string; to: string }> = []\n  for (const [entityType, map] of Object.entries(UPG_STATUS_MIGRATIONS)) {\n    if (!map) continue\n    for (const [from, to] of Object.entries(map)) {\n      out.push({ entity_type: entityType, from, to })\n    }\n  }\n  return out\n}\n\n/**\n * Spec-coherence helper: returns the entity types in\n * `UPG_STATUS_MIGRATIONS` whose registered canonical replacements are NOT\n * valid phases in the type's lifecycle. Used by the spec-integrity test to\n * catch drift between the migration map and the lifecycle catalog.\n *\n * An empty array means every replacement target resolves to a real phase.\n * Entries here mean either:\n *\n *   - the lifecycle changed but the migration map was not updated, OR\n *   - the lifecycle is missing entirely (template-generated types whose\n *     template id moved).\n *\n * Both cases are spec defects worth surfacing.\n */\nexport function findInvalidStatusMigrationTargets(): Array<{\n  entity_type: string\n  from: string\n  to: string\n  reason: 'no_lifecycle' | 'unknown_phase'\n}> {\n  const out: Array<{\n    entity_type: string\n    from: string\n    to: string\n    reason: 'no_lifecycle' | 'unknown_phase'\n  }> = []\n  for (const [entityType, map] of Object.entries(UPG_STATUS_MIGRATIONS)) {\n    if (!map) continue\n    const lifecycle = getLifecycleForType(entityType)\n    if (!lifecycle) {\n      for (const [from, to] of Object.entries(map)) {\n        out.push({ entity_type: entityType, from, to, reason: 'no_lifecycle' })\n      }\n      continue\n    }\n    const validPhases = new Set(lifecycle.phases.map((p) => p.id))\n    for (const [from, to] of Object.entries(map)) {\n      if (!validPhases.has(to)) {\n        out.push({ entity_type: entityType, from, to, reason: 'unknown_phase' })\n      }\n    }\n  }\n  return out\n}\n","/**\n * UPG slug generation + collision handling.\n *\n * `slug` is the human-readable handle used in inline `[[type:slug]]` chips\n * inside `.upg.md` documents (v0.2.2). Each node carries an\n * optional `slug` plus an `aliases[]` array of past slugs.\n *\n * Rules:\n * - Lowercase ASCII only; accents stripped via NFKD; emojis and non-ASCII\n *   word chars dropped.\n * - Whitespace + underscores collapse to single `-`.\n * - Punctuation removed; runs of `-` collapsed to one.\n * - Leading / trailing `-` trimmed.\n * - Empty result (e.g. emoji-only title) → fallback to `untitled`.\n * - Uniqueness is scoped `(product_id, type)`; resolveSlugCollision appends\n *   `-2`, `-3`, … against an existing-slug set.\n *\n * The set used for collision detection MUST include both current `slug`\n * values AND every `aliases[]` value within the same `(product_id, type)`,\n * so a renamed slug never collides with a still-resolvable alias.\n */\n\nimport type { UPGBaseNode } from '../shapes/base-node.js'\n\nconst FALLBACK = 'untitled'\n\n/**\n * Generate a slug from a title. Pure function, no collision check.\n *\n * @example\n * generateSlug('Tree navigation outcome') // => 'tree-navigation-outcome'\n * generateSlug('Café résumé') // => 'cafe-resume'\n * generateSlug('  hello___world  ') // => 'hello-world'\n * generateSlug('🎉') // => 'untitled'\n */\nexport function generateSlug(title: string): string {\n  if (!title) return FALLBACK\n  const normalised = title\n    .normalize('NFKD')\n    .replace(/[̀-ͯ]/g, '') // strip combining diacritics\n    .toLowerCase()\n    .replace(/[_\\s]+/g, '-')\n    .replace(/[^a-z0-9-]/g, '')\n    .replace(/-+/g, '-')\n    .replace(/^-+|-+$/g, '')\n  return normalised || FALLBACK\n}\n\n/**\n * Resolve a base slug against an existing-slug set, appending `-2`, `-3`,\n * etc. as needed. Returns the original slug if it does not collide.\n *\n * The `existing` set MUST cover both current `slug` values and every\n * `aliases[]` value within the same `(product_id, type)`.\n *\n * @example\n * resolveSlugCollision('foo', new Set()) // => 'foo'\n * resolveSlugCollision('foo', new Set(['foo'])) // => 'foo-2'\n * resolveSlugCollision('foo', new Set(['foo', 'foo-2'])) // => 'foo-3'\n */\nexport function resolveSlugCollision(base: string, existing: ReadonlySet<string>): string {\n  if (!existing.has(base)) return base\n  let n = 2\n  while (existing.has(`${base}-${n}`)) n++\n  return `${base}-${n}`\n}\n\n/**\n * Build the existing-slug set for a `(type)` cohort within a single product.\n * Pass the nodes of one product; the helper picks the ones with the given\n * type and accumulates their `slug` and `aliases` values.\n */\nexport function collectSlugsForType(\n  nodes: readonly Pick<UPGBaseNode, 'type' | 'slug' | 'aliases'>[],\n  type: string,\n): Set<string> {\n  const out = new Set<string>()\n  for (const n of nodes) {\n    if (n.type !== type) continue\n    if (n.slug) out.add(n.slug)\n    if (n.aliases) for (const a of n.aliases) out.add(a)\n  }\n  return out\n}\n\n/**\n * Backfill `slug` on a node if it's missing. Mutates and returns the node.\n * Pass the existing-slug set for the node's type so collisions resolve.\n *\n * Idempotent: if `node.slug` is already set, returns the node unchanged\n * and does not touch `existing`.\n */\nexport function backfillSlug<T extends Pick<UPGBaseNode, 'title' | 'type' | 'slug' | 'aliases'>>(\n  node: T,\n  existing: Set<string>,\n): T {\n  if (node.slug) return node\n  const base = generateSlug(node.title)\n  const resolved = resolveSlugCollision(base, existing)\n  node.slug = resolved\n  existing.add(resolved)\n  return node\n}\n\n/**\n * Rotate a slug rename: push the old slug into `aliases[]` (deduped) and\n * set the new slug. No-op if `next` equals the current slug.\n */\nexport function rotateSlug<T extends Pick<UPGBaseNode, 'slug' | 'aliases'>>(\n  node: T,\n  next: string,\n): T {\n  const current = node.slug\n  if (current === next) return node\n  if (current) {\n    const aliases = node.aliases ?? []\n    if (!aliases.includes(current)) aliases.push(current)\n    node.aliases = aliases\n  }\n  node.slug = next\n  return node\n}\n","/**\n * Cross-product edge scope — the derived 3-state model (0.18.0). Layer 2: it\n * bridges the cross-product facts that already live split across lower layers —\n * `UPG_CROSS_EDGE_TYPES` (shapes/document), the catalog `cross_product_eligible`\n * flags (catalog/edge-catalog), and `portfolio_shared` (registry/entity-meta).\n *\n * Cross-product eligibility is NOT cleanly derivable from a single per-edge signal:\n * endpoint entity-TIER is necessary but not sufficient (a \"≥1 shared endpoint ⇒\n * eligible\" rule over-admits ~5×, because portfolio-shared types also anchor rich\n * within-graph decomposition). So eligibility is a two-layer model:\n *\n *  - **curated**     — the blessed canonical set (`UPG_CROSS_EDGE_TYPES`, 61 types:\n *                      21 portfolio-native + 40 catalog-flagged `cross_product_eligible`).\n *                      Hard-allow at the write surface, no warning.\n *  - **provisional** — an unflagged catalog edge that PASSES the shared-tier gate\n *                      (≥1 endpoint `portfolio_shared`). Allowed at the write surface\n *                      WITH a warning, and never added to the canonical set — it only\n *                      materialises as a warning if actually authored. This is what\n *                      removes the per-edge catalog-PR friction: modelling a genuinely\n *                      cross relationship no longer needs a spec change mid-session.\n *                      The warning is WRITE-TIME only — `portfolio_validate` does not\n *                      re-surface it and is not an eligibility backstop.\n *  - **resident**    — no shared endpoint and not curated. Hard-rejected cross-product;\n *                      the containment guardrail (persona↔job↔need decompositions,\n *                      product-local reasoning) that must stay in-graph.\n *\n * WILDCARD ENDPOINTS, STATED PLAINLY (0.41.0, field report `7aaa2f7e`). The\n * mechanism is described on `isCrossCapable` below, but its consequence was\n * never written down where a reader looks for it, so a reporter reasonably\n * read a `decision_*_node` edge's absent scope as unfinished work and proposed\n * declaring it `provisional`. It cannot be declared: scope is DERIVED, never\n * authored. And `node` is not a type, so it can never be `portfolio_shared`\n * and never carries the gate on its own. Therefore:\n *\n *   **An edge with a `node` wildcard endpoint is `resident` unless its OTHER,\n *   concrete endpoint is a portfolio-shared type, or the edge type is curated\n *   into `UPG_CROSS_EDGE_TYPES` by name.**\n *\n * That is why `node_owned_by_team` is cross-capable (team is shared) while\n * `decision_influences_node`, `decision_produces_node`,\n * `decision_constrained_by_node` and `risk_threatens_node` are resident:\n * `decision` and `risk` are not in the shared tier. Only three wildcard edges\n * are cross-capable today, all of them curated BY NAME.\n *\n * Widening one is a two-option decision and BOTH amend a ratified list, which\n * is why it is not a spec-writer's call: curate the edge type by name, or\n * promote the concrete endpoint type into the portfolio-shared tier, which\n * moves every other edge touching that type at the same time.\n *\n * The gate (`isCrossCapable`) is DERIVED from `EntityTypeMeta.portfolio_shared`, so\n * the guardrail is self-maintaining: a new persona/job/need internal edge is\n * auto-rejected with no list to touch. The gate LOGIC itself never changes the\n * canonical `UPG_CROSS_EDGE_TYPES` snapshot (adapters / portfolio_query /\n * list_cross_edge_types keep reading whatever it currently is, 61 as of 0.20.1);\n * only a new `cross_product_eligible` flag or portfolio-native type grows it.\n * `crossProductScope` is a separate predicate the write + read surfaces consult.\n */\n\nimport { UPG_EDGE_CATALOG, type UPGEdgeDefinition } from '../catalog/edge-catalog.js'\nimport { isPortfolioSharedType } from '../registry/entity-meta.js'\nimport { UPG_CROSS_EDGE_TYPES } from '../shapes/document.js'\n\n/** The three cross-product states a directed relationship can occupy. */\nexport type CrossProductScope = 'curated' | 'provisional' | 'resident'\n\nconst CURATED_CROSS_EDGE_SET: ReadonlySet<string> = new Set(UPG_CROSS_EDGE_TYPES)\n\n/**\n * The shared-tier GATE: is a directed edge between these endpoint types authorable\n * across product graphs at all? True iff ≥1 endpoint type is `portfolio_shared`.\n * A `node`-wildcard endpoint never qualifies on its own (it is not shared), so the\n * decision rides on the concrete other endpoint — exactly the polymorphic\n * `node_owned_by_team` / `node_classified_as_classification_value` case.\n *\n * This is a NECESSARY condition, not sufficient: a gate-pass edge that is not curated\n * is `provisional`, not eligible. Failing the gate is the hard guardrail.\n *\n * @example\n * isCrossCapable('objective', 'metric')  // → true  (both shared)\n * isCrossCapable('node', 'team')         // → true  (team shared)\n * isCrossCapable('persona', 'job')       // → false (neither shared → resident)\n */\nexport function isCrossCapable(sourceType: string, targetType: string): boolean {\n  return isPortfolioSharedType(sourceType) || isPortfolioSharedType(targetType)\n}\n\n/**\n * True if this cross-edge type is in the curated canonical set (`UPG_CROSS_EDGE_TYPES`,\n * the 61). Distinct from the catalog's `isCrossProductEligible` (the 40 dual-registered\n * flags only): this also covers the 21 portfolio-native cross-only types.\n *\n * @example\n * isCuratedCrossEligible('shares_persona')                     // → true (portfolio-native)\n * isCuratedCrossEligible('strategic_theme_contains_objective') // → true (flagged)\n * isCuratedCrossEligible('experiment_run_measures_metric')     // → false (provisional, not curated)\n */\nexport function isCuratedCrossEligible(edgeType: string): boolean {\n  return CURATED_CROSS_EDGE_SET.has(edgeType)\n}\n\n/**\n * Classify an edge TYPE into the 3-state cross-product model. The single classifier\n * consulted by the write surfaces (curated → allow, provisional → allow+warn,\n * resident → reject) and the read surfaces (`resolve_edge_for_pair`,\n * `get_entity_schema`), so model-time guidance and write-time enforcement agree.\n *\n * Type-based (not instance-based): for a catalog edge the gate reads the DECLARED\n * endpoint types, matching how the write handlers gate on `edge.type`. A portfolio-\n * native cross-only type (no catalog def) is curated by membership.\n *\n * @example\n * crossProductScope('product_pursues_outcome')        // → 'curated'\n * crossProductScope('experiment_run_measures_metric') // → 'provisional' (metric shared)\n * crossProductScope('persona_pursues_job')            // → 'resident'\n */\nexport function crossProductScope(edgeType: string): CrossProductScope {\n  if (CURATED_CROSS_EDGE_SET.has(edgeType)) return 'curated'\n  const def = (UPG_EDGE_CATALOG as Record<string, UPGEdgeDefinition>)[edgeType]\n  if (def && isCrossCapable(def.source_type, def.target_type)) return 'provisional'\n  return 'resident'\n}\n","/**\n * UPG Property Registry: Runtime schema for entity types\n *\n * AUTO-GENERATED by scripts/generate-property-registry.ts\n * Do not edit manually. Run: npx tsx scripts/generate-property-registry.ts\n *\n * Sources: property types / enums / descriptions come from the domain\n * interfaces in src/properties/domains/*.ts (their JSDoc); the `modifier`\n * provenance annotations (derived / snapshot / volatile, property-fit audit)\n * come from the curated src/properties/property-modifier-overlay.ts. Both are\n * re-emitted here, so a regeneration reproduces this file exactly (no\n * wall-clock timestamp: generation is deterministic). This file is a GATED\n * artifact — check:generated re-runs the generator and fails on any drift, so\n * edit the sources above, never this file.\n * Entity types with properties: 327\n */\n\nexport interface PropertyDefinition {\n  type: 'string' | 'number' | 'boolean' | 'string[]' | 'object' | 'object[]' | 'assessment'\n  /**\n   * The CONTRACT: what the property means and the semantics a caller must\n   * not get wrong. Two or three sentences. This is what a hover card, a\n   * tooltip and a token-conscious agent read.\n   */\n  description?: string\n  /**\n   * The LONGFORM half (`@remarks` in the source JSDoc): rationale, edge\n   * cases, workflow recipes, design history. The reference page renders it\n   * behind a disclosure; hovers and schema summaries leave it out.\n   *\n   * Semantics MOVE here, they are never deleted. A field that stops being\n   * findable is worse than a field that is long, which is the lesson a\n   * reporter taught by concluding a capability did not exist when it was\n   * documented somewhere they did not read.\n   */\n  notes?: string\n  enum?: string[]\n  /** For 'assessment'-typed fields: the canonical UPG scale this property is rated on (e.g. 'confidence_5'). */\n  scale_id?: string\n  /** For object/assessment fields: nested property shapes. */\n  properties?: Record<string, PropertyDefinition>\n  /** For object/assessment fields: required keys within `properties`. */\n  required?: string[]\n  /**\n   * Provenance / volatility modifier (property-fit audit, 2026-06-16). Marks a property\n   * whose value is not authored-and-stable, so tooling (`validate_graph`, renderers, export)\n   * can treat it accordingly:\n   *  - `'derived'`  — computed from edges/children at read-time; never hand-authored.\n   *                   `validate_graph` flags a stored value that contradicts the graph.\n   *  - `'snapshot'` — a stale-stamped cache of a live reading; SHOULD pair with a `*_as_of`\n   *                   timestamp. Definition entities carry live state only as a snapshot.\n   *  - `'volatile'` — an environment-specific pointer (URL / path / id) that may rot or be\n   *                   stripped on export; not portable modeling knowledge (open-standard\n   *                   data-boundary ADR). Enforcement lands in `validate_graph` (mcp-server).\n   * Sourced from property-modifier-overlay.ts.\n   */\n  modifier?: 'derived' | 'snapshot' | 'volatile'\n}\n\nexport type PropertySchema = Record<string, PropertyDefinition>\n\n/**\n * Runtime property schemas for all entity types with typed properties.\n * Entity types not listed here have no typed properties (just title/description/status/tags).\n */\nexport const UPG_PROPERTY_SCHEMA: Record<string, PropertySchema> = {\n  // A11yAnnotationProperties: Accessibility annotation.\n  a11y_annotation: {\n    category: { type: 'string', enum: ['focus_order', 'alt_text', 'heading_level', 'aria_label', 'colour_contrast', 'keyboard_nav', 'screen_reader', 'motion_preference', 'other'], description: 'Category of accessibility annotation. Expanded from the original 5-value enum to cover the full range of a11y annotation types.' },\n    requirement: { type: 'string', description: 'Specific accessibility requirement described' },\n    wcag_criterion: { type: 'string', description: 'WCAG success criterion this annotation relates to' },\n    annotation_priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Priority for implementing this annotation' },\n    applied: { type: 'boolean', description: 'Whether the annotation has been implemented' },\n  },\n  // A11yAuditProperties: Accessibility audit.\n  a11y_audit: {\n    method: { type: 'string', enum: ['automated', 'manual', 'assistive_tech', 'expert'], description: 'How the audit was conducted' },\n    scope: { type: 'string', description: 'What was audited (e.g. \"homepage\", \"checkout flow\")' },\n    conformance_result: { type: 'string', enum: ['pass', 'partial', 'fail'], description: 'Overall conformance result' },\n    violations_count: { type: 'number', description: 'Number of accessibility violations found', modifier: 'derived' },\n    passes_count: { type: 'number', description: 'Number of checks that passed', modifier: 'derived' },\n    incomplete_count: { type: 'number', description: 'Number of checks that could not be completed', modifier: 'derived' },\n    score: { type: 'number', description: 'Aggregate accessibility score (0-100)' },\n    tool: { type: 'string', enum: ['axe-core', 'lighthouse', 'wave', 'manual', 'other'], description: 'Tool used to perform the audit' },\n    tool_version: { type: 'string', description: 'Version of the audit tool' },\n    url_tested: { type: 'string', description: 'URL of the page tested' },\n    audit_date: { type: 'string', description: 'Date the audit was conducted (ISO format)' },\n  },\n  // A11yGuidelineProperties: Accessibility guideline.\n  a11y_guideline: {\n    principle: { type: 'string', enum: ['perceivable', 'operable', 'understandable', 'robust'], description: 'WCAG principle this guideline falls under' },\n    guideline_number: { type: 'string', description: 'Guideline reference number (e.g. \"1.1\", \"2.4\")' },\n    level: { type: 'string', enum: ['A', 'AA', 'AAA'], description: 'WCAG conformance level required' },\n    rule_strength: { type: 'string', enum: ['must', 'must_not', 'exception', 'warning', 'guideline'], description: 'Imperative force of this guideline.' },\n  },\n  // A11yIssueProperties: Accessibility issue.\n  a11y_issue: {\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', 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`.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    wcag_criterion: { type: 'string', description: 'WCAG success criterion violated (e.g. \"1.1.1\", \"2.4.7\")' },\n    rule_id: { type: 'string', description: 'Identifier of the rule that flagged the issue' },\n    help_url: { type: 'string', description: 'URL to documentation explaining the issue and how to fix it' },\n    affected_element: { type: 'string', description: 'Description of the affected UI element' },\n    css_selector: { type: 'string', description: 'CSS selector targeting the affected element', modifier: 'volatile' },\n    html_snippet: { type: 'string', description: 'HTML snippet containing the violation', modifier: 'volatile' },\n    tags: { type: 'string[]', description: 'Tags from the audit tool (e.g. \"wcag2aa\", \"cat.color\")' },\n    remediation: { type: 'string', description: 'Recommended fix for the issue' },\n    impact_description: { type: 'string', description: 'Description of the user impact' },\n  },\n  // A11yStandardProperties: Accessibility standard.\n  a11y_standard: {\n    version: { type: 'string', description: 'Version of the standard (e.g. \"2.1\", \"2.2\")' },\n    conformance_level: { type: 'string', enum: ['A', 'AA', 'AAA'], description: 'Target conformance level' },\n  },\n  // AcceptanceCriterionProperties: Acceptance criterion on a story or feature.\n  acceptance_criterion: {\n    condition: { type: 'string', description: 'Required condition (Given/When/Then or plain text)' },\n    test_type: { type: 'string', enum: ['manual', 'automated'], description: 'Test mode' },\n    pass_status: { type: 'string', enum: ['untested', 'pass', 'fail', 'regressed', 'blocked'], description: 'Current verification state of this criterion. `untested` means never attempted; `blocked` means attempted but not verifiable for an environmental reason; `regressed` means previously passing, now failing.', notes: '`blocked` is a distinct state from `untested` (a missing credential or an unreachable dependency is not the same as nobody having tried), which the earlier three-value enum conflated into a silent gap. `regressed` is a criterion-level state and is NOT derivable here, because `acceptance_criterion` stores current state only and keeps no result history. The history lives on the `test_case` to `test_result` series, where a single execution\\'s outcome is `TestResultProperties.result_status` and can never itself be \"regressed\".' },\n  },\n  // AccessPolicyProperties: Access policy.\n  access_policy: {\n    resource: { type: 'string', description: 'Covered resource or system' },\n    principal: { type: 'string', description: 'User, role, or group granted' },\n    permission_level: { type: 'string', enum: ['read', 'write', 'admin', 'custom'], description: 'Access level' },\n    condition: { type: 'string', description: 'Conditions (e.g. \"VPN only\", \"business hours\")' },\n  },\n  // AccountProperties: Sales account.\n  account: {\n    account_type: { type: 'string', enum: ['prospect', 'customer', 'partner', 'churned'], description: 'Relationship status of this account' },\n    industry: { type: 'string', description: 'Industry vertical the account operates in' },\n    employee_count: { type: 'number', description: 'Number of employees at the account', modifier: 'snapshot' },\n    segment: { type: 'string', enum: ['smb', 'mid_market', 'enterprise', 'strategic'], description: 'Go-to-market tier this account is served at. A segmentation *decision* (how the field org treats the account), distinct from `employee_count` (a raw fact) and aligned with but not identical to the ideal customer profile\\'s `company_size` buckets. `strategic` is the tier that escalates to a dedicated account-plan graph (Tier 3 client model).' },\n    annual_contract_value: { type: 'number', description: 'Annual contract value in the account\\'s billing currency. The single most common enterprise account-tiering input; a snapshot that changes on expansion or renewal.', modifier: 'snapshot' },\n    region: { type: 'string', description: 'Geographic region the account is managed in (e.g. \"EMEA\", \"NA-West\"). Free-form: territory taxonomies vary by org and are modelled structurally via the `territory` entity when they need to be queryable.' },\n  },\n  // AcquisitionChannelProperties: AcquisitionChannel entity.\n  acquisition_channel: {\n    channel_type: { type: 'string', enum: ['seo', 'paid', 'social', 'referral', 'direct', 'content'], description: 'Category of the acquisition channel' },\n    customer_acquisition_cost: { type: 'number', description: 'Customer acquisition cost for this channel' },\n    monthly_volume: { type: 'number', description: 'Monthly volume of new users from this channel', modifier: 'snapshot' },\n  },\n  // AdCreativeProperties: Ad creative.\n  ad_creative: {\n    platform: { type: 'string', enum: ['google', 'meta', 'linkedin', 'twitter', 'other'], description: 'Advertising platform' },\n    ad_format: { type: 'string', enum: ['search', 'display', 'video', 'native', 'social'], description: 'Format of the ad unit' },\n    headline: { type: 'string', description: 'Primary headline text' },\n    call_to_action: { type: 'string', description: 'Call-to-action text' },\n    spend: { type: 'number', description: 'Total spend on this creative' },\n    impressions: { type: 'number', description: 'Total number of impressions served' },\n    clicks: { type: 'number', description: 'Total number of clicks received' },\n  },\n  // AffinityClusterProperties: Affinity cluster grouping observations.\n  affinity_cluster: {\n    theme: { type: 'string', description: 'Emergent theme label' },\n    child_observation_count: { type: 'number', description: 'Observations in this cluster', modifier: 'derived' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence in the theme\\'s validity (UPGAssessment on `confidence_5`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // AgentDefinitionProperties: Agent definition.\n  agent_definition: {\n    agent_role: { type: 'string', description: 'Role the agent plays within a workflow' },\n    agent_scope: { type: 'string', description: 'Boundaries of what this agent can act on' },\n    goal: { type: 'string', description: 'Primary objective the agent is trying to achieve' },\n    backstory: { type: 'string', description: 'Context or persona narrative for the agent' },\n    allow_delegation: { type: 'boolean', description: 'Whether the agent can delegate tasks to other agents' },\n    memory_enabled: { type: 'boolean', description: 'Whether the agent retains memory across sessions' },\n    max_iterations: { type: 'number', description: 'Maximum number of reasoning iterations allowed' },\n    max_execution_time_seconds: { type: 'number', description: 'Hard timeout for agent execution in seconds' },\n    allow_code_execution: { type: 'boolean', description: 'Whether the agent can execute generated code' },\n    multimodal: { type: 'boolean', description: 'Whether the agent can process images and other media' },\n    version: { type: 'string', description: 'Version label for this agent definition (e.g. \"1.4.2\")' },\n  },\n  // AgentHookProperties: Agent hook.\n  agent_hook: {\n    hook_event: { type: 'string', description: 'Event that triggers this hook' },\n    hook_action: { type: 'string', description: 'Action performed when the hook fires' },\n    hook_status: { type: 'string', enum: ['active', 'disabled', 'error'], description: 'Operational status of the hook. @deprecated since 0.33.0, removeIn 1.0.0. Use the base `status` field. `agent_hook` moved from the WORK_ITEM lifecycle to OPERATIONAL at 0.33.0, whose phases carry this axis directly: `active` maps to `active` and `disabled` maps to `paused`. A `*_status` property beside the base `status` is the shadow that Pattern D collapsed fourteen times at 0.15.0, and a type that models its own status in a property is a type whose lifecycle did not fit. `error` maps to `paused`: OPERATIONAL has no failure phase, and runtime health is store or telemetry state rather than a fact about the thing, which is the same cut that keeps `composition.rev` and excludes a concurrency token. Put the failure detail in `description` or a diagnostic property.' },\n    execution_count: { type: 'number', description: 'Number of times this hook has fired', modifier: 'snapshot' },\n  },\n  // AgentSessionProperties: Agent session.\n  agent_session: {\n    session_start: { type: 'string', description: 'ISO timestamp when the session began' },\n    session_end: { type: 'string', description: 'ISO timestamp when the session ended' },\n    turns: { type: 'number', description: 'Number of conversational turns in the session' },\n    tokens_used: { type: 'number', description: 'Total tokens consumed during the session' },\n    cost: { type: 'number', description: 'Total monetary cost of the session' },\n    error_count: { type: 'number', description: 'Number of errors encountered during the session' },\n    session_status: { type: 'string', enum: ['active', 'completed', 'errored', 'timed_out'], description: 'Current status of the session' },\n    output_summary: { type: 'string', description: 'Brief summary of the session\\'s output' },\n  },\n  // AgentSkillProperties: Agent skill.\n  agent_skill: {\n    skill_trigger: { type: 'string', description: 'Event or command that activates this skill' },\n    skill_description: { type: 'string', description: 'Human-readable description of what the skill does' },\n    invocation_count: { type: 'number', description: 'Number of times this skill has been invoked', modifier: 'snapshot' },\n  },\n  // AgentTaskProperties: Agent task. A discrete task assigned to an agent.\n  agent_task: {\n    description: { type: 'string', description: 'What the agent should accomplish' },\n    expected_output: { type: 'string', description: 'Description of the expected output format or content' },\n    context: { type: 'string', description: 'Additional context provided to the agent for this task' },\n    output_file: { type: 'string', description: 'File path where the agent should write output' },\n    blocking: { type: 'boolean', description: 'Whether this task blocks downstream tasks' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Relative priority of this task' },\n  },\n  // AggregateProperties: DDD aggregate.\n  aggregate: {\n    aggregate_root: { type: 'string', description: 'Root entity' },\n    invariants: { type: 'string', description: 'Enforced business rules' },\n  },\n  // AiCostTrackerProperties: AI cost tracker.\n  ai_cost_tracker: {\n    period: { type: 'string', description: 'Tracked period (e.g. \"2026-Q1\", \"2026-04\")' },\n    total_cost: { type: 'number', description: 'Total spend across all models' },\n    total_requests: { type: 'number', description: 'Total API requests' },\n    avg_cost_per_request: { type: 'number', description: 'Average cost per request' },\n    input_tokens: { type: 'number', description: 'Total input tokens' },\n    output_tokens: { type: 'number', description: 'Total output tokens' },\n    cost_by_model: { type: 'object', description: 'Cost breakdown by model (name → USD)' },\n    budget_limit: { type: 'number', description: 'Spend ceiling for the period' },\n    budget_alert_threshold: { type: 'number', description: 'Alert threshold (spend percentage)' },\n  },\n  // AiDatasetProperties: Versioned AI training or evaluation dataset.\n  ai_dataset: {\n    dataset_type: { type: 'string', enum: ['training', 'evaluation', 'fine_tuning', 'rlhf', 'synthetic'], description: 'Purpose' },\n    version: { type: 'string', description: 'Version' },\n    record_count: { type: 'number', description: 'Records', modifier: 'snapshot' },\n    format: { type: 'string', description: 'Format (e.g. \"jsonl\", \"csv\", \"parquet\")' },\n    storage_uri: { type: 'string', description: 'Storage URI', modifier: 'volatile' },\n    checksum: { type: 'string', description: 'Integrity hash' },\n    provenance: { type: 'string', enum: ['human_labelled', 'synthetic', 'scraped', 'converted', 'mixed'], description: 'Origin' },\n    license: { type: 'string', description: 'SPDX license identifier' },\n    tags: { type: 'string[]', description: 'Free-form classification tags' },\n  },\n  // AiExperimentProperties: AI training or fine-tuning experiment.\n  ai_experiment: {\n    project: { type: 'string', description: 'Parent project or experiment group' },\n    run_name: { type: 'string', description: 'Human-readable run name' },\n    config: { type: 'string', description: 'Serialised hyperparameters and config' },\n    summary_metrics: { type: 'string', description: 'Key-metric summary' },\n    started_at: { type: 'string', description: 'ISO timestamp started' },\n    completed_at: { type: 'string', description: 'ISO timestamp completed' },\n    training_steps: { type: 'number', description: 'Training steps or epochs completed' },\n    artifact_uri: { type: 'string', description: 'Produced artifact URI', modifier: 'volatile' },\n    notes: { type: 'string', description: 'Free-text notes' },\n    tags: { type: 'string[]', description: 'Free-form classification tags' },\n  },\n  // AiGuardrailProperties: AI guardrail.\n  ai_guardrail: {\n    guardrail_type: { type: 'string', enum: ['content_filter', 'rate_limit', 'token_limit', 'safety', 'custom'], description: 'Protection category' },\n    enforcement: { type: 'string', enum: ['block', 'warn', 'log'], description: 'Action when triggered' },\n    trigger_count: { type: 'number', description: 'Times triggered', modifier: 'snapshot' },\n  },\n  // AiModelProperties: AI model.\n  ai_model: {\n    model_provider: { type: 'string', enum: ['anthropic', 'openai', 'google', 'meta', 'mistral', 'custom'], description: 'Provider or vendor' },\n    model_id: { type: 'string', description: 'Unique model identifier (e.g. \"claude-sonnet-4-20250514\")', modifier: 'volatile' },\n    model_version: { type: 'string', description: 'Specific version' },\n    model_purpose: { type: 'string', description: 'Intended use case' },\n    context_window: { type: 'number', description: 'Maximum context window (tokens)' },\n    latency_p50_ms: { type: 'number', description: 'Median latency (p50, ms)', modifier: 'snapshot' },\n    latency_p99_ms: { type: 'number', description: 'Tail latency (p99, ms)', modifier: 'snapshot' },\n    input_schema: { type: 'string', description: 'Expected input format or schema' },\n    output_schema: { type: 'string', description: 'Expected output format or schema' },\n    aliases: { type: 'string[]', description: 'Alternative names' },\n    tags: { type: 'string[]', description: 'Free-form classification tags' },\n  },\n  // AiTraceProperties: Single LLM call or chain execution trace.\n  ai_trace: {\n    inputs: { type: 'string', description: 'Serialised input' },\n    outputs: { type: 'string', description: 'Serialised output' },\n    called_at: { type: 'string', description: 'ISO timestamp called' },\n    latency_ms: { type: 'number', description: 'Round-trip latency (ms)' },\n    input_tokens: { type: 'number', description: 'Input tokens' },\n    output_tokens: { type: 'number', description: 'Output tokens' },\n    cost: { type: 'number', description: 'Monetary cost' },\n    error: { type: 'string', description: 'Error message on failure' },\n    status_code: { type: 'number', description: 'HTTP or API status' },\n    feedback_score: { type: 'number', description: 'Human or automated quality score' },\n    tags: { type: 'string[]', description: 'Free-form classification tags' },\n  },\n  // AlertRuleProperties: Alert rule.\n  alert_rule: {\n    condition: { type: 'string', description: 'Triggering query or expression. @example \"avg(rate(http_errors_total[5m])) > 0.05\"' },\n    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.' },\n    notification_channel: { type: 'string', description: 'Notification destination. @example \"pagerduty:sev1-rotation\", \"slack:#alerts-low\"' },\n    evaluation_window: { type: 'string', description: 'Required duration the condition holds before firing. Prevents flapping on transient spikes. @example \"5m\", \"15m\", \"1h\"' },\n    escalation_policy: { type: 'string', description: 'Escalation behaviour on unacknowledged alerts. @example \"Escalate to engineering lead after 10 minutes\"' },\n  },\n  // AnnotationProperties: Design annotation on a screen.\n  annotation: {\n    annotation_type: { type: 'string', enum: ['spec', 'interaction', 'content', 'accessibility'], description: 'Annotation type' },\n    target_element: { type: 'string', description: 'Annotated element' },\n    note: { type: 'string', description: 'Note text' },\n  },\n  // ApiContractProperties: API contract.\n  api_contract: {\n    spec_url: { type: 'string', description: 'URL of the specification document', modifier: 'volatile' },\n    protocol: { type: 'string', enum: ['REST', 'GraphQL', 'gRPC', 'AsyncAPI', 'SOAP', 'WebSocket', 'MQTT', 'SSE', 'other'], description: 'Communication protocol. `SSE` (server-sent events) added in 0.9.12.' },\n    version: { type: 'string', description: 'API version' },\n    owner: { type: 'string', description: 'Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n  },\n  // ApiEcosystemProperties: API ecosystem.\n  api_ecosystem: {\n    api_style: { type: 'string', enum: ['rest', 'graphql', 'grpc', 'webhook', 'mixed'], description: 'Primary API architecture style' },\n    developer_count: { type: 'number', description: 'Number of registered developers', modifier: 'snapshot' },\n    app_count: { type: 'number', description: 'Number of apps built on the API', modifier: 'derived' },\n  },\n  // ApiEndpointProperties: API endpoint.\n  api_endpoint: {\n    http_method: { type: 'string', enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], description: 'HTTP method' },\n    path: { type: 'string', description: 'URL path (e.g. \"/api/v1/products/:id\")' },\n    auth_required: { type: 'boolean', description: 'Whether authentication is required' },\n    rate_limit: { type: 'string', description: 'Rate limit description (e.g. \"100/min\")' },\n  },\n  // ApprovalRecordProperties: Approval record.\n  approval_record: {\n    approved: { type: 'boolean', description: 'Whether the item was approved or rejected' },\n    comment: { type: 'string', description: 'Reviewer\\'s comment or rationale' },\n    approved_at: { type: 'string', description: 'ISO timestamp when the approval was given' },\n  },\n  // AssumptionProperties: Assumption entity.\n  assumption: {\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence before testing (UPGAssessment on `confidence_5`). Independent of whether the assumption is validated (tracked in lifecycle).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    validation_method: { type: 'string', description: 'Validation method, planned or used' },\n    risk_level: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Exposure if the assumption turns out wrong',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    falsifiability: { type: 'string', description: 'Observation that would prove this assumption false' },\n  },\n  // AttributionModelProperties: AttributionModel entity.\n  attribution_model: {\n    model_type: { type: 'string', enum: ['first_touch', 'last_touch', 'linear', 'time_decay', 'custom'], description: 'How credit is distributed across touchpoints' },\n    lookback_window: { type: 'string', description: 'Time window for attributing conversions' },\n  },\n  // AuditLogPolicyProperties: Audit log policy.\n  audit_log_policy: {\n    scope: { type: 'string', description: 'What systems or actions are covered by the audit log' },\n    retention_days: { type: 'number', description: 'Number of days audit logs are retained' },\n    event_types: { type: 'string[]', description: 'Types of events being logged' },\n  },\n  // BehavioralSegmentProperties: BehavioralSegment entity.\n  behavioral_segment: {\n    definition: { type: 'string', description: 'Plain-language description. Pairs with the machine-readable `criteria`.' },\n    criteria: { type: 'string', description: 'Machine-readable or semi-structured membership rule (event-query DSL, SQL fragment, segmentation tool clause).' },\n    segment_type: { type: 'string', enum: ['behavioral', 'demographic', 'firmographic', 'custom'], description: 'Classification. `behavioral` is the default; the wider enum allows reclassification without changing entity type.' },\n    source: { type: 'string', enum: ['clickstream', 'survey', 'interview', 'mixed', 'inferred', 'imported'], description: 'Membership data source. Drives confidence weighting and refresh policy.' },\n    included_behaviors: { type: 'string[]', description: 'Qualifying behaviours (positive criteria, free-text labels)' },\n    excluded_behaviors: { type: 'string[]', description: 'Excluding behaviours (negative criteria, free-text labels)' },\n    size_estimate: { type: 'number', description: 'Estimated current size. Snapshot value. (`size`, the v0.2 alias, removed in 0.14.0, UPG-574.)' },\n    validity_period_start: { type: 'string', description: 'ISO start of the validity window. Behavioural definitions decay; outside the window the snapshot should be re-computed.' },\n    validity_period_end: { type: 'string', description: 'End of the window over which the segment definition is considered valid (ISO format)' },\n  },\n  // BetaProgramProperties: Beta program.\n  beta_program: {\n    beta_type: { type: 'string', enum: ['closed', 'open', 'invite_only'], description: 'Access model for the beta' },\n    participant_count: { type: 'number', description: 'Number of users participating in the beta', modifier: 'snapshot' },\n  },\n  // BoundedContextProperties: DDD bounded context.\n  bounded_context: {\n    team_owner: { type: 'string', description: 'Owning team. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    tech_stack: { type: 'string[]', description: 'Technologies used within this context' },\n    ubiquitous_language: { type: 'string', description: 'Key terms and their definitions' },\n  },\n  // BrandAssetProperties: Brand asset.\n  brand_asset: {\n    asset_type: { type: 'string', enum: ['logo', 'icon', 'illustration', 'photo', 'video', 'template'], description: 'Category of the brand asset' },\n    url: { type: 'string', description: 'URL or path to the asset file', modifier: 'volatile' },\n    usage_rights: { type: 'string', description: 'Usage rights or licensing restrictions' },\n  },\n  // BrandColourProperties: Brand colour. A single colour in the brand palette.\n  brand_colour: {\n    hex: { type: 'string', description: 'Hex colour value including hash (e.g. \"#1A2B3C\")' },\n    role: { type: 'string', enum: ['primary', 'secondary', 'accent', 'neutral', 'semantic'], description: 'Role this colour plays in the brand palette' },\n    contrast_pair: { type: 'string', description: 'Hex of the contrast-paired colour for accessibility. Used to verify WCAG AA/AAA contrast ratios.' },\n    usage_context: { type: 'string', description: 'Where this colour should be used (e.g. \"hero backgrounds\", \"CTA buttons\", \"body text\")' },\n    color_name: { type: 'string', description: 'Human-readable colour name within the brand palette. @example \"Midnight Blue\", \"Sunrise Orange\"' },\n    rgb: { type: 'string', description: 'RGB value as a comma-separated string. @example \"26, 43, 60\"' },\n    cmyk: { type: 'string', description: 'CMYK value for print contexts, as a comma-separated string. @example \"57, 28, 0, 76\"' },\n    pantone: { type: 'string', description: 'Pantone code for physical brand materials (print, packaging, signage). @example \"Pantone 289 C\"' },\n  },\n  // BrandIdentityProperties: Brand identity. Root entity for a brand's visual and verbal identity.\n  brand_identity: {\n    personality_traits: { type: 'string[]', description: 'Core personality traits of the brand (e.g. \"bold\", \"approachable\", \"innovative\")' },\n    tagline: { type: 'string', description: 'Brand tagline or slogan (e.g. \"Just Do It\", \"Think Different\")' },\n    mission_statement: { type: 'string', description: 'Mission statement: what the brand exists to do.' },\n    brand_values: { type: 'string[]', description: 'Core brand values. The principles the brand stands for. @example [\"innovation\", \"transparency\", \"sustainability\"]' },\n    brand_story: { type: 'string', description: 'Brand origin story or narrative. Free-form text, may be multiple paragraphs.' },\n    target_audience_description: { type: 'string', description: 'Target audience description. Who the brand speaks to. @example \"Solo founders and small product teams building their first product.\"' },\n    brand_personality_archetype: { type: 'string', description: 'Brand personality archetype (e.g. \"The Creator\", \"The Explorer\", \"The Sage\"). Based on the 12 Jungian brand archetypes model used in brand strategy.' },\n  },\n  // BrandImageryProperties: Brand imagery guidelines. Photography, illustration, and visual mood.\n  brand_imagery: {\n    style: { type: 'string', enum: ['photography', 'illustration', 'mixed', 'abstract', 'other'], description: 'Primary visual style category. Determines whether the brand uses photography, illustrations, or a mix.' },\n    mood_keywords: { type: 'string[]', description: 'Keywords describing the visual mood and feeling of brand imagery. @example [\"warm\", \"authentic\", \"natural light\", \"diverse\", \"in-context\"]' },\n    approved_filters: { type: 'string[]', description: 'Approved image treatments and filters. @example [\"warm colour grade\", \"subtle desaturation\", \"no heavy vignettes\"]' },\n    stock_guidelines: { type: 'string', description: 'Guidelines for stock photography selection or commissioned shoots. @example \"Use candid, in-context shots. Avoid staged corporate handshakes.\"' },\n    composition_rules: { type: 'string', description: 'Rules for visual composition in brand imagery. @example \"Subject off-centre. Generous negative space on left for text overlay.\"' },\n    illustration_style: { type: 'string', description: 'Illustration style guidelines (if applicable). @example \"Flat vector with rounded corners. Limited to brand palette. No gradients.\"' },\n  },\n  // BrandLogoProperties: Brand logo variant. A specific version of the brand's logo.\n  brand_logo: {\n    variant: { type: 'string', enum: ['primary', 'secondary', 'icon', 'wordmark', 'monochrome', 'reversed', 'other'], description: 'Which variant of the logo this represents. A brand typically has multiple logo variants for different contexts.' },\n    min_size_px: { type: 'number', description: 'Minimum display size in pixels to maintain legibility. @example 32 @minimum 1' },\n    clear_space_ratio: { type: 'number', description: 'Minimum padding around the logo as a fraction of its height (0.25 = 25% on each side). @example 0.25' },\n    approved_backgrounds: { type: 'string[]', description: 'Background colours the logo is approved for use on. @example [\"#FFFFFF\", \"#1A1A1A\", \"#F5F5F5\"]' },\n    forbidden_backgrounds: { type: 'string[]', description: 'Background colours or contexts where the logo must NOT be placed. @example [\"busy photography\", \"low-contrast surfaces\"]' },\n    file_formats: { type: 'string[]', description: 'File formats this logo variant is available in. @example [\"svg\", \"png\", \"eps\", \"pdf\"]' },\n    asset_url: { type: 'string', description: 'URL to the logo asset file or asset library entry.', modifier: 'volatile' },\n  },\n  // BrandTypographyProperties: Brand typography. A font family and its usage rules.\n  brand_typography: {\n    font_family: { type: 'string', description: 'Font family name (e.g. \"Inter\", \"Playfair Display\", \"JetBrains Mono\")' },\n    category: { type: 'string', enum: ['heading', 'body', 'mono', 'display', 'accent'], description: 'Typographic role within the brand\\'s type system' },\n    weight_range: { type: 'string', description: 'Available weight range as a string (e.g. \"400-700\", \"100-900\")' },\n    sample_text: { type: 'string', description: 'Example text to preview the font (e.g. \"The quick brown fox\")' },\n    font_source: { type: 'string', description: 'Where the font is sourced from. @example \"Google Fonts\", \"Adobe Fonts\", \"self-hosted\", \"custom\"' },\n    line_height: { type: 'string', description: 'Recommended line height as a unitless ratio or CSS value. @example \"1.5\", \"1.75\", \"24px\"' },\n    letter_spacing: { type: 'string', description: 'Recommended letter spacing / tracking as a CSS value. @example \"0.02em\", \"-0.01em\", \"normal\"' },\n    fallback_font: { type: 'string', description: 'Fallback font stack for web rendering (CSS font-family fallbacks). @example \"system-ui, -apple-system, sans-serif\"' },\n  },\n  // BrandVoiceProperties: Brand voice guidelines. How the brand sounds in written and spoken communication.\n  brand_voice: {\n    tone_attributes: { type: 'string[]', description: 'Tone descriptors defining how the brand sounds. @example [\"confident\", \"warm\", \"precise\", \"never condescending\"]' },\n    do_examples: { type: 'string[]', description: 'Examples of correct brand voice. \"This is how we write.\" @example [\"We make complex things simple.\", \"Let\\'s figure this out together.\"]' },\n    dont_examples: { type: 'string[]', description: 'Examples to avoid. \"We never write like this.\" @example [\"Click here to leverage our synergies.\", \"Dear valued customer...\"]' },\n    writing_principles: { type: 'string[]', description: 'Core writing principles that govern all brand communication. @example [\"Lead with clarity\", \"Be specific, not vague\", \"Write for humans first\"]' },\n    vocabulary_preferences: { type: 'string', description: 'Preferred and avoided vocabulary. @example \"Say \\'product creator\\', not \\'entrepreneur\\'\"' },\n    audience_adaptation: { type: 'string', description: 'How voice adapts by audience segment. @example \"Enterprise: more formal, data-led. Solo founders: conversational, encouraging.\"' },\n    channel_guidelines: { type: 'string', description: 'Voice variation by communication channel. @example \"Social: punchy and casual. Docs: precise and thorough. Email: warm and direct.\"' },\n  },\n  // BugProperties: Bug report.\n  bug: {\n    bug_severity: {\n      type: 'assessment', scale_id: 'severity_5', 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`.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    steps_to_reproduce: { type: 'string', description: 'Step-by-step reproduction' },\n    environment: { type: 'string', description: 'Observed environment (e.g. \"prod\", \"staging\", \"iOS 17.4\")' },\n    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).' },\n    assignee: { type: 'string', description: 'Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    due_date: { type: 'string', description: 'ISO date due. Often tied to a release gate or SLA.' },\n    labels: { type: 'string[]', description: 'Free-form classification tags. @deprecated since 0.32.0. Use base-node `tags` for ungrouped labels, and `classification_axis` + `classification_value` + `node_classified_as_classification_value` when the labels belong to a named group. This field duplicated `tags` and had no consumers; three parallel label surfaces (base `tags`, per-type `tags`, per-type `labels`) were two too many. `UPG_PROPERTY_MIGRATIONS[\\'0.32.0\\']` drops it.' },\n    workflow_state: { type: 'string', description: 'The source tool\\'s raw custom workflow state, verbatim and opaque (e.g. \"In Review\", \"QA\", \"Needs Triage\"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.' },\n    workflow_state_category: { type: 'string', enum: ['triage', 'backlog', 'unstarted', 'started', 'completed', 'cancelled'], description: 'Canonical bucket the raw `workflow_state` maps onto for reasoning: a source \"In Review\" and a source \"QA\" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.', notes: 'It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source\\'s raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.' },\n  },\n  // BuildArtifactProperties: Build artifact.\n  build_artifact: {\n    artifact_type: { type: 'string', enum: ['docker_image', 'npm_package', 'binary', 'static_assets', 'other'], description: 'Type' },\n    version: { type: 'string', description: 'Version' },\n    size: { type: 'string', description: 'Human-readable size (e.g. \"12.4 MB\")' },\n    registry: { type: 'string', description: 'Registry or storage location', modifier: 'volatile' },\n    build_url: { type: 'string', description: 'URL of the producing CI/CD build run (GitHub Actions, CircleCI, etc.).', modifier: 'volatile' },\n  },\n  // BusinessModelProperties: BusinessModel: root of a BMC-style model.\n  business_model: {\n    framework_id: { type: 'string', description: 'Framework ID (references `UPGFramework.id`)' },\n    stage: { type: 'string', enum: ['draft', 'validated', 'active'], description: 'Maturity' },\n    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.' },\n  },\n  // CapabilityProperties: Capability entity.\n  capability: {\n    maturity_level: { type: 'string', enum: ['initial', 'developing', 'defined', 'managed', 'optimizing'], description: 'Current maturity' },\n    target_maturity: { type: 'string', enum: ['initial', 'developing', 'defined', 'managed', 'optimizing'], description: 'Target maturity' },\n    gap: { type: 'string', description: 'Gap between current and target' },\n    evolution_stage: { type: 'string', enum: ['genesis', 'custom', 'product', 'commodity'], description: 'Wardley evolution axis: where this capability sits on the genesis → custom → product → 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\\'' },\n    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' },\n  },\n  // CapacityPlanProperties: CapacityPlan entity.\n  capacity_plan: {\n    plan_period: { type: 'string', description: 'Time period the plan covers (e.g. \"Sprint 14\", \"Q2 2026\")' },\n    total_capacity: { type: 'number', description: 'Total available capacity in person-days or story points' },\n    allocated: { type: 'number', description: 'Capacity already allocated to work' },\n    available: { type: 'number', description: 'Remaining unallocated capacity' },\n  },\n  // CaptureProperties: Capture: a dated, hashed rendition of something already in the graph.\n  capture: {\n    capture_uri: { type: 'string', description: 'Where the bytes are. `https://` for hosted, `file://` or a relative path for local. Required: a capture with no location renders nothing.' },\n    content_hash: { type: 'string', description: 'Content hash of the bytes. The regeneration signal; see the type\\'s `@remarks` for why mtime and size are not.' },\n    hash_algorithm: { type: 'string', enum: ['sha256', 'sha1', 'md5'], description: 'Hash algorithm. Absent means `sha256`.' },\n    captured_at: { type: 'string', description: 'ISO timestamp the capture was taken.' },\n    media_type: { type: 'string', description: 'IANA media type of the bytes. @example \"image/png\"' },\n    fidelity: { type: 'string', enum: ['exact', 'approximate', 'not_applicable'], description: 'How faithfully this rendition represents its subject. `approximate` covers a capture taken in a stand-in state or at the wrong viewport.' },\n    capture_status: { type: 'string', enum: ['captured', 'blocked', 'skipped'], description: 'Whether the capture succeeded.', notes: 'A `blocked` capture is a real record rather than a missing one: it says the subject exists and could not be rendered, which is what stops the next run rediscovering the same obstacle. `skipped` is the deliberate exclusion.' },\n  },\n  // CeremonyProperties: Ceremony entity.\n  ceremony: {\n    ceremony_type: { type: 'string', enum: ['standup', 'planning', 'review', 'retro', 'sync', 'demo', 'other'], description: 'Kind of recurring meeting' },\n    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.' },\n    duration_minutes: { type: 'number', description: 'Typical duration of the meeting in minutes' },\n    participants: { type: 'string', description: 'People or roles who attend. Promote individuals to `node_owned_by_person` edges if participation must be queryable.' },\n  },\n  // CertificationProperties: Certification.\n  certification: {\n    cert_level: { type: 'string', enum: ['foundation', 'practitioner', 'expert'], description: 'Difficulty level of the certification' },\n    requirements: { type: 'string[]', description: 'Prerequisites or requirements to earn the certification' },\n    validity_months: { type: 'number', description: 'How long the certification is valid in months' },\n    holders: { type: 'number', description: 'Number of people currently holding this certification' },\n  },\n  // ChangeRequestProperties: Change request.\n  change_request: {\n    change_type: { type: 'string', enum: ['scope', 'schedule', 'budget', 'resource', 'requirements'], description: 'What aspect of the project is being changed' },\n    approval_status: { type: 'string', enum: ['pending', 'approved', 'rejected', 'deferred'], description: 'Current approval status of the request' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Priority of the change request' },\n    impact_assessment: { type: 'string', description: 'Description of the change\\'s impact on the project' },\n  },\n  // ChangelogProperties: Changelog entry.\n  changelog: {\n    version: { type: 'string', description: 'Version (e.g. \"1.2.0\")' },\n    date: { type: 'string', description: 'ISO date' },\n    change_type: { type: 'string', enum: ['feature', 'improvement', 'bugfix', 'breaking', 'deprecation'], description: 'Change type' },\n  },\n  // ChurnReasonProperties: Churn reason.\n  churn_reason: {\n    category: { type: 'string', description: 'High-level category of the churn reason' },\n    frequency_count: { type: 'number', description: 'Exact count of times this reason has been cited in `frequency_period`', modifier: 'snapshot' },\n    frequency_period: { type: 'string', description: 'The recurrence period the count is measured over (ISO-8601 `Duration`, e.g. `\\'P30D\\'`)' },\n    frequency_rating: { type: 'string', enum: ['constant', 'regular', 'occasional', 'rare', 'other'], description: 'Qualitative frequency tier when an exact count is not known' },\n    contributing_factors: { type: 'string[]', description: 'Other factors that contributed to the churn' },\n    signal_sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Detected sentiment of the churn signal' },\n    signal_channel: { type: 'string', description: 'Channel through which the churn signal was received' },\n    signal_urgency: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], description: 'Urgency of the churn risk' },\n  },\n  // CiPipelineProperties: CI pipeline.\n  ci_pipeline: {\n    pipeline_type: { type: 'string', enum: ['build', 'test', 'deploy', 'release', 'full'], description: 'Pipeline scope, narrowest to broadest. `build` = compile only. `test` = test only. `deploy` = ship to environment. `release` = create release artifact. `full` = commit-to-deploy.' },\n    trigger: { type: 'string', description: 'Triggering event. @example \"Push to main\", \"PR merge\", \"Nightly schedule at 02:00 UTC\", \"Manual dispatch\"' },\n    avg_duration: { type: 'string', description: 'Average run duration across recent executions. @example \"4m 30s\", \"12 minutes\"' },\n    last_run_status: { type: 'string', enum: ['success', 'failure', 'cancelled', 'skipped', 'in_progress'], description: 'Result of the most recent run. Current health indicator.' },\n    target_branch: { type: 'string', description: 'Primary branch. The branch that triggers production deployments. @example \"main\", \"release/*\"' },\n    run_count: { type: 'number', description: 'Total runs since creation. Indicates activity level. @example 1452', modifier: 'snapshot' },\n    success_rate: { type: 'number', description: 'Reliability metric for the pipeline itself: % of runs that succeed. @example 94.3', modifier: 'snapshot' },\n  },\n  // ClassificationAxisProperties: ClassificationAxis: a dimension along which subjects are classified.\n  classification_axis: {\n    axis_kind: { type: 'string', enum: ['categorical', 'ordinal', 'continuous'], description: 'Structural kind of values on this axis. `categorical` = discrete, unordered (most common; CMS architectures). `ordinal` = discrete, ordered (maturity tiers, T-shirt sizes). `continuous` = numeric range (latency budget, price points).' },\n    cardinality: { type: 'string', enum: ['single', 'multi'], description: 'How many values a subject may hold on this axis at once. `single` (the default) means re-classifying SUPERSEDES the prior value; `multi` means it ADDS one.', notes: 'Under `single` the classify writer retires the old same-axis edge and records the move in the reclassification history, so the change is traceable rather than silent. `multi` suits an axis like \"supported frameworks\", where holding several values at once is the truth. A separate axis from `axis_kind`: an axis can be `categorical` (unordered) yet single-select, or `categorical` yet multi-select. The two answer different questions and neither implies the other.' },\n  },\n  // ClassificationValueProperties: ClassificationValue: a value on a classification axis.\n  classification_value: {\n    rationale: { type: 'string', description: 'Short paragraph: why this value earns its own row/column. Longer narrative belongs in `summary_md` or attached `content_piece` nodes.' },\n    exemplars: { type: 'string[]', description: 'Free-text examples of products occupying this value. For queryable occupancy, prefer `competitor` nodes with `classified_as` edges. @example [\\'Nimbus\\', \\'Larch\\', \\'Prism\\']' },\n    commitments: { type: 'object[]', description: 'The load-bearing commitments that define this category, typically two to four. Each is a structural axis: removing it changes the category.', notes: 'Pairs with `capabilities`, and the distinction matters when deciding where a bullet belongs: commitments are the load-bearing DEFINITION, capabilities are the surface OFFERING. A capability can be dropped without the category changing; a commitment cannot. A worked set: [ { name: \\'Typed content graph\\', description: \\'Schemas in code; references as edges; content is structured data.\\' }, { name: \\'Real-time backend\\', description: \\'Live queries, CRDT collaboration, sub-second propagation.\\' }, { name: \\'Embeddable studio\\', description: \\'Editor is a library hosted inside the team app, not an external portal.\\' }, ]' },\n    capabilities: { type: 'object[]', description: 'Structured capability bullets across the six canonical surfaces. Each surface appears at most once per `classification_value`. @example [ { surface: \\'delivery\\', bullets: [\\'NQL\\', \\'GraphQL\\', \\'REST\\', \\'Live Sync API\\', \\'Asset CDN\\'] }, { surface: \\'extensibility\\', bullets: [\\'Custom input components\\', \\'editor plugins\\'] }, ]', notes: 'Pairs with `commitments`, and the distinction decides where a bullet belongs: capabilities describe what the category OFFERS, commitments describe what DEFINES it. Dropping a capability leaves the category intact; dropping a commitment does not.' },\n  },\n  // CodeRepositoryProperties: Code repository.\n  code_repository: {\n    repo_url: { type: 'string', description: 'URL', modifier: 'volatile' },\n    default_branch: { type: 'string', description: 'Default branch' },\n    language: { type: 'string', description: 'Primary programming language' },\n    ci_status: { type: 'string', enum: ['passing', 'failing', 'unknown'], description: 'Current CI status' },\n    visibility: { type: 'string', enum: ['public', 'private', 'internal'], description: 'Visibility. `internal` = visible within the organisation only (GitHub internal repos).' },\n  },\n  // CohortProperties: Cohort entity.\n  cohort: {\n    definition: { type: 'string', description: 'How this cohort is defined' },\n    acquisition_start: { type: 'string', description: 'Start of the acquisition window (ISO format)' },\n    acquisition_end: { type: 'string', description: 'End of the acquisition window (ISO format)' },\n    size: { type: 'number', description: 'Number of users in the cohort' },\n    retention_day_7: { type: 'number', description: '7-day retention rate (0-1)' },\n    retention_day_30: { type: 'number', description: '30-day retention rate (0-1)' },\n  },\n  // CommandProperties: CQRS command.\n  command: {\n    command_handler: { type: 'string', description: 'Processing handler' },\n    validation_rules: { type: 'string', description: 'Pre-execution validation rules' },\n  },\n  // CommunityInitiativeProperties: Community initiative.\n  community_initiative: {\n    initiative_type: { type: 'string', enum: ['forum', 'discord', 'slack', 'meetup', 'ambassador', 'other'], description: 'Platform or format for the community' },\n    member_count: { type: 'number', description: 'Current number of community members', modifier: 'snapshot' },\n    engagement_rate: { type: 'number', description: 'Percentage of members actively participating', modifier: 'snapshot' },\n  },\n  // CompetitiveAnalysisProperties: Competitive analysis exercise or snapshot.\n  competitive_analysis: {\n    analysis_type: { type: 'string', enum: ['feature_comparison', 'positioning', 'swot', 'pricing'], description: 'Type of analysis. `feature_comparison` = side-by-side matrix. `positioning` = competitor positioning relative to each other. `swot` = strengths, weaknesses, opportunities, threats. `pricing` = pricing structure comparison.' },\n    analysis_date: { type: 'string', description: 'ISO date conducted. Competitive intelligence decays quickly; track snapshot age. @example \"2026-03-15\"' },\n    framework_id: { type: 'string', description: 'Framework ID (references `UPGFramework.id`). @example \"porter-five-forces\", \"swot-analysis\", \"competitive-matrix\"' },\n    empty_cells: { type: 'object[]', description: 'Empty cells in a two-axis classification matrix that earn explicit commentary, and only the strategically interesting ones. Opportunity-kind cells are the most valuable: they identify unoccupied strategic space.', notes: 'Each entry references two `classification_value` nodes by id, one from each `classification_axis` child of this `competitive_analysis`. `validate_graph` enforces that the refs resolve to `classification_value` nodes whose parents are distinct `classification_axis` instances, so a cell cannot name two values from the same axis. See `ClassificationValueProperties.commitments` for the inverse \"occupied cell\" structural-definition shape. A worked pair, one of each rationale kind: [ { axis_a_value_ref: \\'val-git-based\\', axis_b_value_ref: \\'val-structured-text\\', rationale_kind: \\'opportunity\\', rationale_md: \\'No technical reason; only adoption inertia. Watching brief.\\' }, { axis_a_value_ref: \\'val-composable\\', axis_b_value_ref: \\'val-wysiwyg\\', rationale_kind: \\'structural\\', rationale_md: \\'Composable rejects HTML blobs; WYSIWYG requires them.\\' }, ]' },\n    last_updated: { type: 'string', description: 'Provenance: ISO date-time this record was last observed or refreshed. Distinct from `analysis_date` (when the analysis was conducted). @example \"2026-06-13\"' },\n    source: { type: 'string', description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example \"https://docs.larch.example/changelog/\"' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Provenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    observed_by: { type: 'string', description: 'Provenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example \"competitor-watch-agent\"' },\n  },\n  // CompetitiveBattleCardProperties: CompetitiveBattleCard entity.\n  competitive_battle_card: {\n    win_rate: { type: 'number', description: 'Historical win rate against this competitor (0-100%)', modifier: 'snapshot' },\n    key_differentiators: { type: 'string', description: 'Summary of key differentiators versus this competitor' },\n  },\n  // CompetitorProperties: A product or approach competing for the same user need.\n  competitor: {\n    positioning: { type: 'string', description: 'Market positioning' },\n    pricing_model: { type: 'string', description: 'Pricing model (e.g. \"freemium\", \"per-seat SaaS\", \"usage-based\")' },\n    website: { type: 'string', description: 'Public website URL' },\n    strengths: { type: 'string[]', description: 'Bulleted factual strengths. Each item is a short statement, not prose. @example [\\'Real-time multiplayer canvas\\', \\'Generous free tier\\']' },\n    weaknesses: { type: 'string[]', description: 'Bulleted factual weaknesses: gaps, friction, or capabilities materially below market. @example [\\'Weak API query capabilities\\', \\'No mobile companion\\']' },\n    last_updated: { type: 'string', description: 'Provenance: ISO date-time this record was last observed or refreshed. Lets a stale record be told apart from a fresh one. @example \"2026-06-13\"' },\n    source: { type: 'string', description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example \"https://docs.larch.example/pricing/\"' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Provenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    observed_by: { type: 'string', description: 'Provenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example \"competitor-watch-agent\"' },\n  },\n  // CompetitorFeatureProperties: Competitor feature or capability.\n  competitor_feature: {\n    our_equivalent: { type: 'string', description: 'Our equivalent feature, if any. Leave empty when we offer nothing equivalent. @example \"Canvas collaboration\"' },\n    is_gap: { type: 'boolean', description: 'Gap in our offering. True when `our_equivalent` is absent or materially inferior.' },\n    quality: { type: 'string', enum: ['better', 'same', 'worse', 'missing'], description: 'Quality comparison. `better` = ours is meaningfully superior. `same` = roughly equivalent. `worse` = theirs is meaningfully superior. `missing` = we have no equivalent.' },\n    parity_status: { type: 'string', enum: ['ahead', 'behind', 'parity', 'unique_to_us', 'unique_to_them'], description: 'Parity. More granular than `quality`; captures whether the gap is offensive or defensive. `ahead` = we lead. `behind` = they lead. `parity` = equivalent. `unique_to_us` / `unique_to_them` = only one side offers it.' },\n    last_updated: { type: 'string', description: 'ISO date this assessment was last updated. Competitor feature landscapes change quickly. @example \"2026-02-15\"' },\n    source: { type: 'string', description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example \"https://docs.larch.example/changelog/\"' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Provenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    observed_by: { type: 'string', description: 'Provenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example \"competitor-watch-agent\"' },\n  },\n  // CompetitorSignalProperties: Competitor signal: a dated competitor move mapped onto our portfolio.\n  competitor_signal: {\n    observed_at: { type: 'string', description: 'ISO date-time the move was observed. @example \"2026-06-10\"' },\n    signal_type: { type: 'string', enum: ['feature_launch', 'pricing_change', 'acquisition', 'partnership', 'market_entry', 'reclassification'], description: 'Kind of move: a shipped `feature_launch`, a `pricing_change`, the strategic `acquisition` / `partnership` / `market_entry`, or a `reclassification` when the competitor moves between classification cells on an axis.', notes: '`reclassification` is auto-emitted at the classify-write chokepoint rather than authored, and carries `axis`, `from_value`, `to_value` and `competitor` so the move is reconstructable without diffing two snapshots.' },\n    summary: { type: 'string', description: 'One-line factual summary of the move (what shipped, not marketing copy).' },\n    impact: { type: 'string', enum: ['high', 'medium', 'low'], description: 'Expected impact on our position.' },\n    competitor: { type: 'string', description: 'Reclassification only. The qualified id of the competitor that moved, as the classify cross-edge source (e.g. `p_rival/n_acme`). Identifies both the subject and its owning product, so `diff_classification({ product })` can filter the history stream.' },\n    axis: { type: 'string', description: 'Reclassification only. The `classification_axis` id the move is on (e.g. `ca_ai_maturity`). Mirrors the axis the superseded and new classify edges share.' },\n    from_value: { type: 'string', description: 'Reclassification only. The prior `classification_value` id the competitor was classified as before this move (the superseded cell). Absent for a first-time classification (nothing was superseded).' },\n    to_value: { type: 'string', description: 'Reclassification only. The new `classification_value` id the competitor is classified as after this move (the cell the new classify edge points at).' },\n    last_updated: { type: 'string', description: 'Provenance: ISO date-time this record was last observed or refreshed. @example \"2026-06-13\"' },\n    source: { type: 'string', description: 'Provenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example \"https://docs.larch.example/changelog/\"' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Provenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    observed_by: { type: 'string', description: 'Provenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example \"competitor-watch-agent\"' },\n  },\n  // ComplianceFrameworkProperties: Compliance framework.\n  compliance_framework: {\n    framework_name: { type: 'string', description: 'Name of the framework (e.g. \"SOC 2 Type II\", \"ISO 27001\")' },\n    audit_date: { type: 'string', description: 'Date of the last audit (ISO format)' },\n    next_audit: { type: 'string', description: 'Date of the next scheduled audit (ISO format)' },\n  },\n  // ComplianceRequirementProperties: Compliance requirement.\n  compliance_requirement: {\n    regulation: { type: 'string', enum: ['gdpr', 'ccpa', 'hipaa', 'soc2', 'iso27001', 'pci_dss', 'other'], description: 'Regulation or standard this requirement derives from' },\n    compliance_status: { type: 'string', enum: ['compliant', 'non_compliant', 'in_progress', 'not_applicable'], description: 'Current compliance posture' },\n    owner: { type: 'string', description: 'Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // CompositionProperties\n  composition: {\n    member_query: { type: 'object', description: 'When present, membership is DERIVED: members are produced by running this query rather than authored by placement. The clause list is authoritative and the named fields are a positive-only projection of it; since 0.34.0 a clause is a discriminated union on `dimension`, so the `type` axis carries entity types rather than free strings.', notes: 'This is the portable statement of what the layer shows. On a composition, `CompositionMember.href` remains the publishing tool\\'s own resolved route and stays opaque to everyone else; a member may carry both, and then the href is a fast path while the query is the meaning. A consumer that cannot parse the href can still render the layer, which is the whole reason the declaration is here rather than in a tool-namespaced bag key. A layer with no `member_query` is authored, which is what every composition written before 0.32.0 is. DECLARED ON BOTH HALVES OF THE PAIR since 0.33.0. A layer is query-driven while it is being worked on, not only once it is published, so declaring the query only on the durable composition would make it a fact invented at publish time rather than one recorded.' },\n    presentation: { type: 'object', description: 'Advisory rendering intent for the layer as a whole: `group_by`, `sort`, `layout`, `nest_by`, and `orphan_disposition` (0.34.0, absent means `\\'root\\'`). A consumer may ignore it entirely and still be conformant, because every default it then applies is the safe one.', notes: 'THE DESCRIPTION LISTS THE FIELDS ON PURPOSE. This property is `object` in the runtime property registry, so an agent reading `get_entity_schema` gets an opaque blob and this sentence. For an object-typed property the description IS the declared shape, which is why `check:editorial` hashes it (E.4, 0.34.0) and why a field added to `UPGViewPresentation` without a word here would be invisible to every gate and every agent at once.' },\n    members: { type: 'object[]', description: 'The frozen member arrangement, captured at publish. Layout and pointers only, never resolved content.' },\n    rev: { type: 'number', description: 'Monotonic revision, bumped on each republish of the same slug.', notes: 'A published revision is a fact about the composition, user-visible as a new print from the same plate, so it is serialised. Worth distinguishing from a store\\'s concurrency token, which shares the name in some backends but is a fact about the table rather than about the thing, and is not spec data.' },\n    published_at: { type: 'string', description: 'ISO timestamp of the most recent publish or republish.' },\n    published_by: { type: 'string', description: 'Publisher handle or email. Display scalar, same posture as `WorkspaceProperties.owner`.' },\n  },\n  // ConfigurationAxisProperties: A named dimension along which the product's composition differs.\n  configuration_axis: {\n    values: { type: 'string[]', description: 'The closed set of values this axis can take. Required: an axis with no values selects nothing and cannot be projected along. Every `present_under` and `active_when.values` entry must name one of them.', notes: 'Two values is the common case and three is not unusual (a plan ladder). Order is not significant: the axis is categorical, not ordinal. Where the ordering does matter (an entitlement ladder in which each tier includes the one below), that is a classification question, and `classification_axis` with `axis_kind: \\'ordinal\\'` is the instrument for it.' },\n    default_value: { type: 'string', description: 'The value this axis is understood to sit at when nobody says otherwise. Must be a member of `values`. NOTHING APPLIES IT AUTOMATICALLY: an unqualified read returns the union, not this projection.', notes: 'The union is the honest answer to an unqualified question, because it is every configuration at once; silently substituting one of them would hide the others from a reader who did not know to ask. What the field does carry is the declaration convention for `surface_alternates_with_surface` (declare the edge from the surface present under the default) and a documented anchor for tools that later want to offer a starting configuration. It is a claim about the model, not about deployment: it says which value most of the graph was written against, not which configuration most customers are on.' },\n    kind: { type: 'string', enum: ['feature_flag', 'plan_tier', 'permission_level', 'beta_program', 'other'], description: 'What kind of lever this is. Names the mechanism family.' },\n  },\n  // ConstraintProperties: Constraint: a named limitation or boundary on product creation.\n  constraint: {\n    constraint_kind: { type: 'string', enum: ['resource', 'technical', 'regulatory', 'temporal', 'compliance', 'other'], description: 'Limitation category' },\n    constraint_origin: { type: 'string', enum: ['internal', 'external'], description: 'Provenance: a self-imposed tenet (`internal`) or an imposed-on-us limit/requirement (`external`).' },\n    constraint_status: { type: 'string', enum: ['binding', 'advisory', 'lifted'], description: 'Whether binding, advisory, or lifted' },\n    rule_strength: { type: 'string', enum: ['must', 'must_not', 'exception', 'warning', 'guideline'], description: 'Enforcement strictness. Reuses the governance/guideline rule vocabulary.' },\n    source: { type: 'string', description: 'Free-text origin: policy document, regulation, stakeholder, technical doc.' },\n    review_date: { type: 'string', description: 'Re-evaluation date (ISO-8601). Useful for regulatory or temporal constraints with sunset clauses.' },\n  },\n  // ContactProperties: Contact.\n  contact: {\n    contact_role: { type: 'string', description: 'Job title or role within the account' },\n    is_decision_maker: { type: 'boolean', description: 'Whether this person has purchasing authority' },\n    buying_role: { type: 'string', enum: ['champion', 'economic_buyer', 'technical_evaluator', 'end_user', 'detractor', 'influencer', 'procurement', 'legal', 'security'], description: 'Role this contact plays in the buying committee, the decision-making unit. @example \\'economic_buyer\\'', notes: 'The substrate of enterprise multi-threading and of qualification frameworks such as MEDDICC and SPICED: a deal with no `champion` and no `economic_buyer` mapped is single-threaded and at risk, which is a fact the graph can answer rather than a judgement someone has to make. `is_decision_maker` becomes largely derivable from this (`buying_role = economic_buyer`) but is kept for back-compat.' },\n  },\n  // ContentCalendarProperties: Content calendar.\n  content_calendar: {\n    calendar_period: { type: 'string', description: 'Covered period (e.g. \"Q2 2026\")' },\n    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\\'`.' },\n    frequency_count: { type: 'number', description: 'Exact count in the period. Pairs with `frequency_period`.', modifier: 'snapshot' },\n    frequency_period: { type: 'string', description: 'Recurrence period (ISO-8601 `Duration`, e.g. `\\'P7D\\'`)' },\n    frequency_rating: { type: 'string', enum: ['constant', 'regular', 'occasional', 'rare', 'other'], description: 'Qualitative rate tier when an exact rate is unknown' },\n  },\n  // ContentPieceProperties: Content piece.\n  content_piece: {\n    content_type: { type: 'string', enum: ['blog', 'video', 'podcast', 'whitepaper', 'case_study', 'other'], description: 'Format of the content' },\n    url: { type: 'string', description: 'URL where the content is published' },\n  },\n  // ContentStrategyProperties: ContentStrategy entity.\n  content_strategy: {\n    funnel_stage: { type: 'string', enum: ['top_of_funnel', 'middle_of_funnel', 'bottom_of_funnel'], description: 'Funnel stage this content targets' },\n    content_types: { type: 'string[]', description: 'Types of content to produce' },\n    distribution_channels: { type: 'string[]', description: 'Channels where content will be distributed' },\n    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\\'`.' },\n    frequency_count: { type: 'number', description: 'Exact count of publications in the period. Pairs with `frequency_period`.', modifier: 'snapshot' },\n    frequency_period: { type: 'string', description: 'Recurrence period (ISO-8601 `Duration`, e.g. `\\'P7D\\'`)' },\n    frequency_rating: { type: 'string', enum: ['constant', 'regular', 'occasional', 'rare', 'other'], description: 'Qualitative rate tier when an exact rate is unknown' },\n  },\n  // ContentThemeProperties: Content theme.\n  content_theme: {\n    theme_category: { type: 'string', description: 'Category or topic area of the theme' },\n  },\n  // ContractProperties: Contract.\n  contract: {\n    contract_type: { type: 'string', enum: ['service', 'employment', 'nda', 'license', 'partnership', 'other'], description: 'Classification of the contract' },\n    start_date: { type: 'string', description: 'Contract effective start date (ISO format)' },\n    end_date: { type: 'string', description: 'Contract end or expiration date (ISO format)' },\n    value: { type: 'number', description: 'Total monetary value of the contract' },\n    currency: { type: 'string', description: 'Currency code for the contract value' },\n    auto_renewal: { type: 'string', enum: ['auto_renew', 'optional_extension', 'none'], description: 'How the contract renews at expiration' },\n    renewal_term: { type: 'string', description: 'Duration of each renewal period' },\n    notice_period: { type: 'string', description: 'Notice period required for termination or non-renewal' },\n    governing_law: { type: 'string', description: 'Jurisdiction whose laws govern the contract' },\n  },\n  // ContractClauseProperties: Contract clause.\n  contract_clause: {\n    clause_type: { type: 'string', enum: ['indemnity', 'liability_cap', 'termination', 'confidentiality', 'ip_assignment', 'non_compete', 'warranty', 'governing_law', 'other'], description: 'Specific clause. Closed set covering canonical commercial clause families. Pairs with `clause_category` (`\\'protective\\' | \\'operational\\' | \\'financial\\' | \\'boilerplate\\'`), the functional grouping. `clause_type` is the named clause.' },\n    clause_category: { type: 'string', enum: ['protective', 'operational', 'financial', 'boilerplate'], description: 'Functional category of the clause' },\n    clause_text: { type: 'string', description: 'Full text of the clause' },\n    is_negotiable: { type: 'boolean', description: 'Whether this clause is open to negotiation' },\n    risk_level: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Risk level if the clause is accepted as-is (1 = negligible, 5 = severe exposure)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // CostStructureProperties: CostStructure.\n  cost_structure: {\n    cost_type: { type: 'string', enum: ['fixed', 'variable', 'cogs', 'opex'], description: 'Classification' },\n    amount: { type: 'number', description: 'Monetary amount' },\n    period: { type: 'string', enum: ['monthly', 'yearly', 'one_time'], description: 'Recurrence' },\n  },\n  // CulturalAdaptationProperties: Cultural adaptation.\n  cultural_adaptation: {\n    adaptation_type: { type: 'string', enum: ['content', 'imagery', 'ux', 'legal', 'payment'], description: 'Aspect of the product being adapted' },\n    rationale: { type: 'string', description: 'Reason for the cultural adaptation' },\n  },\n  // CustomerFeedbackProperties: Customer feedback.\n  customer_feedback: {\n    feedback_type: { type: 'string', enum: ['survey', 'interview', 'review', 'nps'], description: 'How the feedback was collected' },\n    sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Overall sentiment of the feedback' },\n    verbatim: { type: 'string', description: 'Exact words from the customer' },\n    signal_sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Detected sentiment of the underlying signal' },\n    signal_channel: { type: 'string', description: 'Channel through which the signal was received' },\n    signal_urgency: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], description: 'Perceived urgency of the feedback' },\n  },\n  // CustomerHealthScoreProperties: Customer health score.\n  customer_health_score: {\n    metrics: { type: 'object', description: 'Individual metrics that compose the health score' },\n    overall_score: { type: 'number', description: 'Aggregate health score (0-100)' },\n    risk_level: { type: 'string', enum: ['healthy', 'at_risk', 'red'], description: 'Current risk classification' },\n    trend: { type: 'string', enum: ['improving', 'stable', 'declining'], description: 'Direction the health score is moving' },\n  },\n  // CustomerJourneyStageProperties: Customer journey stage.\n  customer_journey_stage: {\n    stage_type: { type: 'string', enum: ['awareness', 'acquisition', 'activation', 'retention', 'revenue', 'referral'], description: 'Which pirate metric (AAARRR) this stage maps to' },\n    stage_order: { type: 'number', description: 'Display order along the lifecycle timeline (0-indexed). The `*_order` convention shared with `journey_phase.phase_order` and `journey_step.step_order` (UPG-675 / CS-8), so two same-`stage_type` stages are orderable.' },\n    avg_duration: { type: 'string', description: 'Average time a customer spends in this stage' },\n    conversion_rate: { type: 'number', description: 'Percentage of customers who advance to the next stage', modifier: 'snapshot' },\n  },\n  // CustomerRelationshipProperties: CustomerRelationship.\n  customer_relationship: {\n    relationship_type: { type: 'string', enum: ['personal', 'self_service', 'automated', 'community', 'co_creation'], description: 'Interaction shape' },\n    acquisition_role: { type: 'string', enum: ['first_touch', 'nurture', 'demo', 'close', 'other'], description: 'Acquisition funnel stage primarily served' },\n    retention_role: { type: 'string', enum: ['onboarding', 'check_in', 'expansion', 'renewal', 'reactivation', 'other'], description: 'Retention lever primarily pulled in the customer lifecycle' },\n  },\n  // DashboardProperties: Dashboard entity.\n  dashboard: {\n    tool: { type: 'string', enum: ['looker', 'amplitude', 'mixpanel', 'posthog', 'omni', 'custom'], description: 'Analytics tool hosting this dashboard' },\n    url: { type: 'string', description: 'URL to the live dashboard', modifier: 'volatile' },\n    audience: { type: 'string', description: 'Intended audience for this dashboard' },\n    element_count: { type: 'number', description: 'Number of widgets or panels on the dashboard', modifier: 'derived' },\n    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.' },\n    filter_count: { type: 'number', description: 'Number of user-configurable filters', modifier: 'derived' },\n  },\n  // DataClassificationProperties: Data classification.\n  data_classification: {\n    level: { type: 'string', enum: ['public', 'internal', 'confidential', 'restricted'], description: 'Sensitivity level' },\n    handling_requirements: { type: 'string', description: 'Handling rules' },\n    examples: { type: 'string[]', description: 'Example data covered' },\n    retention_period: { type: 'string', description: 'Retention period' },\n    encryption_required: { type: 'boolean', description: 'Whether encryption is mandatory' },\n  },\n  // DataContractProperties: Data contract.\n  data_contract: {\n    retention_period: { type: 'string', description: 'How long data is retained before deletion' },\n    deletion_policy: { type: 'string', description: 'Policy governing data deletion' },\n    third_party_sharing: { type: 'boolean', description: 'Whether data is shared with third parties' },\n    owner: { type: 'string', description: 'Owning person or team accountable for the contract. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n  },\n  // DataDomainProperties: DataDomain. A coarse-grained grouping of related data assets (sources,\n  data_domain: {\n    steward: { type: 'string', description: 'Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    domain_type: { type: 'string', enum: ['master', 'operational', 'analytical', 'reference'], description: 'Domain contents classification. `master` = canonical entity data (customers, products). `operational` = live transactional data. `analytical` = warehouse / BI data. `reference` = slow-changing lookup data.' },\n    sensitivity: { type: 'string', enum: ['public', 'internal', 'confidential', 'restricted'], description: 'Sensitivity band applied across the domain' },\n  },\n  // DataFlowProperties: Data flow between services.\n  data_flow: {\n    trigger: { type: 'string', description: 'What triggers the flow' },\n    data_type: { type: 'string', description: 'Type of data transferred' },\n    direction: { type: 'string', enum: ['unidirectional', 'bidirectional'], description: 'Direction (cardinality of the link).' },\n    orientation: { type: 'string', enum: ['inbound', 'outbound', 'internal'], description: 'Flow orientation relative to the system or component, a separate axis from `direction` (which is cardinality). A flow can be `unidirectional` AND `inbound`. Added in 0.9.12 to split the orientation axis that authors were conflating into `direction` (inbound/outbound/internal values).' },\n    protocol: { type: 'string', enum: ['rest', 'graphql', 'grpc', 'event', 'webhook', 'file'], description: 'Communication protocol' },\n  },\n  // DataLineageProperties: DataLineage entity.\n  data_lineage: {\n    transformation: { type: 'string', description: 'Description of how the data is transformed' },\n  },\n  // DataModelProperties: DataModel entity.\n  data_model: {\n    schema_name: { type: 'string', description: 'Name of the schema this model belongs to' },\n    database_name: { type: 'string', description: 'Name of the database containing this model' },\n    table_count: { type: 'number', description: 'Number of tables in the model', modifier: 'derived' },\n    column_count: { type: 'number', description: 'Total number of columns across all tables', modifier: 'derived' },\n    test_count: { type: 'number', description: 'Number of data tests defined for this model', modifier: 'derived' },\n    model_type: { type: 'string', enum: ['relational', 'document', 'graph', 'time_series'], description: 'Database paradigm used' },\n    materialization: { type: 'string', enum: ['view', 'table', 'incremental', 'ephemeral', 'materialized_view'], description: 'How the model is materialised in the warehouse' },\n    meta: { type: 'object', description: 'Arbitrary metadata key-value pairs' },\n    tags: { type: 'string[]', description: 'Free-form categorisation tags' },\n  },\n  // DataPipelineProperties: DataPipeline entity.\n  data_pipeline: {\n    schedule: { type: 'string', description: 'Cron or scheduling expression' },\n    avg_runtime: { type: 'string', description: 'Average wall-clock runtime per execution' },\n    orchestrator: { type: 'string', description: 'Orchestration tool (e.g. \"Airflow\", \"Dagster\", \"dbt Cloud\")' },\n    retry_count: { type: 'number', description: 'Number of automatic retries on failure', modifier: 'snapshot' },\n    retry_delay_seconds: { type: 'number', description: 'Delay between retries in seconds' },\n    timeout_seconds: { type: 'number', description: 'Maximum allowed runtime in seconds before timeout' },\n    trigger_rule: { type: 'string', description: 'Rule that determines when this pipeline triggers' },\n    pool: { type: 'string', description: 'Resource pool this pipeline runs in' },\n  },\n  // DataProductProperties: DataProduct entity.\n  data_product: {\n    data_product_type: { type: 'string', enum: ['report', 'dataset', 'stream', 'api', 'ml_feature', 'other'], description: 'Classification of the data product (UPG-579 Option B).' },\n    sla_freshness: { type: 'string', description: 'Freshness SLA commitment (e.g. \"< 1 hour\")' },\n    owner: { type: 'string', description: 'Owning person or team. Sibling of `data_domain.steward`: use `owner` for the accountable party of a single data product, `steward` for a whole domain. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n  },\n  // DataQualityRuleProperties: DataQualityRule entity.\n  data_quality_rule: {\n    rule_type: { type: 'string', enum: ['completeness', 'accuracy', 'freshness', 'uniqueness', 'consistency'], description: 'Quality dimension this rule validates' },\n    test_type: { type: 'string', enum: ['unique', 'not_null', 'accepted_values', 'relationships', 'custom'], description: 'Specific test implementation' },\n    column_ref: { type: 'string', description: 'Column or field this rule applies to' },\n    threshold: { type: 'string', description: 'Acceptable threshold value for the rule' },\n    alert_on_breach: { type: 'boolean', description: 'Whether to send an alert when the rule is breached' },\n    last_run_status: { type: 'string', enum: ['pass', 'fail', 'error', 'not_run'], description: 'Result of the most recent run' },\n    last_run_date: { type: 'string', description: 'ISO date of the most recent run' },\n  },\n  // DataSourceProperties: DataSource entity.\n  data_source: {\n    source_type: { type: 'string', enum: ['database', 'api', 'event_stream', 'warehouse'], description: 'Kind of data source' },\n    connection_status: { type: 'string', enum: ['connected', 'disconnected', 'error'], description: 'Current connection health' },\n    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.' },\n  },\n  // DatabaseSchemaProperties: Database schema.\n  database_schema: {\n    db_type: { type: 'string', enum: ['postgres', 'mysql', 'mongodb', 'redis', 'other'], description: 'Engine' },\n    schema_version: { type: 'string', description: 'Current schema version' },\n    owner: { type: 'string', description: 'Owning person or team responsible for design and migrations. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    table_count: { type: 'number', description: 'Tables or collections in this schema. Useful for migration scope estimation.', modifier: 'derived' },\n  },\n  // DealProperties: Deal.\n  deal: {\n    deal_value: { type: 'number', description: 'Monetary value of the deal' },\n    close_date: { type: 'string', description: 'Expected close date (ISO format)' },\n    probability: { type: 'number', description: 'Likelihood of closing (0-100%)' },\n    deal_outcome: { type: 'string', enum: ['won', 'lost', 'no_decision'], description: 'Terminal result of the deal: the win or loss verdict a closed deal carries. @example \\'won\\'', notes: 'An Event-axis outcome (the verdict on a one-time event) and NOT a lifecycle phase, so it is `deal_outcome` rather than `deal_status`, per status-convention Rule 3. Lifecycle (open, won and lost as phases) belongs on the base `status` slot. This field is what gives `deal_lost_to_competitor` and win-loss study derivations their anchor.' },\n    deal_type: { type: 'string', enum: ['new_business', 'expansion', 'renewal'], description: 'Motion this deal belongs to. Mirrors `PipelineSales.pipeline_type` at the deal grain; `renewal` is the value `subscription_renews_via_deal` points at. @example \\'expansion\\'' },\n    next_step: { type: 'string', description: 'The single most-used CRM field: the next concrete action to move the deal. Free text on purpose (a coordination note, not a structured task). @example \\'Send security questionnaire to procurement\\'' },\n    next_step_date: { type: 'string', description: 'When the `next_step` is due (ISO format).' },\n    qualification_framework: { type: 'string', enum: ['meddicc', 'bant', 'spiced', 'custom'], description: 'Qualification framework this deal is scored against. Names the rubric so the `qualification_score` is interpretable; per-pillar booleans (MEDDICC\\'s Metrics / Economic buyer / Decision criteria / …) are deferred until `custom` recurrence proves the demand. @example \\'meddicc\\'' },\n    qualification_score: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'How well-qualified the deal is, on the canonical `confidence_5` scale (UPGAssessment: numeric value plus a high/medium/low label). Coarse by design; the granular per-pillar breakdown is deferred (see `qualification_framework`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    owner: { type: 'string', description: 'Accountable person or team carrying the deal. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // DecisionProperties: Decision record. Strategic, product, engineering, or design.\n  decision: {\n    layer: { type: 'string', enum: ['strategic', 'product', 'engineering', 'design', 'business', 'other'], description: 'Domain layer. `engineering` = Architecture Decision Record (ADR). `design` = Design Decision Record. The layer field replaces separate `architecture_decision` and `design_decision` types.' },\n    context: { type: 'string', description: 'Background and problem statement that prompted the decision' },\n    options_considered: { type: 'string[]', description: 'Required. Evaluated alternatives. A decision without considered alternatives is incomplete.' },\n    rationale: { type: 'string', description: 'Why the chosen option was selected over the alternatives' },\n    date: { type: 'string', description: 'ISO date the decision was made or last meaningfully updated.' },\n    decision_outcome: { type: 'string', description: 'Outcome text. What was decided. Separate from `rationale` (which explains why).' },\n    consequences: { type: 'string', description: 'Known positive and negative consequences. Mirrors MADR\\'s \"Consequences\" section.' },\n    decision_makers: { type: 'string[]', description: 'People who made the decision. Mirrors MADR\\'s \"Deciders\" field. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable.' },\n    decision_drivers: { type: 'string[]', description: 'Forces, constraints, and goals that shaped the decision. Mirrors MADR\\'s \"Decision Drivers\" section. @example [\"must work offline\", \"team has no Go expertise\", \"cost < $500/mo\"]' },\n  },\n  // DeliverableProperties: Deliverable.\n  deliverable: {\n    deliverable_type: { type: 'string', enum: ['document', 'prototype', 'release', 'design', 'report', 'other'], description: 'Kind of deliverable (UPG-579 Option B).' },\n    due_date: { type: 'string', description: 'Due date for the deliverable (ISO format)' },\n    acceptance_criteria: { type: 'string', description: 'Criteria that must be met for the deliverable to be accepted' },\n  },\n  // DemandGenProgramProperties: DemandGenProgram entity.\n  demand_gen_program: {\n    program_type: { type: 'string', enum: ['webinar', 'content_syndication', 'event', 'paid_media', 'aba', 'beta', 'other'], description: 'Closed-set classification so demand-gen mix can be reported on a stable axis. Use `\\'other\\'` for novel program shapes; raise a spec proposal if `\\'other\\'` recurs.' },\n    budget: { type: 'number', description: 'Allocated budget for this program' },\n    target_leads: { type: 'number', description: 'Target number of leads to generate' },\n  },\n  // DepartmentProperties: Department entity. A department is the single org tier above a team.\n  department: {\n    headcount: { type: 'number', description: 'Total number of people in the department', modifier: 'snapshot' },\n    budget: { type: 'number', description: 'Annual budget allocated to the department' },\n    department_mission: { type: 'string', description: 'Charter / purpose statement for the department' },\n    leader: { type: 'string', description: 'Department leader (person or role reference). Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    fiscal_year: { type: 'string', description: 'Fiscal year the headcount / budget numbers apply to' },\n  },\n  // DependencyProperties: Dependency entity.\n  dependency: {\n    dependency_type: { type: 'string', enum: ['blocks', 'enables', 'informs'], description: 'Nature of the dependency relationship' },\n    resolution: { type: 'string', description: 'How the dependency was or will be resolved' },\n    criticality: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'How urgent the dependency is to resolve' },\n    target_date: { type: 'string', description: 'Date by which resolution is needed (ISO 8601)' },\n    workaround_available: { type: 'boolean', description: 'Whether a workaround exists if the dependency is not resolved in time' },\n  },\n  // DeploymentProperties: Deployment.\n  deployment: {\n    environment: { type: 'string', enum: ['dev', 'staging', 'prod'], description: 'Target environment' },\n    timestamp: { type: 'string', description: 'ISO timestamp' },\n    sha: { type: 'string', description: 'Git SHA of the deployed commit' },\n    duration_seconds: { type: 'number', description: 'Wall-clock duration in seconds. Tracks deployment speed trends.' },\n    deployer: { type: 'string', description: 'Triggering person or system. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // DesignComponentProperties: Design system component.\n  design_component: {\n    atomic_level: { type: 'string', enum: ['atom', 'molecule', 'organism', 'template'], description: 'Atomic design level' },\n    code_url: { type: 'string', description: 'Code implementation URL' },\n    documentation_url: { type: 'string', description: 'Documentation / usage page URL' },\n    component_version: { type: 'string', description: 'Component version (independent of the wider design system version)' },\n    component_status: { type: 'string', enum: ['draft', 'beta', 'stable', 'deprecated'], description: 'Distribution readiness' },\n    accessibility_notes: { type: 'string', description: 'Component-specific accessibility guidance' },\n  },\n  // DesignConceptProperties: Design concept being explored.\n  design_concept: {\n    sketch_url: { type: 'string', description: 'URL of the sketch or visual', modifier: 'volatile' },\n    rationale: { type: 'string', description: 'Selection or rejection rationale' },\n    concept_status: { type: 'string', enum: ['exploring', 'validated', 'selected', 'rejected'], description: 'Current selection status' },\n    maturity: { type: 'string', enum: ['sketch', 'refined', 'final'], description: 'Development stage, from rough idea to presentation-ready' },\n    owner: { type: 'string', description: 'Shepherding designer or researcher. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // DesignGuidelineProperties: Design guideline.\n  design_guideline: {\n    guideline_category: { type: 'string', enum: ['spacing', 'color', 'typography', 'layout', 'interaction', 'content'], description: 'Category covered' },\n    applies_to: { type: 'string', description: 'Applicable elements or contexts' },\n    rationale: { type: 'string', description: 'Reasoning. Why this rule exists.' },\n    rule_strength: { type: 'string', enum: ['must', 'must_not', 'exception', 'warning', 'guideline'], description: 'Imperative force. (Superseded the removed `strictness` field in 0.14.0, UPG-574.)' },\n    exception_policy: { type: 'string', description: 'Exception request or documentation process' },\n  },\n  // DesignPatternProperties: Reusable design pattern.\n  design_pattern: {\n    pattern_category: { type: 'string', enum: ['navigation', 'input', 'display', 'feedback', 'layout'], description: 'Category' },\n    usage_context: { type: 'string', description: 'When and where to use' },\n    pattern_status: { type: 'string', enum: ['proposed', 'adopted', 'experimental', 'deprecated'], description: 'Adoption status inside the system' },\n    anti_patterns: { type: 'string', description: 'Common mis-applications or lookalikes to avoid' },\n    examples: { type: 'string', description: 'Real-world usages: screens, components, flows' },\n  },\n  // DesignQuestionProperties: Design question framing an open problem.\n  design_question: {\n    question: { type: 'string', description: 'The question itself (\"How might we…?\", \"What if…?\"). Primary content.' },\n    problem_context: { type: 'string', description: 'Context that prompted the question' },\n    hypothesis: { type: 'string', description: 'Working hypothesis. Captured up-front so research can confirm or disconfirm.' },\n    target_domain: { type: 'string', enum: ['ux', 'visual', 'interaction', 'content', 'accessibility', 'other'], description: 'Target design discipline' },\n    framing: { type: 'string', enum: ['how_might_we', 'what_if', 'why_do', 'how_do', 'what_prevents', 'other'], description: 'Question framing template' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Importance against other backlog questions' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence the question is well-framed (UPGAssessment on `confidence_5`). Distinct from confidence in any answer.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    assumptions: { type: 'string[]', description: 'Underlying assumptions. Surfaced explicitly so they can be challenged or validated.' },\n    validation_method: { type: 'string', enum: ['interview', 'survey', 'usability_test', 'analytics', 'a_b_test', 'prototype_test', 'literature_review', 'other'], description: 'Primary validation method' },\n  },\n  // DesignSprintProperties: DesignSprint entity.\n  design_sprint: {\n    duration: { type: 'string', description: 'Duration of the sprint. @example \"5 days\"' },\n    challenge: { type: 'string', description: 'The core challenge the sprint addresses' },\n  },\n  // DesignSystemProperties: Design system as a whole.\n  design_system: {\n    version: { type: 'string', description: 'Current version' },\n    repo_path: { type: 'string', description: 'Code repository or package path' },\n    maintainer: { type: 'string', description: 'Maintaining person or team. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    license: { type: 'string', description: 'Open-source license, if public' },\n    homepage_url: { type: 'string', description: 'Documentation homepage. Public-facing entry point.' },\n  },\n  // DesignTokenProperties: Design token.\n  design_token: {\n    category: { type: 'string', enum: ['color', 'spacing', 'typography', 'radius', 'motion', 'dimension', 'fontFamily', 'fontWeight', 'duration', 'cubicBezier', 'number', 'shadow', 'gradient', 'border', 'transition', 'strokeStyle', 'opacity'], description: 'What kind of value this token holds. Aligned to the Design Tokens Community Group `$type` vocabulary so a DTCG export maps across without translation; the five original UPG values are kept, `color` and `spacing` being the ones DTCG spells the same and `typography`, `radius`, `motion` being groupings a design system names in its own terms.', notes: 'DTCG mapping for the values that are not one-to-one: a `radius` token is a DTCG `dimension`, a `motion` token is usually a `duration` or a `cubicBezier`, and a `typography` token is a composite over `fontFamily` / `fontWeight` / `dimension`. Both spellings are accepted: an estate that speaks DTCG writes the `$type` name, one that speaks UPG\\'s original five keeps writing them, and neither has to translate at the boundary. Extended at 0.39.0 from a measured estate (163 DTCG primitives) whose `shadow`, `dimension` and `opacity` tokens had no category to land on. The enum was documented but unenforced then; `validate_graph`\\'s `property_enum_drift` class (same release) is what makes it real, which is why the vocabulary had to be right before the check arrived.' },\n    value: { type: 'string', description: 'Resolved value' },\n    css_variable: { type: 'string', description: 'CSS custom property name' },\n  },\n  // DesiredOutcomeProperties: DesiredOutcome entity.\n  desired_outcome: {\n    statement: { type: 'string', description: 'Outcome statement in the user\\'s words' },\n    importance: {\n      type: 'assessment', scale_id: 'importance_5', description: 'How important this outcome is to the user (1 = low, 5 = critical)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    current_satisfaction: {\n      type: 'assessment', scale_id: 'satisfaction_5', description: 'How satisfied the user currently is with this outcome (1 = very unsatisfied, 5 = fully satisfied)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // DeveloperPortalProperties: Developer portal.\n  developer_portal: {\n    portal_url: { type: 'string', description: 'URL of the developer portal', modifier: 'volatile' },\n    doc_count: { type: 'number', description: 'Number of documentation pages', modifier: 'derived' },\n    sandbox_available: { type: 'boolean', description: 'Whether a sandbox environment is available' },\n  },\n  // DiscountStrategyProperties: Discount strategy.\n  discount_strategy: {\n    discount_type: { type: 'string', enum: ['percentage', 'fixed', 'tiered', 'bundle'], description: 'How the discount is applied' },\n    discount_percentage: { type: 'number', description: 'Discount amount as a percentage (0-100)' },\n    valid_until: { type: 'string', description: 'Expiration date of the discount (ISO format)' },\n    redemption_count: { type: 'number', description: 'Number of times this discount has been redeemed', modifier: 'snapshot' },\n  },\n  // DistributionChannelProperties: DistributionChannel.\n  distribution_channel: {\n    channel_type: { type: 'string', enum: ['direct', 'retail', 'wholesale', 'marketplace', 'oem'], description: 'How the product reaches customers' },\n    owned_or_partner: { type: 'string', enum: ['owned', 'partner'], description: 'Owned or partner-operated' },\n    phase: { type: 'string', enum: ['awareness', 'purchase', 'delivery', 'support'], description: 'Customer journey phase served' },\n  },\n  // DocumentProperties: Document. Provenance container linking to source files.\n  document: {\n    path: { type: 'string', description: 'File path or workspace-relative location. Use `source_url` for off-platform links.' },\n    source_url: { type: 'string', description: 'Canonical retrievable URL' },\n    platform: { type: 'string', enum: ['markdown', 'notion', 'figma', 'google_docs', 'confluence', 'github', 'linear', 'other'], description: 'Hosting platform' },\n    document_type: { type: 'string', enum: ['vision', 'plan', 'decision', 'research', 'spec', 'audit', 'session', 'feedback', 'case-study', 'narrative', 'bug-report', 'archive-collection', 'rfc', 'runbook', 'guide', 'onboarding', 'brief', 'report', 'reference'], description: 'Purpose classification' },\n    last_updated: { type: 'string', description: 'ISO 8601 last-meaningful-update' },\n    word_count: { type: 'number', description: 'Approximate word count. Useful for planning, indexing, summarisation.', modifier: 'snapshot' },\n    content_summary: { type: 'string', description: '1–3 sentence summary. Drives previews, search snippets, embedding context.' },\n    language: { type: 'string', description: 'Primary language (BCP 47 tag, e.g. \"en\", \"en-GB\", \"fr\")' },\n  },\n  // DocumentationTemplateProperties: Documentation template.\n  documentation_template: {\n    template_type: { type: 'string', description: 'Kind of document this template produces' },\n    sections: { type: 'string[]', description: 'Sections or outline of the template' },\n    version: { type: 'string', description: 'Version identifier of the template' },\n  },\n  // DomainEntityProperties: DDD domain entity.\n  domain_entity: {\n    entity_identity: { type: 'string', description: 'Identifier shape (e.g. \"UUID\", \"email\")' },\n    lifecycle: { type: 'string', description: 'Lifecycle description' },\n  },\n  // DomainEventProperties: Domain event in an event-driven architecture.\n  domain_event: {\n    event_name: { type: 'string', description: 'Event name (e.g. \"OrderPlaced\")' },\n    payload_schema: { type: 'string', description: 'Payload schema or shape' },\n    triggered_by: { type: 'string', description: 'What triggers this event' },\n  },\n  // EducationProgramProperties: Education program.\n  education_program: {\n    program_type: { type: 'string', enum: ['onboarding', 'certification', 'ongoing', 'partner'], description: 'Purpose of the education program' },\n  },\n  // EmailSequenceProperties: Email sequence.\n  email_sequence: {\n    sequence_type: { type: 'string', enum: ['onboarding', 'nurture', 're_engagement', 'sales', 'other'], description: 'Purpose of the email sequence' },\n    email_count: { type: 'number', description: 'Number of emails in the sequence', modifier: 'derived' },\n    open_rate: { type: 'number', description: 'Average open rate across the sequence (0-1)', modifier: 'snapshot' },\n    click_rate: { type: 'number', description: 'Average click-through rate across the sequence (0-1)', modifier: 'snapshot' },\n  },\n  // EpicProperties: A collection of related user stories that delivers a feature or capability.\n  epic: {\n    effort: { type: 'string', description: 'Effort estimate (e.g. \"2h\", \"1d\", \"3 points\"). Use a consistent unit within your team. Canonical name for the work-item size family (`epic`, `user_story`, `task`).' },\n    estimate: { type: 'string', description: 'Rough size estimate (e.g. \"3 sprints\", \"L\", \"13 points\"). @deprecated STAGED, release number assigned at release prep (docket Track \"Docket wave 2\"). Use `effort`, the family-uniform name already carried by `user_story` and `task`. `estimate` was epic\\'s lone divergent spelling of the same concept and it caused real misreads (the app read `estimate` on `user_story`, where only `effort` is declared). Kept (not removed) for back-compat; removal is a later major. Writers: emit `effort`. Readers: prefer `effort`, fall back to `estimate`.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Task-level priority' },\n    owner: { type: 'string', description: 'Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    start_date: { type: 'string', description: 'ISO date work begins' },\n    target_date: { type: 'string', description: 'ISO date work completes' },\n    workflow_state: { type: 'string', description: 'The source tool\\'s raw custom workflow state, verbatim and opaque (e.g. \"In Review\", \"QA\", \"Needs Triage\"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.' },\n    workflow_state_category: { type: 'string', enum: ['triage', 'backlog', 'unstarted', 'started', 'completed', 'cancelled'], description: 'Canonical bucket the raw `workflow_state` maps onto for reasoning: a source \"In Review\" and a source \"QA\" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.', notes: 'It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source\\'s raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.' },\n  },\n  // ErrorBudgetProperties: Error budget.\n  error_budget: {\n    budget_remaining: { type: 'number', description: 'Remaining budget percentage (0–100). @example 45.2 (45.2% remaining, 54.8% used)', modifier: 'snapshot' },\n    burn_rate: { type: 'number', description: 'Consumption rate as a multiplier against sustainable burn. 1.0 = on track. 2.5 = consuming 2.5x faster than sustainable.', modifier: 'snapshot' },\n    policy: { type: 'string', description: 'Policy when the budget hits 0%. @example \"Freeze all non-reliability deploys\", \"Page engineering lead immediately\"' },\n    budget_window: { type: 'string', description: 'Budget window. Defines reset cadence. @example \"30 days\", \"rolling 28 days\"' },\n  },\n  // EvalBenchmarkProperties: Evaluation benchmark.\n  eval_benchmark: {\n    benchmark_type: { type: 'string', enum: ['accuracy', 'latency', 'cost', 'safety', 'precision_recall', 'task_success', 'coherence', 'custom'], description: 'Measured dimension.', notes: 'Widened in 0.31.0 with the three dimensions an eval suite actually reports and this set could not express: `precision_recall` (two numbers, not one accuracy figure, and the pair is the point, because a detector that fires on everything scores perfectly on recall alone), `task_success` (did the agent achieve the goal), and `coherence` (rubric-graded, for multi-step runs). THIS ENUM IS A DIMENSION AXIS, AND IT SHOULD STAY ONE. An eval suite\\'s families are a SUBJECT axis (what is under test), and a dimension cannot separate subjects, which is why several families legitimately share `task_success`. The subject is expressed on the EDGE, not here: `eval_benchmark_measures_node` names what a benchmark measures by pointing at it. So \"which benchmarks cover the importer\" is a traversal, and this property stays a clean answer to a different question, \"what dimension does this benchmark report\". The commissioning brief hoped the enum would carry both; splitting them across the enum and the edge is the better answer, and it needs no third mechanism. Corollary worth stating, since it is load-bearing: do NOT add subject-shaped values here. `tool_use` or `documentation` would encode on this axis what the edge already carries, and the two would drift the first time a benchmark measured something its enum value did not admit.' },\n    test_case_count: { type: 'number', description: 'Test cases in the suite', modifier: 'derived' },\n    passing_threshold: { type: 'number', description: 'Minimum passing score' },\n    last_run: { type: 'string', description: 'ISO date of the most recent run' },\n  },\n  // EvalRunProperties: Evaluation run.\n  eval_run: {\n    run_date: { type: 'string', description: 'ISO date executed' },\n    score: { type: 'number', description: 'Aggregate score' },\n    passed: { type: 'boolean', description: 'Whether the passing threshold was met' },\n    duration_ms: { type: 'number', description: 'Wall-clock duration (ms)' },\n    token_count: { type: 'number', description: 'Total tokens consumed' },\n    input_token_count: { type: 'number', description: 'Input tokens' },\n    output_token_count: { type: 'number', description: 'Output tokens' },\n    cost: { type: 'number', description: 'Total run cost' },\n    error_rate: { type: 'number', description: 'Percentage of test cases that errored' },\n    feedback_scores: { type: 'string', description: 'Feedback score summary (human or automated)' },\n    metric_scores: { type: 'object[]', description: 'Per-metric scores, one entry per measured metric.', notes: 'Added in 0.31.0 because `score` is a single aggregate and the forcing case needs two numbers: precision and recall, reported separately. An aggregate hides the only interesting failure mode, which is a detector that catches everything by firing on everything. `sample_size` is not optional decoration, and as of 0.31.0 the type says so: it is a REQUIRED member of `MetricScore`. A sampled run reports its sample size beside its score, always, so a comparison across runs can never quietly compare different sample sizes. A number without its denominator is not a smaller measurement, it is not a measurement, and a remark saying `always` over a field typed optional is a contract only the careful reader honours. The entry shape is the exported `MetricScore` interface rather than an anonymous literal, so a consumer can name the thing it is building. This is one of two `object[]` properties in the spec; the other, `composition.members`, already exports `CompositionMember`. The rejected alternative was two runs per benchmark, which needs no spec change and makes every question about a benchmark\\'s quality a join, encoding a measurement artifact as graph structure.' },\n  },\n  // EventProperties: Event.\n  event: {\n    event_type: { type: 'string', enum: ['conference', 'webinar', 'meetup', 'workshop', 'trade_show', 'other'], description: 'Format of the event' },\n    event_date: { type: 'string', description: 'Date of the event (ISO format)' },\n    location: { type: 'string', description: 'Venue or virtual platform' },\n    attendee_count: { type: 'number', description: 'Number of attendees', modifier: 'snapshot' },\n  },\n  // EventSchemaProperties: EventSchema entity.\n  event_schema: {\n    event_name: { type: 'string', description: 'Name of the analytics or tracking event' },\n    properties: { type: 'string[]', description: 'Property names included in the event payload' },\n    trigger_description: { type: 'string', description: 'Description of what triggers this event' },\n  },\n  // EvidenceProperties: Evidence supporting or refuting a hypothesis (P2: lifecycle-free snapshot).\n  evidence: {\n    evidence_rigor: { type: 'string', enum: ['quantitative', 'qualitative', 'anecdotal', 'expert_opinion'], description: 'Epistemological rigour. How the data was gathered.' },\n    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.' },\n    direction: { type: 'string', enum: ['supports', 'refutes', 'neutral'], description: 'Direction relative to the parent hypothesis.' },\n    weight: {\n      type: 'assessment', scale_id: 'importance_5', description: 'Strength (UPGAssessment, scale `scale_5`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    summary: { type: 'string', description: 'Plain-English summary.' },\n    observed_at: { type: 'string', description: 'ISO date observed.' },\n    source: { type: 'string', description: 'Free-text provenance note' },\n  },\n  // ExperimentProperties: A structured test designed to validate a hypothesis. The canonical unit of\n  experiment: {\n    method: { type: 'string', description: 'Experimental method (e.g. \"A/B test\", \"usability study\", \"smoke test\")' },\n    start_date: { type: 'string', description: 'ISO start date' },\n    end_date: { type: 'string', description: 'ISO end date' },\n    sample_size: { type: 'number', description: 'Targeted participants or observations' },\n    expected_lift: { type: 'number', description: 'Expected change in the primary metric' },\n    expected_lift_unit: { type: 'string', enum: ['percentage', 'absolute', 'ratio'], description: 'Unit of `expected_lift`' },\n    actual_lift: { type: 'number', description: 'Observed change in the primary metric' },\n  },\n  // ExperimentPlanProperties: The validation PLAN: the design for a structured test of a hypothesis\n  experiment_plan: {\n    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.' },\n    success_criteria: { type: 'string', description: 'Plain-English description of \"passing\"' },\n    sample_size: { type: 'number', description: 'Targeted participants or observations for the planned test. Absorbed from `test_plan` (UPG-678) when it re-homed to QA; the planning sample size now lives on the validation plan.' },\n    projected_reach: {\n      type: 'assessment', scale_id: 'reach_5', description: 'Projected reach: how many people the run is expected to touch (UPGAssessment)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    projected_impact: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Projected impact on the target metric (UPGAssessment)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Team confidence at plan-time (UPGAssessment, scale `confidence_5`)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    cost_estimate: {\n      type: 'assessment', scale_id: 'effort_5', description: 'Cost estimate at plan-time (UPGAssessment)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    planned_start_date: { type: 'string', description: 'Planned start date' },\n    planned_end_date: { type: 'string', description: 'Planned end date' },\n  },\n  // ExperimentRunProperties: Execution evidence for a structured test of a hypothesis (UCS pattern P6: event-occurrence).\n  experiment_run: {\n    experiment_type: { type: 'string', enum: ['ab_test', 'growth', 'pricing'], description: 'What sort of experiment this run is: `ab_test` is a controlled split between variants, `growth` an acquisition or activation experiment, `pricing` a packaging or willingness-to-pay one. Distinct from `disposition`, which is the outcome axis.', notes: 'Three retired types (`ab_test`, `growth_experiment`, `pricing_experiment`) collapsed into `experiment_run` precisely along this axis, and the migration defaults stamp it so the distinction survives consolidation. Extensible: further kinds may be added in a minor release.' },\n    actual_start_date: { type: 'string', description: 'ISO actual start date (may differ from the plan\\'s `planned_start_date`)' },\n    actual_end_date: { type: 'string', description: 'ISO actual end date' },\n    actual_reach: { type: 'number', description: 'Observed reach: how many people the run actually touched' },\n    outcome_summary: { type: 'string', description: 'Plain-English outcome' },\n    severity_of_finding: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Severity / strength of the finding (UPGAssessment)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    learning: { type: 'string', description: 'What the team learned (rich text)' },\n    disposition: { type: 'string', enum: ['confirmed', 'disconfirmed', 'inconclusive', 'aborted'], description: 'Resolution against the parent plan\\'s success criteria. `confirmed` = evidence supports the parent hypothesis_claim. `disconfirmed` = evidence refutes the parent hypothesis_claim. `inconclusive` = data insufficient or noisy. `aborted` = run terminated early.' },\n  },\n  // ExternalApiProperties: External API dependency.\n  external_api: {\n    provider: { type: 'string', description: 'Provider' },\n    base_url: { type: 'string', description: 'Base URL' },\n    auth_type: { type: 'string', enum: ['api_key', 'oauth2', 'jwt', 'basic', 'none'], description: 'Authentication method' },\n    rate_limits: { type: 'string', description: 'Rate limit description' },\n  },\n  // FeasibilityStudyProperties: FeasibilityStudy entity.\n  feasibility_study: {\n    study_type: { type: 'string', enum: ['technical', 'business', 'market', 'resource'], description: 'Type of feasibility being assessed. @example \"technical\" for assessing engineering viability' },\n    conclusion: { type: 'string', enum: ['feasible', 'not_feasible', 'conditional', 'needs_more_data'], description: 'Outcome conclusion of the study' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence in the conclusion (UPGAssessment on `confidence_5`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // FeatureProperties: A discrete, user-facing capability of the product.\n  feature: {\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Task-level priority' },\n    owner: { type: 'string', description: 'Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    start_date: { type: 'string', description: 'ISO date work begins' },\n    target_date: { type: 'string', description: 'ISO date work completes' },\n    health: { type: 'string', enum: ['on_track', 'at_risk', 'off_track'], description: 'Delivery health' },\n    workflow_state: { type: 'string', description: 'The source tool\\'s raw custom workflow state, verbatim and opaque (e.g. \"In Review\", \"QA\", \"Needs Triage\"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.' },\n    workflow_state_category: { type: 'string', enum: ['triage', 'backlog', 'unstarted', 'started', 'completed', 'cancelled'], description: 'Canonical bucket the raw `workflow_state` maps onto for reasoning: a source \"In Review\" and a source \"QA\" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.', notes: 'It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source\\'s raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.' },\n  },\n  // FeatureAreaProperties: A structural grouping of related features within a product.\n  feature_area: {\n    scope_summary: { type: 'string', description: 'One-line scope description. Disambiguates from sibling areas at a glance.' },\n    owning_team: { type: 'string', description: 'Team identifier or slug. Free-form display. Canonical relationship is the `team_owns_feature_area` edge.' },\n    feature_count: { type: 'number', description: 'Approximate feature count under this area. Snapshot; `feature_area_contains_feature` edges are the source of truth.', modifier: 'derived' },\n    owner: { type: 'string', description: 'Area owner (handle or email). Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Importance to the product overall' },\n    maturity: { type: 'string', enum: ['nascent', 'growing', 'mature', 'legacy'], description: 'Maturity. `nascent` = newly-formed grouping. `mature` = established surface. `legacy` = being phased out for a successor.' },\n  },\n  // FeatureFlagProperties: Feature flag.\n  feature_flag: {\n    key: { type: 'string', description: 'Required. Stable flag key used in code (e.g. \"new-checkout-flow\").' },\n    rollout_pct: { type: 'number', description: 'Percentage enabled (0–100). Meaningful when the flag\\'s `status === \\'rollout\\'`.', modifier: 'snapshot' },\n    targeting_rules: { type: 'string', description: 'Human-readable targeting rules. Full rule evaluation happens in the flag service.' },\n    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.' },\n    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.' },\n    expiry_date: { type: 'string', description: 'ISO date after which this flag should be cleaned up. A temporary flag without an `expiry_date` is a code smell.' },\n    created_date: { type: 'string', description: 'Creation date. Useful for flag age and stale-flag detection.' },\n  },\n  // FeatureRequestProperties: Feature request raised by customer, prospect, or internal stakeholder.\n  feature_request: {\n    request_source: { type: 'string', enum: ['customer', 'internal', 'prospect', 'support', 'community'], description: 'Where the request originated' },\n    vote_count: { type: 'number', description: 'Number of votes or upvotes from users', modifier: 'snapshot' },\n    signal_sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Detected sentiment of the request' },\n    signal_channel: { type: 'string', description: 'Channel through which the request was received' },\n    signal_urgency: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], description: 'Perceived urgency of the request' },\n    revenue_impact: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Estimated revenue impact if implemented (1-5)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    effort_estimate: {\n      type: 'assessment', scale_id: 'effort_5', description: 'Estimated implementation effort (1-5)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    impact_score: { type: 'number', description: 'Computed impact score combining reach, revenue, and effort' },\n    eta: { type: 'string', description: 'Estimated delivery date (ISO format)' },\n  },\n  // FeedbackProgramProperties: Feedback program.\n  feedback_program: {\n    program_type: { type: 'string', enum: ['continuous', 'periodic', 'event_triggered'], description: 'How frequently feedback is collected' },\n    collection_method: { type: 'string', description: 'Method used to collect feedback (e.g. \"survey\", \"interview\", \"widget\")' },\n  },\n  // FeedbackThemeProperties: Recurring theme identified across feedback signals.\n  feedback_theme: {\n    sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Overall sentiment across mentions' },\n    actionable: { type: 'boolean', description: 'Whether this theme can be acted upon' },\n    frequency: {\n      type: 'assessment', scale_id: 'frequency_5', description: 'How often the theme is mentioned (1-5)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    first_seen_date: { type: 'string', description: 'ISO date when the theme was first identified' },\n    last_seen_date: { type: 'string', description: 'ISO date of the most recent mention' },\n    trend_direction: { type: 'string', enum: ['growing', 'stable', 'declining'], description: 'Whether mentions are increasing or decreasing' },\n  },\n  // FeedbackVoteProperties: Feedback vote.\n  feedback_vote: {\n    vote_count: { type: 'number', description: 'Total number of votes cast', modifier: 'snapshot' },\n    mrr_impact: { type: 'number', description: 'Combined MRR of voting accounts' },\n  },\n  // FixProperties: Specific change that resolved an issue.\n  fix: {\n    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.' },\n    commit: { type: 'string', description: 'Git commit SHA' },\n    files_changed: { type: 'string[]', description: 'Files changed', modifier: 'volatile' },\n    deployed_at: { type: 'string', description: 'ISO timestamp landed in the target environment.' },\n    fixed_date: { type: 'string', description: 'Application date (ISO date). Coarser-grained complement to `deployed_at`.' },\n    verified: { type: 'boolean', description: 'Verified in production' },\n    verified_by_test: { type: 'boolean', description: 'Validated by an automated regression or integration test. Distinct from `verified` (human judgment).' },\n  },\n  // ForecastProperties: Revenue forecast.\n  forecast: {\n    forecast_period: { type: 'string', description: 'Time period the forecast covers (e.g. \"Q2 2026\")' },\n    predicted_revenue: { type: 'number', description: 'Predicted revenue amount' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence in the prediction (1 = speculative, 5 = high conviction)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    methodology: { type: 'string', description: 'Forecasting methodology used' },\n  },\n  // FrameworkExerciseProperties: Framework exercise: one run of a framework over a set of entities.\n  framework_exercise: {\n    framework_id: { type: 'string', description: 'Which framework this exercise runs: a framework id (e.g. \\'moscow\\', \\'rice-scoring\\', \\'kano-model\\'). Resolves against the framework catalog.' },\n    inputs_snapshot: { type: 'object', description: 'Optional frozen copy of the framework\\'s input spec at apply time, so a historical exercise still renders correctly if the framework definition later evolves (inputs added, removed, or rescaled).' },\n    input_weights: { type: 'object', description: 'Relative multiplier per framework input for this run, keyed by input id. @example const properties: FrameworkExerciseProperties = { framework_id: \\'rice-scoring\\', input_weights: { reach: 1, impact: 2, confidence: 1, effort: 1.5 }, }', notes: 'A weight belongs to the RUN, not to any entity it scores: one weight per input, shared by every scored entity, which is why it sits here and not on the `framework_exercise_includes_node` edge alongside the per-entity result. Named `input_weights` rather than a bare `weight` deliberately, and the collision is live rather than hypothetical: `getPropertyDefaultScale` keys on property NAME alone and ignores entity type, and `PROPERTY_SCALE_MAP` already maps `weight` to the `importance_5` ordinal. A bare `weight` here would silently resolve to a 1-5 assessment scale, which is the wrong type, range and meaning for a multiplier. The plural also matches the spec\\'s own vocabulary: a framework declares *inputs*, not dimensions.' },\n  },\n  // FunnelProperties: Funnel entity.\n  funnel: {\n    funnel_type: { type: 'string', enum: ['acquisition', 'activation', 'retention', 'revenue', 'referral', 'custom'], description: 'Which stage of the customer lifecycle this funnel measures' },\n    step_count: { type: 'number', description: 'Number of steps in the funnel', modifier: 'derived' },\n    overall_conversion_rate: { type: 'number', description: 'End-to-end conversion rate through the funnel (0-1)', modifier: 'snapshot' },\n  },\n  // FunnelStepProperties: FunnelStep entity.\n  funnel_step: {\n    step_index: { type: 'number', description: 'Position of this step in the funnel (0-indexed)' },\n    conversion_rate: { type: 'number', description: 'Percentage of users who advance from this step', modifier: 'snapshot' },\n    drop_off_rate: { type: 'number', description: 'Percentage of users who leave at this step', modifier: 'snapshot' },\n  },\n  // GlossaryTermProperties: GlossaryTerm entity.\n  glossary_term: {\n    term_definition: { type: 'string', description: 'Plain-language definition of the term' },\n    synonyms: { type: 'string[]', description: 'Alternative names or abbreviations for this term' },\n    owner: { type: 'string', description: 'Person or team accountable for keeping the definition current. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // GrowthCampaignProperties: GrowthCampaign entity.\n  growth_campaign: {\n    campaign_type: { type: 'string', enum: ['paid_acquisition', 'content', 'referral', 'partnership', 'event', 'viral', 'lifecycle', 'other'], description: 'Strategic shape. Drives channel mix, budget pattern, and measurement style.' },\n    start_date: { type: 'string', description: 'ISO start date' },\n    end_date: { type: 'string', description: 'ISO end date' },\n    budget_amount: { type: 'number', description: 'Total allocated budget. Use with `budget_currency`.' },\n    budget_currency: { type: 'string', description: 'ISO 4217 currency code (e.g. \"USD\", \"EUR\", \"GBP\")' },\n    primary_kpi: { type: 'string', description: 'Primary KPI optimised for (e.g. \"qualified_signups\", \"MQL_volume\", \"activated_teams\")' },\n    kpi_target: { type: 'number', description: 'Numeric target for `primary_kpi` over the campaign window' },\n    utm_parameters: { type: 'string', description: 'UTM tracking parameters for this campaign' },\n    hypothesis: { type: 'string', description: 'Hypothesis or rationale this campaign is testing (free-form, complements `experiment_plan` linkage)' },\n  },\n  // GrowthLoopProperties: GrowthLoop entity.\n  growth_loop: {\n    loop_type: { type: 'string', enum: ['viral', 'content', 'paid', 'product', 'network_effect'], description: 'Mechanism that drives the loop' },\n    trigger: { type: 'string', description: 'Event that initiates the loop cycle' },\n    action: { type: 'string', description: 'Action the user takes within the loop' },\n    reward: { type: 'string', description: 'Outcome that reinforces the next cycle' },\n  },\n  // GtmStrategyProperties: GtmStrategy entity.\n  gtm_strategy: {\n    primary_motion: { type: 'string', enum: ['product_led', 'sales_led', 'channel'], description: 'Primary go-to-market motion' },\n    launch_date: { type: 'string', description: 'Planned launch date (ISO format)' },\n  },\n  // HallucinationReportProperties: Hallucination report.\n  hallucination_report: {\n    report_type: { type: 'string', enum: ['factual', 'logical', 'fabrication', 'inconsistency'], description: 'Classification' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Impact severity (1 = trivial, 5 = dangerous misinformation)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    user_facing: { type: 'boolean', description: 'Visible to end users' },\n    remediation: { type: 'string', description: 'Remediation steps' },\n  },\n  // HelpVideoProperties: Help video.\n  help_video: {\n    video_type: { type: 'string', enum: ['how_to', 'overview', 'troubleshooting', 'best_practice'], description: 'Purpose of the video' },\n    duration_seconds: { type: 'number', description: 'Duration of the video in seconds' },\n    views: { type: 'number', description: 'Total number of views' },\n    url: { type: 'string', description: 'URL where the video is hosted', modifier: 'volatile' },\n  },\n  // HypothesisProperties: A testable belief. The canonical design artefact for validating product assumptions.\n  hypothesis: {\n    we_believe: { type: 'string', description: 'The belief being tested. The \"if\" clause.' },\n    will_result_in: { type: 'string', description: 'The expected result. The \"then\" clause.' },\n    we_know_when: { type: 'string', description: 'The measurable signal that confirms or refutes the claim.' },\n    risk_if_wrong: { type: 'string', description: 'Risk surface for prioritisation if the claim turns out wrong.' },\n    current_confidence: {\n      type: 'assessment', scale_id: 'confidence_5', 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.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // HypothesisEvidenceProperties\n  hypothesis_evidence: {\n    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.' },\n    direction: { type: 'string', enum: ['supports', 'refutes', 'neutral'], description: 'Direction relative to the parent claim: `supports` and `refutes` pair with the edges of the same name, `neutral` means the data is insufficient or noisy. BREAKING in v0.4.0: `confirms`, `disconfirms` and `inconclusive` no longer type-check. Migration is one-to-one: confirms to supports, disconfirms to refutes, inconclusive to neutral.', notes: 'Aligned to `Evidence.direction` so every direction-of-evidence property in the spec shares one vocabulary.' },\n    weight: {\n      type: 'assessment', scale_id: 'importance_5', description: 'Strength of the evidence (UPGAssessment, scale `scale_5`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    summary: { type: 'string', description: 'Plain-English summary of what the evidence shows.' },\n    observed_at: { type: 'string', description: 'ISO date observed.' },\n  },\n  // IdealCustomerProfileProperties: IdealCustomerProfile entity.\n  ideal_customer_profile: {\n    company_size: { type: 'string', enum: ['1-10', '11-50', '51-200', '201-1000', '1001-5000', '5000+', 'other'], description: 'Target company size. Standard B2B segmentation buckets so ICPs across products are comparable.' },\n    industry: { type: 'string', description: 'Target industry vertical' },\n    budget_range: { type: 'string', description: 'Expected budget range for the solution' },\n    trigger_events: { type: 'string[]', description: 'Events that signal buying readiness' },\n    tools_used: { type: 'string[]', description: 'Technologies the ideal customer already uses' },\n  },\n  // IncidentProperties: Incident.\n  incident: {\n    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' },\n    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' },\n    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.' },\n    started_at: { type: 'string', description: 'ISO timestamp the incident started or was first detected.' },\n    acknowledged_at: { type: 'string', description: 'ISO timestamp first acknowledged by a responder. Used to compute time-to-acknowledge.' },\n    contained_at: { type: 'string', description: 'ISO timestamp contained. Blast radius limited, bleeding stopped. Containment precedes full resolution, especially for security incidents.' },\n    resolved_at: { type: 'string', description: 'ISO timestamp fully resolved.' },\n    impact_summary: { type: 'string', description: 'Customer or service impact. @example \"Users unable to log in\", \"Payment processing delayed by 30+ seconds for 15% of users\"' },\n  },\n  // InfrastructureComponentProperties: Infrastructure component.\n  infrastructure_component: {\n    component_type: { type: 'string', enum: ['compute', 'storage', 'network', 'database', 'cdn', 'queue', 'other'], description: 'Resource category. `compute` = VMs or containers. `storage` = object/block/file. `network` = VPC, load balancer, DNS. `database` = managed DB services. `cdn` = content delivery. `queue` = message broker or event bus. @example \"database\" for a managed PostgreSQL instance' },\n    provider: { type: 'string', description: 'Cloud or infrastructure provider. @example \"AWS\", \"Vercel\", \"Cloudflare\", \"Supabase\", \"Fly.io\"' },\n    region: { type: 'string', description: 'Geographic deployment region. @example \"us-east-1\", \"eu-west-1\", \"global\" (CDN or multi-region)' },\n    cost_monthly: { type: 'number', description: 'Monthly cost in base currency (USD). @example 250.00' },\n    environment: { type: 'string', enum: ['production', 'staging', 'development', 'shared'], description: 'Environment. `production` = live traffic. `staging` = pre-release. `development` = developer sandbox. `shared` = cross-environment services (e.g. logging).' },\n    component_status: { type: 'string', enum: ['healthy', 'degraded', 'down', 'maintenance'], description: 'Operational status. `healthy` = normal. `degraded` = partial impairment. `down` = unavailable. `maintenance` = intentionally offline.' },\n  },\n  // InitiativeProperties: Initiative entity.\n  initiative: {\n    start_date: { type: 'string', description: 'ISO start date. @example \"2026-04-01\"' },\n    end_date: { type: 'string', description: 'ISO end date. @example \"2026-09-30\"' },\n    budget: { type: 'number', description: 'Budget allocated (base currency units)' },\n    owner: { type: 'string', description: 'Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // InsightProperties: Unified insight, synthesised from evidence and observations.\n  insight: {\n    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.' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence (UPGAssessment on `confidence_5`). Reflects the strength and diversity of supporting evidence.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    evidence_count: { type: 'number', description: 'Supporting observations, quotes, or evidence items. Higher counts increase confidence.', modifier: 'derived' },\n    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.' },\n    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.' },\n    source_method: { type: 'string', description: 'Producing research method. @example \"usability_study\", \"interview_series\", \"survey\"' },\n    source_domain: { type: 'string', description: 'Which discipline the insight came out of. The second provenance axis, symmetrical with `source_method`: that one is HOW the insight was produced, this one is WHICH PRACTICE produced it, and neither substitutes for the other. @example \"ux\", \"support\", \"sales\", \"data_science\"', notes: 'Declared in v0.26.0 so the retired `ux_insight` type\\'s migration default (`source_domain: \\'ux\\'`) lands in a typed field rather than being lost.' },\n    statement: { type: 'string', description: 'Insight statement in plain language. Write as an active, present-tense assertion. @example \"Users consistently skip the tutorial because they trust their ability to explore independently.\"' },\n    implications: { type: 'string', description: 'Product implications. The so-what.' },\n  },\n  // IntegrationPartnerProperties: Integration partner.\n  integration_partner: {\n    integration_type: { type: 'string', enum: ['native', 'webhook', 'api', 'embedded'], description: 'How the integration is implemented' },\n  },\n  // IntegrationPatternProperties: Integration pattern between systems.\n  integration_pattern: {\n    pattern_type: { type: 'string', enum: ['api', 'event', 'file', 'database', 'webhook', 'adapter', 'client_library', 'host_embedding', 'pipes_and_filters', 'data_sync'], description: 'Type. `adapter`, `client_library`, `host_embedding`, `pipes_and_filters`, `data_sync` added in 0.9.12.' },\n    protocol: { type: 'string', description: 'Communication protocol' },\n  },\n  // InteractionSpecProperties: Interaction specification.\n  interaction_spec: {\n    trigger: { type: 'string', description: 'Triggering event' },\n    animation_type: { type: 'string', description: 'Animation or transition kind' },\n    duration_ms: { type: 'number', description: 'Duration in ms' },\n    easing: { type: 'string', description: 'Easing (e.g. \"ease-in-out\", \"spring\")' },\n  },\n  // InternalDocProperties: Internal document.\n  internal_doc: {\n    doc_type: { type: 'string', enum: ['rfc', 'runbook', 'guide', 'spec', 'onboarding', 'other'], description: 'Classification of the document. @deprecated use `document.document_type`' },\n    url: { type: 'string', description: 'URL or path to the document. @deprecated use `document.source_url`' },\n  },\n  // InterviewGuideProperties: Interview guide document.\n  interview_guide: {\n    guide_type: { type: 'string', enum: ['structured', 'semi_structured', 'unstructured'], description: 'Format structure' },\n    question_count: { type: 'number', description: 'Total questions', modifier: 'derived' },\n    duration_minutes: { type: 'number', description: 'Expected length (minutes)' },\n  },\n  // InvestigationProperties: Active thread of inquiry: debugging, architecture exploration, RCA.\n  investigation: {\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', 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 → 2`, `medium → 3`, `high → 4`, `critical → 5`.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    hypothesis: { type: 'string', description: 'Working hypothesis about the root cause' },\n    findings: { type: 'string', description: 'Findings discovered so far' },\n    started_at: { type: 'string', description: 'ISO timestamp the investigation began' },\n    resolved_at: { type: 'string', description: 'ISO timestamp the investigation was concluded. Pairs with `status === \\'resolved\\' | \\'abandoned\\'`.' },\n    lead_investigator: { type: 'string', description: 'Lead investigator (email or handle). Distinct from the team owning the affected service. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    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*.' },\n  },\n  // InvoiceProperties: Invoice.\n  invoice: {\n    invoice_status: { type: 'string', enum: ['draft', 'sent', 'paid', 'overdue', 'voided'], description: 'Current payment status of the invoice' },\n    amount: { type: 'number', description: 'Total amount billed' },\n    due_date: { type: 'string', description: 'Payment due date (ISO format)' },\n    currency: { type: 'string', description: 'Currency code (e.g. \"USD\", \"EUR\")' },\n  },\n  // IpAssetProperties: Intellectual property asset.\n  ip_asset: {\n    asset_type: { type: 'string', enum: ['patent', 'trademark', 'copyright', 'trade_secret', 'design', 'domain_name'], description: 'Category of intellectual property' },\n    jurisdiction: { type: 'string', description: 'Jurisdiction where the IP is protected' },\n    filing_date: { type: 'string', description: 'Date the application was filed (ISO format)' },\n    registration_number: { type: 'string', description: 'Official registration or patent number' },\n    expiry_date: { type: 'string', description: 'Date the protection expires (ISO format)' },\n    priority_date: { type: 'string', description: 'Priority date for patent claims (ISO format)' },\n  },\n  // JobProperties: Job-to-be-Done: the underlying goal a user is trying to accomplish.\n  job: {\n    statement: { type: 'string', description: 'Job statement: \"When I... I want to... So I can...\"' },\n    job_type: { type: 'string', enum: ['functional', 'emotional', 'social', 'supporting'], description: 'Classification by motivation dimension' },\n    importance: {\n      type: 'assessment', scale_id: 'importance_5', description: 'Importance to the user (1 = low, 5 = critical)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    current_satisfaction: {\n      type: 'assessment', scale_id: 'satisfaction_5', description: 'Current satisfaction with how this job gets done (1 = very unsatisfied, 5 = fully satisfied)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    supporting_role: { type: 'string', enum: ['buyer_of_value', 'co_creator_of_value', 'transferrer_of_value'], description: 'Persona role in the value exchange' },\n  },\n  // JobStepProperties: JobStep entity.\n  job_step: {\n    step_order: { type: 'number', description: 'Order of this step within the parent job' },\n    step_type: { type: 'string', enum: ['core', 'supporting', 'emotional'], description: 'Classification of the step' },\n    tools_used: { type: 'string', description: 'Tools or products currently used for this step' },\n  },\n  // JourneyActionProperties: Discrete action at a journey step, classified by service layer.\n  journey_action: {\n    action_order: { type: 'number', description: 'Display order of this action within its step (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_step.step_order` (UPG-663). Orders the service-blueprint rows within a single moment.' },\n    layer: { type: 'string', enum: ['user', 'frontstage', 'backstage', 'support'], description: 'Service layer' },\n    action_description: { type: 'string', description: 'Plain-language description. Primary content of the action.' },\n    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.' },\n    pain_score: {\n      type: 'assessment', scale_id: 'pain_5', description: 'Pain (1 = effortless, 5 = very painful). Drives opportunity discovery.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    opportunity_score: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Opportunity (1 = low leverage, 5 = high leverage). Pairs with `pain_score` to rank investment.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    evidence: { type: 'string', description: 'Physical or digital evidence visible at this point' },\n    system: { type: 'string', description: 'Performing system or service' },\n    notes: { type: 'string', description: 'Free-text notes, observations, or follow-up questions' },\n  },\n  // JourneyPhaseProperties: Phase within a user journey. A temporal BAND over the journey's step\n  journey_phase: {\n    phase_order: { type: 'number', description: 'Display order within the journey (0-indexed)' },\n    label: { type: 'string', description: 'Short human-readable name. @example \"Discovery\", \"Onboarding\", \"Activation\"' },\n    goal: { type: 'string', description: 'What the user is trying to accomplish' },\n    emotion_arc: { type: 'string', enum: ['rising', 'steady', 'falling', 'mixed'], description: 'Directional shape of user emotion. Spots design opportunities at dips and payoff points at peaks.' },\n    entry_trigger: { type: 'string', description: 'Event or signal marking entry into this phase' },\n    exit_trigger: { type: 'string', description: 'Event or signal marking exit. Pairs with the next phase\\'s `entry_trigger`.' },\n    key_questions: { type: 'string[]', description: 'Open questions the user asks themselves. Fuel for design and content priorities.' },\n    timeframe: { type: 'string', description: 'Typical time window. @example \"first 30 seconds\", \"days 1–7\", \"onboarding week\"' },\n  },\n  // JourneyStepProperties: Single step within a user journey. A user-moment on the journey's single\n  journey_step: {\n    step_order: { type: 'number', description: 'Display order within the journey\\'s step timeline (0-indexed). The scalar ordering convention shared with `journey_phase.phase_order` and `journey_action.action_order` (UPG-663). For branching journeys, the explicit `journey_step_precedes_journey_step` edge captures the chain.' },\n    channel: { type: 'string', description: 'Channel (e.g. \"web\", \"email\", \"in-store\")' },\n    emotion_score: {\n      type: 'assessment', scale_id: 'satisfaction_5', description: 'User emotion (1 = very negative, 5 = very positive)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    friction_score: {\n      type: 'assessment', scale_id: 'pain_5', description: 'Friction (1 = effortless, 5 = very painful)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    thought: { type: 'string', description: 'What the user is thinking' },\n    owner: { type: 'string', description: 'Responsible owner. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // KeyActivityProperties: KeyActivity.\n  key_activity: {\n    activity_type: { type: 'string', enum: ['production', 'problem_solving', 'platform', 'network'], description: 'Activity nature' },\n    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\" → \"constant\") use `frequency_rating`.' },\n    frequency_count: { type: 'number', description: 'Exact count of runs in the period. Pairs with `frequency_period`.', modifier: 'snapshot' },\n    frequency_period: { type: 'string', description: 'Recurrence period (ISO-8601 `Duration`, e.g. `\\'P7D\\'`)' },\n    frequency_rating: { type: 'string', enum: ['constant', 'regular', 'occasional', 'rare', 'other'], description: 'Qualitative tier. Use when an exact rate is unknown.' },\n    operational_owner: { type: 'string', description: 'Operationally accountable team or individual. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    capacity_constraint: { type: 'string', description: 'Bottleneck or scaling constraint' },\n    automation_level: { type: 'string', enum: ['manual', 'assisted', 'automated'], description: 'How much runs without human intervention' },\n  },\n  // KeyResourceProperties: KeyResource.\n  key_resource: {\n    resource_type: { type: 'string', enum: ['physical', 'intellectual', 'human', 'financial'], description: 'Category' },\n    criticality: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Criticality to the business model' },\n    owner: { type: 'string', description: 'Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    scarcity_risk: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Replacement difficulty',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    substitutability: { type: 'string', enum: ['high', 'medium', 'low'], description: 'Substitutability if lost' },\n  },\n  // KeyResultProperties: A measurable result under an objective. The KR in OKR.\n  key_result: {\n    current_value: { type: 'number', description: 'Most recent observed value', modifier: 'snapshot' },\n    target_value: { type: 'number', description: 'Value for full achievement' },\n    unit: { type: 'string', description: 'Display unit (e.g. \"%\", \"users\", \"£\")' },\n  },\n  // KnowledgeBaseArticleProperties: Knowledge base article.\n  knowledge_base_article: {\n    audience: { type: 'string', enum: ['customer', 'internal', 'developer', 'admin'], description: 'Who this article is intended for' },\n    url: { type: 'string', description: 'URL of the published article' },\n  },\n  // LaunchProperties: Launch entity.\n  launch: {\n    launch_type: { type: 'string', enum: ['soft', 'beta', 'public', 'feature'], description: 'Scale and audience of the launch' },\n    target_date: { type: 'string', description: 'Planned launch date (ISO format)' },\n  },\n  // LeadProperties: Lead.\n  lead: {\n    lead_source: { type: 'string', description: 'How this lead was acquired (e.g. \"website\", \"referral\", \"event\")' },\n    lead_score: { type: 'number', description: 'Numeric scoring of lead quality' },\n    lead_status: { type: 'string', enum: ['new', 'contacted', 'nurturing', 'converted', 'disqualified'], description: 'Current progression status of the lead' },\n    qualification_status: { type: 'string', enum: ['marketing_qualified', 'sales_qualified', 'product_qualified', 'unqualified'], description: 'Marketing or sales qualification level' },\n  },\n  // LearningProperties: Result of an experiment. Evidence that updates a hypothesis.\n  learning: {\n    result: { type: 'string', description: 'Summary' },\n    result_value: { type: 'number', description: 'Measured value of the result' },\n    result_unit: { type: 'string', description: 'Unit (e.g. \"%\" or \"ms\")' },\n    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 → supports`, `negative → refutes`, `neutral → neutral`.' },\n    confidence_impact: { type: 'string', enum: ['strengthens', 'weakens', 'neutral'], description: 'Confidence impact on the parent hypothesis' },\n  },\n  // LearningPathProperties: Learning path.\n  learning_path: {\n    path_order: { type: 'number', description: 'Display order of this path within a curriculum or program (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Makes a learning_path a deterministically orderable sequence among sibling paths rather than a star.' },\n    path_difficulty: { type: 'string', enum: ['beginner', 'intermediate', 'advanced'], description: 'Overall difficulty level of the learning path' },\n    item_count: { type: 'number', description: 'Number of items (tutorials, videos, etc.) in the path', modifier: 'derived' },\n    estimated_hours: { type: 'number', description: 'Estimated total hours to complete the path' },\n    completion_rate: { type: 'number', description: 'Percentage of users who complete the full path', modifier: 'snapshot' },\n  },\n  // LegalEntityProperties: Legal entity.\n  legal_entity: {\n    entity_type: { type: 'string', enum: ['corporation', 'llc', 'partnership', 'sole_proprietor', 'nonprofit'], description: 'Legal structure of the entity' },\n    jurisdiction: { type: 'string', description: 'Jurisdiction where the entity is registered' },\n    ip_ownership: { type: 'string', description: 'Description of intellectual property ownership' },\n    date_incorporated: { type: 'string', description: 'Date the entity was incorporated (ISO format)' },\n  },\n  // LibraryDependencyProperties: Library or package dependency.\n  library_dependency: {\n    dep_version: { type: 'string', description: 'Installed version' },\n    dep_type: { type: 'string', enum: ['runtime', 'dev', 'peer', 'optional'], description: 'Dependency classification' },\n    license: { type: 'string', description: 'SPDX license identifier' },\n    is_outdated: { type: 'boolean', description: 'Whether a newer version is available' },\n    vulnerability_count: { type: 'number', description: 'Known vulnerabilities in the installed version. Populated from npm audit, Snyk, etc.', modifier: 'snapshot' },\n  },\n  // LocaleProperties: Locale.\n  locale: {\n    language_code: { type: 'string', description: 'ISO 639-1 language code (e.g. \"en\", \"de\", \"ja\")' },\n    region_code: { type: 'string', description: 'ISO 3166-1 region code (e.g. \"US\", \"GB\", \"DE\")' },\n    is_default: { type: 'boolean', description: 'Whether this is the default/fallback locale' },\n    translation_coverage: { type: 'number', description: 'Percentage of strings translated (0-100)' },\n  },\n  // LocaleConfigProperties: Locale configuration.\n  locale_config: {\n    date_format: { type: 'string', description: 'Date formatting pattern (e.g. \"MM/DD/YYYY\", \"DD.MM.YYYY\")' },\n    number_format: { type: 'string', description: 'Number formatting convention (e.g. \"1,000.00\", \"1.000,00\")' },\n    currency: { type: 'string', description: 'Default currency code for this locale' },\n    text_direction: { type: 'string', enum: ['ltr', 'rtl'], description: 'Text direction for the locale\\'s script' },\n    timezone: { type: 'string', description: 'Default timezone (e.g. \"Europe/Berlin\", \"America/New_York\")' },\n  },\n  // MarketSegmentProperties: MarketSegment entity.\n  market_segment: {\n    segment_size: { type: 'number', description: 'Potential customers in this segment' },\n    growth_rate: { type: 'number', description: 'YoY growth rate as a decimal. @example 0.15 represents 15%', modifier: 'snapshot' },\n    tam: { type: 'number', description: 'Total Addressable Market (currency units)' },\n    sam: { type: 'number', description: 'Serviceable Addressable Market (currency units)' },\n  },\n  // MarketTrendProperties: Market trend.\n  market_trend: {\n    relevance: {\n      type: 'assessment', scale_id: 'importance_5', description: 'Relevance to our product (1 = low, 5 = critical).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    timeframe: { type: 'string', description: 'Expected peak or mainstream window. @example \"12-18 months\", \"2027\"' },\n    impact: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Expected impact on our market or category.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    source: { type: 'string', description: 'Source of the trend data: analyst report, research firm, observed behaviour. @example \"Gartner Hype Cycle 2025\", \"Observed in user interviews Q1 2026\"' },\n    last_updated: { type: 'string', description: 'Provenance: ISO date-time this record was last observed or refreshed. Lets a stale record be told apart from a fresh one. @example \"2026-06-13\"' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Provenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    observed_by: { type: 'string', description: 'Provenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example \"competitor-watch-agent\"' },\n  },\n  // MarketingCampaignPlanProperties: Marketing campaign plan.\n  marketing_campaign_plan: {\n    brief: { type: 'string', description: 'Campaign brief summarising objectives and approach' },\n    budget: { type: 'number', description: 'Allocated budget for this campaign' },\n    start_date: { type: 'string', description: 'Campaign start date (ISO format)' },\n    end_date: { type: 'string', description: 'Campaign end date (ISO format)' },\n    target_segment: { type: 'string', description: 'Audience segment the campaign targets' },\n  },\n  // MarketingChannelProperties: Marketing channel.\n  marketing_channel: {\n    channel_type: { type: 'string', enum: ['social', 'email', 'seo', 'sem', 'content', 'events', 'other'], description: 'Category of marketing channel' },\n    monthly_budget: { type: 'number', description: 'Monthly spend allocated to this channel', modifier: 'snapshot' },\n    roi: { type: 'number', description: 'Return on investment ratio' },\n  },\n  // MarketingStrategyProperties: Marketing strategy.\n  marketing_strategy: {\n    approach: { type: 'string', enum: ['inbound', 'outbound', 'product_led', 'community', 'hybrid'], description: 'Overall marketing approach' },\n    annual_budget: { type: 'number', description: 'Total annual marketing budget' },\n    objective: { type: 'string', description: 'Primary objective for the marketing strategy' },\n  },\n  // MarketplaceListingProperties: Marketplace listing.\n  marketplace_listing: {\n    listing_type: { type: 'string', enum: ['app', 'integration', 'template', 'plugin'], description: 'Category of the marketplace listing' },\n    installs: { type: 'number', description: 'Number of installations' },\n    rating: { type: 'number', description: 'Average user rating (e.g. 1-5 stars)' },\n  },\n  // MessagingProperties: Messaging entity. Each instance is a channel/stage variant.\n  messaging: {\n    channel: { type: 'string', enum: ['landing_page', 'email', 'social', 'ad', 'pitch', 'press', 'in_product', 'enablement', 'other'], description: 'Channel this messaging variant is crafted for. `enablement` is the internal field-ops channel (SE/PMM/SA enablement one-pagers, battlecards\\' narrative), distinct from `pitch` (external, customer-facing).' },\n    funnel_stage: { type: 'string', enum: ['awareness', 'consideration', 'conversion', 'retention'], description: 'Marketing funnel stage this variant targets' },\n    headline: { type: 'string', description: 'Primary headline or hook' },\n    body: { type: 'string', description: 'Full message body copy' },\n    call_to_action: { type: 'string', description: 'Call-to-action text' },\n    tone: { type: 'string', description: 'Voice and tone for this variant (e.g. \"conversational\", \"authoritative\", \"playful\")' },\n  },\n  // MetricProperties: Unified metric. Measures progress, health, or behaviour across the product.\n  metric: {\n    designation: { type: 'string', enum: ['north_star', 'kpi', 'driver', 'input', 'guardrail', 'proxy', 'health', 'vanity', 'metric'], description: 'Role this metric plays in the measurement system' },\n    action: { type: 'string', description: 'The action or behaviour this metric measures (e.g. \"users who activated within 7 days\")' },\n    unit_of_analysis: { type: 'string', description: 'The unit being counted or measured (e.g. \"users\", \"sessions\", \"£\")' },\n    statistical_function: { type: 'string', enum: ['average', 'total', 'count', 'median', 'rate', 'ratio', 'percentage', 'score', 'min', 'max', 'p95', 'p99', 'growth_rate', 'conversion_rate', 'retention_rate', 'churn_rate', 'custom'], description: 'Aggregation function applied to raw data' },\n    formula: { type: 'string', description: 'Calculation formula or expression' },\n    impact_level: { type: 'string', enum: ['impact', 'outcome', 'output'], description: 'Where this metric sits in the impact hierarchy' },\n    indicator_direction: { type: 'string', enum: ['leading', 'lagging'], description: 'Whether this metric leads or lags the behaviour it measures' },\n    metric_category: { type: 'string', enum: ['acquisition', 'activation', 'retention', 'referral', 'revenue', 'engagement', 'happiness', 'task_success', 'adoption', 'other'], description: 'AARRR or HEART category this metric belongs to' },\n    current_value: { type: 'number', description: 'Most recent observed value', modifier: 'snapshot' },\n    target_value: { type: 'number', description: 'Value we are aiming to reach' },\n    unit: { type: 'string', description: 'Display unit for the metric value (e.g. \"%\", \"ms\", \"£\")' },\n    range_min: { type: 'number', description: 'Minimum expected or baseline value' },\n    range_max: { type: 'number', description: 'Maximum expected or ceiling value' },\n    cadence: { type: 'string', enum: ['continuous', 'hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'yearly', 'on_demand', 'other'], description: 'Measurement cadence. Canonical `Cadence` since v0.4.0. `\\'realtime\\'` migrates to `\\'continuous\\'`; all other values 1:1.' },\n    owner: { type: 'string', description: 'Person or team responsible for tracking this metric. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    metric_health: { type: 'string', enum: ['healthy', 'at_risk', 'unhealthy', 'unknown'], description: 'Universal health rollup, applying to every metric regardless of `designation`: `healthy` is inside range, `at_risk` is drifting toward a breach or shortfall, `unhealthy` has missed or breached, `unknown` has no current reading.', notes: 'Orthogonal to lifecycle and to `guardrail_status`. For guardrails specifically, `guardrail_status` remains the breach-specific signal (`safe` / `warning` / `breached`), so a guardrail carries both: one says how it is trending, the other says whether it has been crossed.' },\n    guardrail_threshold_min: { type: 'number', description: 'Lower bound for guardrail safety (below this = breach)' },\n    guardrail_threshold_max: { type: 'number', description: 'Upper bound for guardrail safety (above this = breach)' },\n    guardrail_status: { type: 'string', enum: ['safe', 'warning', 'breached'], description: 'Current guardrail health state' },\n  },\n  // MetricQualityAssessmentProperties: A point-in-time review of a metric's quality and fitness for purpose.\n  metric_quality_assessment: {\n    assessed_at: { type: 'string', description: 'ISO 8601 timestamp of when this assessment was made' },\n    assessor: { type: 'string', description: 'Free-text assessor label (person, team, or role)' },\n    quality_correlated: { type: 'boolean', description: 'Quality signal: metric correlates with outcomes we care about' },\n    quality_actionable: { type: 'boolean', description: 'Quality signal: team can take action based on this metric' },\n    quality_sensitive: { type: 'boolean', description: 'Quality signal: metric changes when behaviour changes' },\n    quality_comparative: { type: 'boolean', description: 'Quality signal: metric can be compared across cohorts or time' },\n    quality_related: { type: 'boolean', description: 'Quality signal: metric relates to other key metrics in the system' },\n    quality_score: { type: 'number', description: 'Computed quality score across all quality signals (0–5)' },\n    proxy_reason: { type: 'string', enum: ['qualitative', 'no_direct_measure', 'not_yet_instrumented', 'too_expensive'], description: 'Why this metric is used as a proxy instead of measuring directly' },\n    proxy_confidence: { type: 'string', enum: ['strong', 'moderate', 'weak'], description: 'How strongly this metric predicts the direct measure' },\n  },\n  // MilestoneProperties: Milestone.\n  milestone: {\n    milestone_order: { type: 'number', description: 'Display order of this milestone within its parent (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Orders the delivery milestones a parent moves through, independent of `due_date`.', notes: 'The parent is whichever of the two milestone parents the graph actually uses: a `project` via `project_targets_milestone`, or a `product` directly via `product_targets_milestone` (Portfolio Phase 2, for milestones a product owns outright with no program or project above them). The order is scoped to that one parent, never global.' },\n    due_date: { type: 'string', description: 'Target due date (ISO format)' },\n    met_on_time: { type: 'boolean', description: 'Whether the milestone was met on time' },\n  },\n  // MissionProperties: Mission entity.\n  mission: {\n    target_audience: { type: 'string', description: 'Who the mission serves' },\n    core_value: { type: 'string', description: 'Core value proposition' },\n    differentiation: { type: 'string', description: 'Differentiation from alternatives' },\n  },\n  // ModelComparisonProperties: Model comparison.\n  model_comparison: {\n    comparison_criteria: { type: 'string[]', description: 'Comparison dimensions (e.g. \"accuracy\", \"cost\", \"latency\")' },\n    comparison_date: { type: 'string', description: 'ISO conduct date' },\n  },\n  // MonitorProperties: Monitor.\n  monitor: {\n    monitor_type: { type: 'string', enum: ['uptime', 'latency', 'error_rate', 'throughput', 'log', 'event', 'synthetic', 'slo_burn', 'custom'], description: 'Measurement kind. `uptime` = availability. `latency` = response time. `error_rate` = failure ratio. `throughput` = req/sec. `log` = log-based. `event` = event-driven. `synthetic` = scripted user-journey tests. `slo_burn` = tracks SLO error budget. @example \"synthetic\" for a scripted checkout flow test' },\n    target: { type: 'string', description: 'Service, endpoint, or resource monitored. @example \"graph-api /health\", \"PostgreSQL connection pool\", \"CDN edge latency\"' },\n    threshold: { type: 'string', description: 'Alert condition, expressed as a condition rather than a bare number. @example \"> 500ms p99\", \"< 99.9% uptime over 5 minutes\", \"> 1% error rate\"' },\n    alert_channel: { type: 'string', description: 'Alert destination on threshold breach. @example \"slack:#ops-alerts\", \"pagerduty:on-call-graph\"' },\n    monitor_status: { type: 'string', enum: ['ok', 'warn', 'alert', 'no_data', 'muted'], description: 'Operational state. `ok` = all clear. `warn` = approaching threshold. `alert` = threshold breached. `no_data` = nothing received (may indicate monitor or service failure). `muted` = silenced.' },\n    muted: { type: 'boolean', description: 'Currently silenced. Typical during planned maintenance windows.' },\n  },\n  // NeedProperties: Unified need. Replaces pain_point + user_need. Framework labels provide context-specific display names.\n  need: {\n    statement: { type: 'string', description: 'The need expressed as a clear, user-facing statement' },\n    valence: { type: 'string', enum: ['pain', 'gap', 'constraint'], description: 'What kind of experience: pain (friction), gap (unmet), constraint (limitation)' },\n    maturity: { type: 'string', enum: ['raw', 'validated', 'prioritized'], description: 'How mature is this need in our understanding' },\n    frequency: {\n      type: 'assessment', scale_id: 'frequency_5', description: 'How often the user encounters this need (1 = rarely, 5 = constantly)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'How painful or disruptive the need is when unaddressed (1 = minor, 5 = critical)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    importance: {\n      type: 'assessment', scale_id: 'importance_5', description: 'How important resolving this need is to the user (1 = low, 5 = critical)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    motivation: { type: 'string', enum: ['functional', 'emotional', 'social'], description: 'Motivation dimension. Inherited from parent job if not set.' },\n  },\n  // NpsCampaignProperties: NPS (Net Promoter Score) measurement campaign.\n  nps_campaign: {\n    campaign_type: { type: 'string', enum: ['relationship', 'transactional', 'feature'], description: 'What triggers the NPS survey' },\n    send_date: { type: 'string', description: 'Date the survey was sent (ISO format)' },\n    response_count: { type: 'number', description: 'Number of responses received', modifier: 'snapshot' },\n    response_rate: { type: 'number', description: 'Percentage of recipients who responded', modifier: 'snapshot' },\n    score: { type: 'number', description: 'Net Promoter Score (-100 to 100)' },\n    promoters_pct: { type: 'number', description: 'Percentage of respondents who are promoters (9-10)', modifier: 'snapshot' },\n    detractors_pct: { type: 'number', description: 'Percentage of respondents who are detractors (0-6)', modifier: 'snapshot' },\n  },\n  // ObjectionProperties: Objection entity.\n  objection: {\n    statement: { type: 'string', description: 'The objection as stated by the source' },\n    source_type: { type: 'string', enum: ['prospect', 'competitor', 'internal', 'market'], description: 'Where this objection originated' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'How frequently or strongly this objection comes up (1-5)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    resolution: { type: 'string', enum: ['open', 'addressed', 'invalidated'], description: 'Whether this objection has been addressed' },\n  },\n  // ObjectiveProperties: A high-level strategic goal. The O in OKR.\n  objective: {\n    timeframe: { type: 'string', description: 'Planning timeframe (e.g. \"Q1 2026\", \"H1 2026\"). @deprecated since 0.33.0, removeIn 1.0.0. Promote the period to a `planning_cycle` node and link it with the `objective_scoped_to_planning_cycle` edge, which has existed since 0.20.0 and points at a shared, dated, nestable interval instead of a drifting per-objective string. Until promoted, the value is a display label and nothing schedules on it. The promotion is documented rather than automated and no `drop_props` migration ships: which cycle a free-text string means, and whether one exists yet, is a judgement, and dropping the string before the cycle exists destroys the only record of the intent. @example \"Q1 2026\", \"H1 2026\"' },\n    progress: { type: 'number', description: 'Overall progress (0–100)' },\n  },\n  // ObservationProperties: Discrete observation captured during research. Absorbed from the deprecated Highlight entity.\n  observation: {\n    content: { type: 'string', description: 'Note or highlight text.' },\n    source_type: { type: 'string', enum: ['quote', 'behavior', 'metric'], description: 'Producing research method.' },\n    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.' },\n    is_highlighted: { type: 'boolean', description: 'Flagged as a highlight. Absorbed from the deprecated Highlight entity.' },\n    highlight_tag: { type: 'string', description: 'Free-form highlight type tag. @example \"pain\", \"delight\", \"behaviour\", \"moment of clarity\"' },\n    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.' },\n    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' },\n  },\n  // OnCallRotationProperties: On-call rotation.\n  on_call_rotation: {\n    schedule: { type: 'string', description: 'Human-readable schedule of who is on call when. @example \"Weekly rotation, Monday 09:00 UTC handoff\", \"Follow-the-sun (US, EU, APAC)\"' },\n    escalation_policy: { type: 'string', description: 'Escalation when the primary doesn\\'t respond. @example \"5 min to respond, then escalate to secondary. 10 min to secondary, then page engineering lead.\"' },\n    rotation_cadence: { type: 'string', enum: ['daily', 'weekly', 'biweekly', 'custom'], description: 'Cycle cadence. `weekly` for standard team rotations. `daily` for high-incident-volume teams.' },\n    handoff_time: { type: 'string', description: 'Shift handoff time. Affects team coordination and sleep. @example \"09:00 UTC\", \"17:00 local\"' },\n  },\n  // OperatingLifecycleProperties: An operating_lifecycle: a canonical, ordered (often cyclic) operating process\n  operating_lifecycle: {\n    cyclic: { type: 'boolean', description: 'True if the process loops (e.g. Analyze → Extend → Plan). The sequence is fully expressed by the stages\\' `stage_order`; `cyclic` adds the wrap from the last stage back to the first.' },\n    source: { type: 'string', description: 'Origin of the canonical model (e.g. \"a published content-ops lifecycle\"). Optional provenance; promote to an edge if it names a real `specification`/`document`.' },\n  },\n  // OperatingStageProperties: An operating_stage: one ordered stage of an `operating_lifecycle`. A product's\n  operating_stage: {\n    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`).' },\n    goal: { type: 'string', description: 'What this stage accomplishes.' },\n    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.' },\n  },\n  // OpportunityProperties: A problem worth solving, grounded in user need and business value.\n  opportunity: {},\n  // OrganizationProperties: Organization entity.\n  organization: {\n    logo_url: { type: 'string', description: 'URL of the organisation\\'s logo', modifier: 'volatile' },\n    industry: { type: 'string', description: 'Industry vertical the organisation operates in' },\n  },\n  // OutcomeProperties: A measurable change in user or business state the product drives.\n  outcome: {\n    timeline: { type: 'string', description: 'Target timeframe (e.g. \"Q2 2026\", \"12 months\")' },\n    owner: { type: 'string', description: 'Accountable person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    success_criteria: { type: 'string', description: 'What \"achieved\" looks like, concretely. Pairs with `measurement_method`. @example \"30-day retention above 40% for new signups\"' },\n    measurement_method: { type: 'string', enum: ['quantitative', 'qualitative', 'mixed'], description: 'Assessment approach. `quantitative` = metrics drive the call. `qualitative` = observation / interviews. `mixed` = both, weighted case-by-case.' },\n    current_state: { type: 'string', description: 'Baseline or latest read' },\n    evidence_summary: { type: 'string', description: 'Evidence gathered so far (quotes, metrics, studies)' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Confidence this is the right outcome to pursue',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n  },\n  // ParticipantProperties: Research participant.\n  participant: {\n    alias: { type: 'string', description: 'Anonymous alias for privacy (e.g. \"P01\")' },\n    recruit_source: { type: 'string', description: 'How the participant was recruited' },\n    consent_status: { type: 'string', enum: ['pending', 'given', 'withdrawn'], description: 'Current consent status for data usage' },\n    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' },\n  },\n  // PartnerProgramProperties: Partner program.\n  partner_program: {\n    program_type: { type: 'string', enum: ['referral', 'reseller', 'technology', 'consulting', 'marketplace'], description: 'Category of the partner program' },\n  },\n  // PartnerRevenueShareProperties: Partner revenue share.\n  partner_revenue_share: {\n    share_model: { type: 'string', enum: ['percentage', 'flat_fee', 'tiered', 'hybrid'], description: 'How revenue is split with the partner' },\n    share_percentage: { type: 'number', description: 'Partner\\'s share as a percentage (0-100)' },\n    annual_revenue: { type: 'number', description: 'Annual revenue generated through this partner' },\n  },\n  // PartnerTierProperties: Partner tier.\n  partner_tier: {\n    tier_order: { type: 'number', description: 'Display order of this tier among sibling partner tiers (1 = first tier shown). Mirrors `pricing_tier.tier_order`; part of the spec-wide `*_order` sequence convention (UPG-663 / UPG-674). Distinct from `tier_level`, which is a prestige rank, not a presentation order.' },\n    tier_level: { type: 'number', description: 'Numeric rank of the tier (higher = more prestigious)' },\n    requirements: { type: 'string[]', description: 'What a partner must achieve to reach this tier' },\n    benefits: { type: 'string[]', description: 'Benefits granted at this tier level' },\n  },\n  // PartnershipProperties: Partnership.\n  partnership: {\n    partner_type: { type: 'string', enum: ['technology', 'distribution', 'content', 'strategic'], description: 'Partnership nature' },\n    value_exchange: { type: 'string', description: 'What each party gives and receives' },\n    partnership_tier: { type: 'string', enum: ['strategic', 'preferred', 'standard', 'trial'], description: 'Commercial significance. Drives attention and exec sponsorship.' },\n    risk_level: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Exposure if the partnership fails (concentration risk, IP risk, etc.)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    owner: { type: 'string', description: 'Internal owner. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    start_date: { type: 'string', description: 'Date the partnership became effective (ISO 8601)' },\n  },\n  // PaywallProperties: Paywall.\n  paywall: {\n    paywall_type: { type: 'string', enum: ['hard', 'soft', 'metered', 'freemium_gate'], description: 'How restrictive the paywall is' },\n    trigger: { type: 'string', description: 'User action or threshold that triggers the paywall' },\n    conversion_rate: { type: 'number', description: 'Percentage of users who convert at this paywall', modifier: 'snapshot' },\n  },\n  // PenetrationTestProperties: Penetration test.\n  penetration_test: {\n    category: { type: 'string', enum: ['external', 'internal', 'web_app', 'api', 'mobile'], description: 'Test type' },\n    scope: { type: 'string', description: 'Systems or features in scope' },\n    findings_count: { type: 'number', description: 'Total findings', modifier: 'derived' },\n    critical_count: { type: 'number', description: 'Critical-severity findings', modifier: 'derived' },\n    start_date: { type: 'string', description: 'ISO start date' },\n    end_date: { type: 'string', description: 'ISO end date' },\n    report_url: { type: 'string', description: 'Full report URL' },\n    methodology: { type: 'string', description: 'Methodology (e.g. \"OWASP\", \"PTES\")' },\n  },\n  // PersonProperties: Person entity. A named, accountable individual.\n  person: {\n    role_title: { type: 'string', description: 'Free-text job title. Distinct from the structured `role` entity.' },\n    time_zone: { type: 'string', description: 'IANA time zone (e.g. \"Europe/Berlin\"). Useful for capacity / on-call planning.' },\n  },\n  // PersonaProperties: User archetype representing a distinct group of users.\n  persona: {\n    context: { type: 'string', description: 'Free-text description of the persona\\'s situation and environment @example \"Leads 12-person team at mid-size B2B SaaS (50-200 employees)\"' },\n    is_primary: { type: 'boolean', description: 'Whether this is the primary/target persona for this product' },\n    experience_level: { type: 'string', enum: ['beginner', 'intermediate', 'advanced', 'varies'], description: 'How experienced this persona is in their domain' },\n    motivation: { type: 'string', description: 'Primary motivation or driving need @example \"Making confident, evidence-based decisions\"' },\n    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`.' },\n    domain_expertise: { type: 'string', description: 'Industry or domain knowledge this persona brings @example \"10+ years SaaS experience\", \"New to healthcare IT\"' },\n    audience_role: { type: 'string', enum: ['buyer', 'user', 'champion', 'influencer', 'partner'], description: 'Role in the buying or adoption decision: who signs (`buyer`), who uses (`user`), who advocates internally (`champion`), who shapes the choice (`influencer`), and who delivers it (`partner`). A closed set, so roles compare across products. @example \"buyer\"', notes: 'A portfolio must separate the economic buyer from the practitioner user: they are distinct personas with distinct jobs, and collapsing them is how a product ends up built for whoever was easiest to interview.' },\n    actor_kind: { type: 'string', enum: ['human', 'agent', 'system'], description: 'Who performs the work: a human archetype, an autonomous AI agent, or a non-agentic platform service. Absent means `human`, so existing personas need no migration. @example \"agent\"', notes: 'An `agent` persona is a first-class actor: it participates in journeys through the same persona machinery, and humans delegate to it via `persona_delegates_to_persona`. Human-coverage and segmentation metrics count `human` only, so agent and system personas are opt-in rather than silently inflating a coverage number.' },\n  },\n  // PipelineSalesProperties: Sales pipeline.\n  pipeline_sales: {\n    pipeline_type: { type: 'string', enum: ['new_business', 'expansion', 'renewal', 'partner', 'other'], description: 'Classification of the pipeline (UPG-579 Option B).' },\n    avg_cycle_days: { type: 'number', description: 'Average days from opportunity creation to close' },\n  },\n  // PipelineStageProperties: Pipeline stage.\n  pipeline_stage: {\n    stage_order: { type: 'number', description: 'Position of this stage in the pipeline sequence' },\n    conversion_rate: { type: 'number', description: 'Percentage of deals that advance from this stage', modifier: 'snapshot' },\n    avg_days_in_stage: { type: 'number', description: 'Average number of days deals spend in this stage' },\n  },\n  // PlanningCycleProperties: Planning cycle: a named, dated interval work flows through, which nests.\n  planning_cycle: {\n    cadence_kind: { type: 'string', enum: ['period', 'iteration', 'buffer'], description: 'Methodology-neutral granularity of this interval. `period` is a coarse container (quarter / PI / OKR-cycle scale); `iteration` is a fine execution box (sprint / cycle); `buffer` is between-box slack (cooldown). Required: it is the discriminator that lets one type stand in for every methodology.' },\n    cadence_label: { type: 'string', description: 'The source methodology term verbatim (\"sprint\", \"cycle\", \"PI\", \"quarter\", \"cooldown\"). The dual-band label: `cadence_kind` is the canonical granularity reasoned over; `cadence_label` preserves what the team actually calls it.' },\n    starts_on: { type: 'string', description: 'ISO date the interval opens. A cycle is concretely dated, unlike a coarse `time_horizon` label.' },\n    ends_on: { type: 'string', description: 'ISO date the interval closes.' },\n    sequence: { type: 'number', description: 'The cycle / iteration number (e.g. Sprint 47, PI 3).' },\n    goal: { type: 'string', description: 'The interval\\'s goal or focus: what this cadence box is for.' },\n    appetite: { type: 'string', description: 'Shape Up appetite: the fixed time budget a cycle is willing to spend on a bet (e.g. \"6 weeks\", \"2 weeks\").' },\n  },\n  // PlaybookProperties: Customer success playbook.\n  playbook: {\n    playbook_type: { type: 'string', enum: ['onboarding', 'expansion', 'renewal', 'rescue', 'other'], description: 'Scenario this playbook addresses' },\n    trigger: { type: 'string', description: 'Condition that activates this playbook' },\n    playbook_steps: { type: 'string[]', description: 'Ordered list of steps to execute' },\n  },\n  // PortfolioProperties: Portfolio entity.\n  portfolio: {\n    hierarchy_model: { type: 'string', enum: ['flat', 'nested', 'matrix'], description: 'How products are structured within the portfolio' },\n    strategy_type: { type: 'string', description: 'High-level strategy archetype' },\n    explore_exploit_target: { type: 'object', description: 'Explore vs exploit investment target (percentages, should sum to 100). @example { explore: 30, exploit: 70 }' },\n  },\n  // PositioningProperties: Positioning entity. Structural facts expressed via edges (P20 hub).\n  positioning: {\n    positioning_statement: { type: 'string', description: 'Full positioning statement, typically in Geoffrey Moore\\'s form: \"For {target audience} who {problem or need}, {product} is the {category} that {unique benefit}. Unlike {competitor or alternative}, we {differentiator}.\" Edges carry the structured atoms; this field preserves the rhetorical whole.' },\n    target_summary: { type: 'string', description: 'One-line audience summary. Shortcut when an edge to the full `ideal_customer_profile` or `persona` isn\\'t yet in place. @example \"Solo product creators drowning in AI-generated artefacts\"' },\n  },\n  // PostmortemProperties: Postmortem.\n  postmortem: {\n    timeline: { type: 'string', description: 'Chronological timeline. Events with timestamps in order. @example \"03:15 Alert fired. 03:20 On-call acknowledged. 03:45 Root cause identified. 06:30 Service restored.\"' },\n    action_items: { type: 'string', description: 'Follow-up actions with owners and due dates. @example \"1. Add circuit breaker to auth service (owner: Platform, due: 2026-04-12). 2. Update runbook for DB failover.\"' },\n    detection_method: { type: 'string', enum: ['monitoring', 'alert', 'customer_report', 'internal_report', 'automated'], description: 'Detection source. Key learning for improving detection coverage. @example \"alert\" if monitoring caught it, \"customer_report\" if a user reported first' },\n  },\n  // PressReleaseProperties: Press release.\n  press_release: {\n    pr_type: { type: 'string', enum: ['product_launch', 'partnership', 'funding', 'milestone', 'other'], description: 'Category of the press release' },\n    publish_date: { type: 'string', description: 'Date the release was or will be published (ISO format)' },\n    outlets: { type: 'string[]', description: 'Media outlets targeted for distribution' },\n  },\n  // PricingStrategyProperties: Pricing strategy.\n  pricing_strategy: {\n    strategy_type: { type: 'string', enum: ['value_based', 'cost_plus', 'competitor_based', 'penetration', 'freemium'], description: 'Pricing methodology used' },\n    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.' },\n    last_change: { type: 'string', description: 'Date of the last pricing change (ISO format)' },\n  },\n  // PricingTierProperties: PricingTier: the central pricing concept (the plan a customer buys).\n  pricing_tier: {\n    price: { type: 'number', description: 'Price per billing period' },\n    billing_period: { type: 'string', enum: ['monthly', 'yearly', 'one_time'], description: 'Billing cadence' },\n    currency: { type: 'string', description: 'ISO 4217 currency (e.g. \"USD\", \"EUR\")' },\n    tier_order: { type: 'number', description: 'Display ordering (1 = first tier shown)' },\n    is_highlighted: { type: 'boolean', description: 'Highlighted as recommended / most popular' },\n  },\n  // PrimitiveProperties: A foundational compositional unit a specification defines: the noun products\n  primitive: {\n    primitive_kind: { type: 'string', enum: ['data_type', 'object', 'block', 'unit'], description: 'The shape of the thing products pass around.' },\n    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.' },\n    since: { type: 'string', description: 'Year or version the primitive was introduced.' },\n  },\n  // PrivacyPolicyProperties: Privacy policy.\n  privacy_policy: {\n    version: { type: 'string', description: 'Version identifier of the policy' },\n    last_updated: { type: 'string', description: 'Date the policy was last updated (ISO format)' },\n    effective_date: { type: 'string', description: 'Date the policy takes effect (ISO format)' },\n    url: { type: 'string', description: 'URL where the policy is published' },\n  },\n  // ProductProperties: The product being created. Root of the graph.\n  product: {\n    stage: { type: 'string', enum: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature', 'maintenance', 'sunset'], description: 'Lifecycle stage' },\n    health_status: { type: 'string', enum: ['on_track', 'at_risk', 'off_track'], description: 'Overall health' },\n    url: { type: 'string', description: 'Where the product lives. Marketing site, app store URL, etc.', modifier: 'volatile' },\n    logo_url: { type: 'string', description: 'Logo or icon URL. Used to render product cards and lists.', modifier: 'volatile' },\n    launched_at: { type: 'string', description: 'When the product became generally available (ISO 8601)' },\n    described_configuration: { type: 'string', description: 'The product configuration this graph describes, named in plain language. A label for readers: nothing reads it to gate, filter, or alter how a tool interprets the graph. @example \"Enterprise plan, split-navigation flag on\"', notes: 'A product\\'s composition often differs by feature flag, plan tier, permission level or beta programme: surfaces appear, disappear, or are replaced by different surfaces with different occupants. A graph that models one of those without saying which is qualified by a condition nobody wrote down, and every fact in it inherits that silence. It makes no claim about which configuration most customers are on. Where a product genuinely ships several and the differences matter, declare a `configuration_axis` instead and let each fact say which values it holds under.' },\n    key_prefix: { type: 'string', description: 'Prefix for keys minted onto this product\\'s nodes (e.g. `\"LTN\"`, giving `LTN-1`, `LTN-2`, ...). Retained as the single-team unasked default. @deprecated since 0.33.0, removeIn 1.0.0. Use `team.key_prefix`. This field\\'s own summary called the prefix \"the namespace a tracker calls a team\", and a single string cannot express a product with two of them: a two-team product has never been expressible, which is a defect rather than an unused feature. Ignored whenever any team in the product declares a prefix. Deprecated rather than removed because removal would strand every graph that has a product prefix and no `team` nodes. @example \"LTN\"', notes: 'Pairs with `UPGBaseNode.key`, which holds the minted value and states the resolution order normatively. Only the prefix is serialised: the next number is `max(existing) + 1`, derived from the graph, because a counter is a fact about a store rather than about the product. WHY THIS IS NOT A DEFAULT WITH `team.key_prefix` AS AN OVERRIDE. A default and an override describe one fact at two scopes. These describe different facts, and this one is correct only when the product has exactly one team, which is an accident of arity rather than a scope. Keeping it live as a fallback would also reintroduce the defect: a prefix that still resolves wins on ladder order, so a legacy-prefixed product with two teams would offer no choice at all and mint everything under the legacy prefix silently, with migration order deciding the behaviour per graph.' },\n  },\n  // ProductAreaProperties: ProductArea entity.\n  product_area: {\n    strategic_priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Strategic priority assigned to this area' },\n    description: { type: 'string', description: 'Narrative description of what this area covers' },\n    owner: { type: 'string', description: 'Person or team that owns this area. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n  },\n  // ProgramProperties: Program.\n  program: {\n    start_date: { type: 'string', description: 'Program start date (ISO format)' },\n    end_date: { type: 'string', description: 'Program end date (ISO format)' },\n    budget: { type: 'number', description: 'Total budget allocated to the program' },\n  },\n  // ProjectProperties: Project.\n  project: {\n    start_date: { type: 'string', description: 'Project start date (ISO format)' },\n    end_date: { type: 'string', description: 'Project end date (ISO format)' },\n    methodology: { type: 'string', enum: ['agile', 'waterfall', 'kanban', 'hybrid'], description: 'Development methodology used' },\n  },\n  // PromptTemplateProperties: Prompt template.\n  prompt_template: {\n    use_case: { type: 'string', description: 'Intended use case for the prompt' },\n    variables: { type: 'string[]', description: 'Variable names expected by the template' },\n    version: { type: 'string', description: 'Version identifier of the template' },\n  },\n  // PromptVersionProperties: Prompt version.\n  prompt_version: {\n    version_number: { type: 'string', description: 'Semantic version' },\n    template: { type: 'string', description: 'Template body with variable placeholders' },\n    system_prompt: { type: 'string', description: 'System prompt prepended to every call' },\n    variables: { type: 'string[]', description: 'Expected template variable names' },\n    temperature: { type: 'number', description: 'Sampling temperature (0 = deterministic, 1 = creative)' },\n    max_tokens: { type: 'number', description: 'Max tokens to generate' },\n    input_token_estimate: { type: 'number', description: 'Estimated input tokens per invocation' },\n    performance_score: { type: 'number', description: 'Aggregate quality score from evaluations' },\n  },\n  // ProofPointProperties: ProofPoint entity.\n  proof_point: {\n    statement: { type: 'string', description: 'The claim or evidence statement' },\n    evidence_type: { type: 'string', enum: ['case_study', 'statistic', 'testimonial', 'certification', 'award'], description: 'Kind of evidence this proof point represents' },\n    source: { type: 'string', description: 'Origin of the evidence (e.g. customer name, study URL)' },\n  },\n  // PrototypeProperties: Prototype.\n  prototype: {\n    fidelity: { type: 'string', enum: ['low', 'medium', 'high'], description: 'Detail level' },\n    tool: { type: 'string', description: 'Authoring tool' },\n  },\n  // QaSessionProperties: QA session.\n  qa_session: {\n    session_type: { type: 'string', enum: ['exploratory', 'regression', 'smoke', 'uat'], description: 'Type of QA session' },\n    duration_minutes: { type: 'number', description: 'Duration of the session in minutes' },\n    bugs_found: { type: 'number', description: 'Number of bugs found during the session' },\n    environment: { type: 'string', enum: ['local', 'ci', 'staging', 'sandbox', 'production_mirror'], description: 'Environment the session was run against. Single-valued, unlike `TestPlanProperties.environments` (a plan spans several); the enum is the same one, mirroring `TestEnvironmentProperties.env_type`.' },\n    outcome_summary: { type: 'string', description: 'Plain-English outcome of the session: what it established, not how many bugs it counted (`bugs_found`). Named `outcome_summary`, matching `ExperimentRunProperties.outcome_summary`, because a bare `outcome` would collide with the `outcome` entity type.' },\n    executed_at: { type: 'string', description: 'ISO timestamp of when the session was run. Mirrors `TestResultProperties.executed_at`.' },\n  },\n  // QueueTopicProperties: Message queue or topic.\n  queue_topic: {\n    queue_type: { type: 'string', enum: ['sqs', 'kafka', 'rabbitmq', 'pubsub', 'other'], description: 'Technology' },\n    retention_hours: { type: 'number', description: 'Message retention in hours' },\n    consumer_groups: { type: 'string', description: 'Consumer group names' },\n    has_dead_letter_queue: { type: 'boolean', description: 'Whether a dead-letter queue is configured. Absent or `false` flags a message-loss risk. A DLQ is critical for debugging failed message processing.' },\n  },\n  // QuoteProperties: Verbatim quote from a participant.\n  quote: {\n    text: { type: 'string', description: 'Quoted text' },\n    timestamp: { type: 'string', description: 'When said (ISO timestamp or session offset)' },\n    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' },\n  },\n  // QuoteDocumentProperties: Quote document.\n  quote_document: {\n    quote_status: { type: 'string', enum: ['draft', 'sent', 'accepted', 'rejected', 'expired'], description: 'Current status of the quote' },\n    total_amount: { type: 'number', description: 'Total monetary amount of the quote' },\n    valid_until: { type: 'string', description: 'Expiration date of the quote (ISO format)' },\n    currency: { type: 'string', description: 'Currency code (e.g. \"USD\", \"EUR\")' },\n  },\n  // ReadModelProperties: CQRS read model / projection.\n  read_model: {\n    projection_source: { type: 'string', description: 'Source event or aggregate' },\n    refresh_strategy: { type: 'string', enum: ['sync', 'async', 'cron', 'on_demand'], description: 'How the model stays current' },\n  },\n  // RebuttalProperties: Rebuttal entity.\n  rebuttal: {\n    statement: { type: 'string', description: 'The counter-argument or response to an objection' },\n    strength: {\n      type: 'assessment', scale_id: 'scale_5', description: 'How convincing this rebuttal is (1-5)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    evidence_refs: { type: 'string[]', description: 'References to supporting evidence (e.g. interview or observation ids).' },\n  },\n  // RegionalPricingProperties: Regional pricing.\n  regional_pricing: {\n    currency: { type: 'string', description: 'Local currency code' },\n    price_override: { type: 'number', description: 'Overridden price for this region' },\n    ppp_factor: { type: 'number', description: 'Purchasing power parity adjustment factor' },\n    effective_date: { type: 'string', description: 'Date the regional pricing takes effect (ISO format)' },\n  },\n  // RegressionTestProperties: Regression test.\n  regression_test: {\n    regression_scope: { type: 'string', description: 'Scope of regression coverage (e.g. \"checkout flow\", \"auth module\")' },\n    automated: { type: 'boolean', description: 'Whether the regression test is automated' },\n    last_pass: { type: 'string', description: 'ISO date of last passing run' },\n    recent_failures: { type: 'number', description: 'Number of failures in recent runs' },\n  },\n  // ReleaseProperties: A shipped version or milestone of the product.\n  release: {\n    release_date: { type: 'string', description: 'Scheduled or actual release date (ISO)' },\n    version: { type: 'string', description: 'Semver or named version (e.g. \"v2.1.0\", \"Beta 3\")' },\n    start_date: { type: 'string', description: 'ISO date work begins' },\n    owner: { type: 'string', description: 'Responsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // ReleaseStrategyProperties: Release strategy.\n  release_strategy: {\n    strategy_type: { type: 'string', enum: ['blue_green', 'canary', 'rolling', 'recreate', 'feature_flag'], description: 'How a new version reaches production. @example \"canary\" for gradual rollout, \"blue_green\" for instant switch with instant rollback', notes: '`blue_green` switches instantly between two identical environments. `canary` rolls out by percentage. `rolling` replaces instances incrementally. `recreate` takes the old down before bringing the new up. `feature_flag` ships the code with the features gated.' },\n    canary_percentage: { type: 'number', description: 'Traffic routed to canary. Applies when `strategy_type === \\'canary\\'`. @example 5 (5% initial canary before full rollout)' },\n    rollback_criteria: { type: 'string', description: 'Rollback triggers, automatic or manual. @example \"Error rate > 1% over 5 minutes\", \"Latency p99 > 2x baseline\"' },\n    bake_time: { type: 'string', description: 'Soak time before promoting to full production. @example \"30m\", \"2h\", \"24h\"' },\n    auto_rollback: { type: 'boolean', description: 'Whether the system rolls back on threshold breach without human intervention.' },\n  },\n  // ReportProperties: Report entity.\n  report: {\n    report_type: { type: 'string', description: 'Classification of the report (e.g. \"weekly metrics\", \"ad hoc\")' },\n    schedule: { type: 'string', description: 'How often the report is generated' },\n    tool: { type: 'string', description: 'Tool used to generate the report' },\n  },\n  // ResearchPlanProperties: ResearchPlan entity.\n  research_plan: {\n    research_question: { type: 'string', description: 'Primary research question' },\n    suggested_methods: { type: 'string[]', description: 'Suggested methods' },\n    evidence_threshold: { type: 'string', description: 'Minimum evidence bar' },\n    deadline: { type: 'string', description: 'Suggested completion deadline. @example \"2026-06-30\"' },\n  },\n  // ResearchQuestionProperties: Research question guiding a study.\n  research_question: {\n    question_type: { type: 'string', enum: ['exploratory', 'evaluative', 'generative'], description: 'Question classification' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Importance to answer' },\n  },\n  // ResearchStudyProperties: Structured user research activity.\n  research_study: {\n    method: { type: 'string', enum: ['interview', 'usability', 'survey', 'diary', 'analytics'], description: 'Research method used to conduct the study' },\n    participant_count: { type: 'number', description: 'Number of participants recruited or observed', modifier: 'snapshot' },\n    start_date: { type: 'string', description: 'ISO date when the study starts' },\n    end_date: { type: 'string', description: 'ISO date when the study ends' },\n  },\n  // ResourceAllocationProperties: Resource allocation.\n  resource_allocation: {\n    resource_type: { type: 'string', enum: ['person', 'team', 'budget', 'tool'], description: 'Kind of resource being allocated' },\n    allocation_percentage: { type: 'number', description: 'Percentage of the resource allocated (0-100)' },\n    start_date: { type: 'string', description: 'Start date of the allocation (ISO format)' },\n    end_date: { type: 'string', description: 'End date of the allocation (ISO format)' },\n  },\n  // RetrospectiveProperties: Retrospective entity.\n  retrospective: {\n    format: { type: 'string', enum: ['start_stop_continue', 'four_ls', 'mad_sad_glad', 'sailboat', 'plus_delta', 'lean_coffee', 'other'], description: 'Closed-set retro format covering established retrospective patterns. Use `\\'other\\'` for novel formats; raise a spec proposal if `\\'other\\'` recurs.' },\n    period: { type: 'string', description: 'Sprint or time period being reflected on' },\n    key_learnings: { type: 'string[]', description: 'Key learnings from the retrospective' },\n    action_items: { type: 'string[]', description: 'Action items agreed upon' },\n  },\n  // RevenueStreamProperties: RevenueStream.\n  revenue_stream: {\n    stream_type: { type: 'string', enum: ['subscription', 'transaction', 'licensing', 'advertising', 'freemium', 'other'], description: 'How revenue is generated' },\n    recurring_revenue: { type: 'number', description: 'Monthly or annual recurring revenue from this stream' },\n    billing_model: { type: 'string', enum: ['subscription', 'usage', 'one_time', 'tiered', 'freemium', 'other'], description: 'Billing mechanics. May differ from `stream_type`.' },\n    recognition_basis: { type: 'string', enum: ['accrual', 'cash', 'deferred'], description: 'Accounting basis for revenue recognition' },\n    arr_contribution_pct: { type: 'number', description: 'Share of total ARR contributed (0–100)', modifier: 'snapshot' },\n    forecast: { type: 'string', description: 'Free-text forecast or projection' },\n  },\n  // ReviewGateProperties: Review gate.\n  review_gate: {\n    gate_type: { type: 'string', enum: ['human_review', 'automated_check', 'approval'], description: 'Kind of review required at this gate' },\n    required_approvers: { type: 'string[]', description: 'People or roles that must approve. Promote to `node_owned_by_person` edges (one per name) if ownership must be queryable.' },\n  },\n  // RiskProperties: Risk.\n  risk: {\n    risk_type: { type: 'string', enum: ['technical', 'business', 'legal', 'security', 'operational', 'program'], description: 'Domain the risk belongs to. The single kind axis for `risk`: there is no second classification vocabulary. `program` added in v0.26.0 so the retired `risk_item` (Program Management) type has a home on the canonical `risk` after consolidation, rather than a parallel `risk_domain` field free to drift from this one.' },\n    likelihood: {\n      type: 'assessment', scale_id: 'likelihood_5', description: 'How likely this risk is to materialise. Rated on `likelihood_5` (Rare → Almost certain).', notes: 'Canonical name since 0.35.0, superseding `probability` below. Three reasons, in order of weight. (1) `probability` was one name for two incompatible types (`UPGAssessment` here, a bare `number` on `forecast.probability`), and `PROPERTY_SCALE_MAP` is keyed by name alone, so a sales percentage and a risk judgment resolved to the same ladder. (2) `likelihood` is already the spec\\'s own word: the RISK_ITEM lifecycle prose says \"Likelihood and impact have been evaluated\", and `threat.likelihood` has been a `UPGAssessment` all along: one name, one type, one ladder. (3) ISO 31000 says likelihood. The ladder moved with the name: `likelihood_5` is new in 0.35.0 because no probability ladder existed and `confidence_5` is epistemic. It says how sure the assessor is, not how likely the event is.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    probability: {\n      type: 'assessment', scale_id: 'likelihood_5', description: 'How likely this risk is to materialise (1 = unlikely, 5 = near certain). @deprecated since=\"0.35.0\" removeIn=\"1.0.0\". Use `likelihood`, which is the spec\\'s own word for this in the risk lifecycle and on `threat`. Both names resolve to the same `likelihood_5` ladder for the length of the deprecation window (`PROPERTY_SCALE_MAP_BY_ENTITY.risk.probability`, Captain-ratified 2026-08-22): a deprecated field that renders on a DIFFERENT ladder from its replacement would make one stored 4 read \"Confident\" under the old name and \"Likely\" under the new one, which is the data changing meaning at the rename, which is the exact thing staging exists to prevent. `forecast.probability` is untouched and stays on `confidence_5`. STAGED, not renamed. The field is KEPT and still read: 0.35.0 changes what writers emit and what readers prefer, and changes NO stored bytes. A graph written before 0.35.0 carries `probability` and no `likelihood`, and reads correctly, which is the whole point of staging it. Writers: emit `likelihood`. Readers: prefer `likelihood`, fall back to `probability`. The fallback is a CONTRACT on consumers, not executable spec machinery, exactly as it is for `epic.estimate` → `effort`. `removeIn=\"1.0.0\"` is a deadline, not a wish: at 1.0.0 this field is dropped by a `drop_props` rule in `UPG_PROPERTY_MIGRATIONS`, the same two-step the `removeIn=\"0.5.0\"` properties followed (declared at 0.4.0, dropped by the 0.5.0 rules). Until then there is deliberately no executable rule: see the `\\'0.35.0\\'` block in `grammar/migrations.ts`.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    impact: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Severity of consequences if the risk materialises. Rated on `severity_5` (Mild inconvenience → Blocker), NOT the benefit-framed `impact_5`.', notes: 'The ladder is set by `PROPERTY_SCALE_MAP_BY_ENTITY.risk.impact` (0.35.0), the per-entity override layer. `impact` legitimately means magnitude of BENEFIT on discovery and market entities, where high is good; on a risk it means severity of harm, where high is bad. Sharing `impact_5` rendered a catastrophic risk green.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    mitigation: { type: 'string', description: 'Planned or implemented mitigation strategy, as prose.', notes: 'Prose only. A structured list of mitigating ACTIONS is a set of edges: `risk_mitigated_by_node` (0.35.0), pointing at the decisions, features and experiments that actually do the mitigating; a string array of them is unqueryable by construction. Likewise, what the risk puts at stake is `risk_threatens_node`, not a scope-list property.' },\n  },\n  // RiskRegisterProperties: Risk register.\n  risk_register: {\n    last_reviewed: { type: 'string', description: 'Date the register was last reviewed (ISO format)' },\n  },\n  // RoadmapProperties: Product roadmap.\n  roadmap: {\n    roadmap_type: { type: 'string', enum: ['now_next_later', 'quarterly', 'release_based', 'theme_based'], description: 'Structure' },\n    timeframe: { type: 'string', description: 'Covered timeframe' },\n    owner: { type: 'string', description: 'Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n  },\n  // RoadmapItemProperties: Roadmap item.\n  roadmap_item: {\n    quarter: { type: 'string', description: 'Planning quarter (e.g. \"Q2 2026\"). Pair with `start_date`/`target_date` for precise scheduling.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Importance against other items' },\n    confidence: {\n      type: 'assessment', scale_id: 'confidence_5', description: 'Delivery confidence within the planned period (UPGAssessment on `confidence_5`).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    start_date: { type: 'string', description: 'ISO date work begins. More precise than `quarter` for continuous planning.' },\n    target_date: { type: 'string', description: 'ISO date completion is expected. For shipped items, the actual completion date.' },\n  },\n  // RoadmapThemeProperties: Thematic grouping of roadmap work, around the customer problem it solves.\n  roadmap_theme: {\n    theme_scope: { type: 'string', description: 'Scope description' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Priority' },\n  },\n  // RoleProperties: Role entity.\n  role: {\n    responsibilities: { type: 'string[]', description: 'Key responsibilities of the role' },\n    seniority_range: { type: 'string', enum: ['intern', 'junior', 'mid', 'senior', 'staff', 'principal', 'director', 'executive'], description: 'Seniority band this role sits in' },\n    required_skills: { type: 'string[]', description: 'Skills expected for the role (structural refs to Skill entities go via edges)' },\n    reporting_line: { type: 'string', description: 'Role this one reports to (name or role id)' },\n  },\n  // RootCauseProperties: Underlying architectural or systemic issue.\n  root_cause: {\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Severity (1 = minor, 5 = critical)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    cause_category: { type: 'string', enum: ['code', 'config', 'process', 'dependency', 'data', 'infrastructure', 'human_error', 'other'], description: 'Closed-enum cause category for RCA reporting and dashboards. Distinct from the legacy free-form `category`.' },\n    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.' },\n    evidence_summary: { type: 'string', description: 'One-paragraph evidence summary. Log lines, traces, repro steps. Detailed artefacts go on linked `evidence` nodes.' },\n    affected_area: { type: 'string', description: 'Affected area of the system' },\n  },\n  // RunbookProperties: Runbook.\n  runbook: {\n    trigger: { type: 'string', description: 'Triggering event or alert. @example \"Error rate exceeds 5% for 5 minutes\", \"Database connection pool exhausted\"' },\n    steps: { type: 'string[]', description: 'Ordered steps, one action per element. @example [\"Check Grafana dashboard X\", \"SSH into affected node\", \"Restart service Y\"]' },\n    last_tested: { type: 'string', description: 'ISO date last tested or rehearsed. Runbooks degrade if untested. @example \"2026-03-15\"' },\n    automation_level: { type: 'string', enum: ['manual', 'semi_automated', 'fully_automated'], description: 'Operational maturity. Manual runbooks are candidates for automation investment. `semi_automated` = some steps scripted; human judgment still required.' },\n  },\n  // SalesMotionProperties: SalesMotion entity.\n  sales_motion: {\n    motion_type: { type: 'string', enum: ['self_serve', 'assisted', 'enterprise'], description: 'Level of human involvement in the sales process' },\n    qualification_criteria: { type: 'string', description: 'Narrative qualification rule: which funnel steps and conditions define \\'qualified\\'.' },\n    avg_deal_cycle: { type: 'string', description: 'Average time from first touch to closed deal. ISO-8601 duration (e.g. `\\'P30D\\'`, `\\'P3M\\'`). Typed as `Duration` so units survive round-trip.' },\n  },\n  // ScreenProperties: Screen in the product.\n  screen: {\n    route: { type: 'string', description: 'Application route. @example \"/dashboard\", \"/settings/billing\"' },\n    viewport: { type: 'string', enum: ['mobile', 'tablet', 'desktop', 'tv', 'watch', 'responsive'], description: 'Primary target viewport' },\n    access_level: { type: 'string', enum: ['public', 'authenticated', 'admin', 'internal'], description: 'Reach' },\n    purpose: { type: 'string', description: 'One-line purpose' },\n  },\n  // ScreenStateProperties: Specific state of a screen.\n  screen_state: {\n    state_order: { type: 'number', description: 'Display order of this state within its parent screen (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Orders the states a screen moves through (e.g. skeleton, loading, populated).' },\n    state_name: { type: 'string', enum: ['empty', 'loading', 'error', 'populated', 'skeleton', 'partial'], description: 'State' },\n    trigger: { type: 'string', description: 'Cause for entering this state' },\n    condition: { type: 'string', description: 'Data or environmental condition the state represents' },\n    message: { type: 'string', description: 'User-visible copy' },\n  },\n  // SecurityAuditProperties: Security audit.\n  security_audit: {\n    audit_scope: { type: 'string', description: 'Systems or processes covered by the audit' },\n    findings_count: { type: 'number', description: 'Total number of findings', modifier: 'derived' },\n    critical_findings: { type: 'number', description: 'Number of critical-severity findings' },\n  },\n  // SecurityControlProperties: Security control.\n  security_control: {\n    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.' },\n    effectiveness: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Mitigation effectiveness (1 = minimal, 5 = fully effective)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    control_family: { type: 'string', description: 'Control family (e.g. \"access control\", \"network security\")' },\n    framework_ref: { type: 'string', description: 'Framework reference (e.g. \"CC6.1\", \"A.9.2.3\")' },\n    last_tested: { type: 'string', description: 'ISO date last tested' },\n  },\n  // SecurityPolicyProperties: Security policy.\n  security_policy: {\n    scope: { type: 'string', description: 'Systems or processes covered' },\n    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.' },\n    version: { type: 'string', description: 'Version' },\n    effective_date: { type: 'string', description: 'ISO effective date' },\n    url: { type: 'string', description: 'Policy document URL' },\n    policy_status: { type: 'string', enum: ['draft', 'active', 'under_review', 'retired'], description: 'Lifecycle status' },\n    rule_strength: { type: 'string', enum: ['must', 'must_not', 'exception', 'warning', 'guideline'], description: 'Imperative force' },\n    owner: { type: 'string', description: 'Owning person or team accountable for the policy. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n  },\n  // SecurityReviewProperties: Security review.\n  security_review: {\n    category: { type: 'string', enum: ['code', 'design', 'architecture', 'vendor'], description: 'Reviewed artifact' },\n    findings: { type: 'string', description: 'Findings summary' },\n    review_date: { type: 'string', description: 'ISO review date' },\n    outcome: { type: 'string', enum: ['approved', 'approved_with_conditions', 'rejected', 'needs_rework'], description: 'Final outcome' },\n  },\n  // SeoKeywordProperties: SEO keyword.\n  seo_keyword: {\n    keyword: { type: 'string', description: 'The keyword or phrase being targeted' },\n    search_volume: { type: 'number', description: 'Estimated monthly search volume' },\n    difficulty: { type: 'number', description: 'Keyword difficulty score (0-100)' },\n    intent: { type: 'string', enum: ['informational', 'navigational', 'commercial', 'transactional'], description: 'Search intent behind the keyword' },\n    current_rank: { type: 'number', description: 'Current SERP ranking position', modifier: 'snapshot' },\n    target_rank: { type: 'number', description: 'Desired ranking position' },\n  },\n  // ServiceProperties: Service or microservice.\n  service: {\n    service_type: { type: 'string', enum: ['web', 'api', 'worker', 'db', 'queue', 'library', 'mobile', 'docs', 'lambda', 'cli'], description: 'Functional classification. Expanded from Backstage\\'s component type vocabulary. `cli` added in 0.9.12.' },\n    tech_stack: { type: 'string[]', description: 'Technologies used (e.g. [\"TypeScript\", \"Postgres\", \"Redis\"])' },\n    owner: { type: 'string', description: 'Owning person or team. Backstage marks this required; strongly recommended. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    lifecycle: { type: 'string', enum: ['experimental', 'production', 'deprecated'], description: 'Service maturity. Answers \"how mature is it?\". `experimental` = early-stage. `production` = battle-tested. `deprecated` = being phased out.' },\n    tags: { type: 'string[]', description: 'Free-form filter tags (e.g. [\"payments\", \"critical-path\", \"team-alpha\"]).' },\n    links: { type: 'object[]', description: 'Named URLs for documentation, dashboards, runbooks.' },\n  },\n  // ServiceBlueprintProperties: Service blueprint.\n  service_blueprint: {\n    blueprint_scope: { type: 'string', description: 'What part of the service this blueprint covers' },\n    frontstage_steps: { type: 'number', description: 'Number of customer-visible steps' },\n    backstage_steps: { type: 'number', description: 'Number of internal operational steps' },\n  },\n  // ServiceLevelAgreementProperties: Service-level agreement (SLA). The concrete obligations a service commits\n  service_level_agreement: {\n    target: { type: 'string', description: 'Target value for the primary metric (e.g. \"99.9%\", \"< 200ms p95\")' },\n    measurement_window: { type: 'string', description: 'Time period over which `target` is measured (e.g. \"monthly\", \"quarterly\")' },\n    coverage_hours: { type: 'string', description: 'Hours during which the SLA applies (e.g. \"24/7\", \"business hours\", \"follow-the-sun\")' },\n    response_time_target: { type: 'string', description: 'Target time to first acknowledgement of an incident (e.g. \"15 minutes\")' },\n    resolution_time_target: { type: 'string', description: 'Target time to incident resolution (e.g. \"4 hours\" for sev-1)' },\n    agreement_term: { type: 'string', description: 'Effective term of the agreement (e.g. \"12 months\", \"auto-renewing annual\")' },\n    effective_date: { type: 'string', description: 'ISO date effective' },\n    expiry_date: { type: 'string', description: 'ISO date expires. Pairs with `agreement_term` for renewal logic.' },\n    owner: { type: 'string', description: 'Party accountable on the service provider side. Promote to a `node_owned_by_team` edge if ownership must be queryable.' },\n    consequence_of_breach: { type: 'string', description: 'What happens if the SLA is breached (credits, penalties, escalation path)' },\n  },\n  // ServiceLevelIndicatorProperties: Service Level Indicator.\n  service_level_indicator: {\n    threshold: { type: 'number', description: 'Threshold that defines a \"good\" event. @example 200 (ms latency), 0.01 (1% error rate), 99.9 (% availability)' },\n    current_value: { type: 'number', description: 'Current observed value. Compared against `threshold` for SLO compliance. @example 150 (ms), 0.003 (0.3% error rate)', modifier: 'snapshot' },\n    unit: { type: 'string', description: 'Unit of measurement. Required to interpret `threshold` and `current_value`. @example \"ms\", \"%\", \"req/s\", \"errors/min\"' },\n    aggregation: { type: 'string', enum: ['avg', 'sum', 'max', 'min', 'p50', 'p95', 'p99', 'count'], description: 'Aggregation over the evaluation window. p99 and avg tell different stories. @example \"p99\" for tail latency, \"avg\" for mean throughput, \"count\" for total events' },\n    measurement_query: { type: 'string', description: 'Query expression that produces `current_value`. Free-form to fit PromQL, Datadog query strings, SQL, or vendor-specific DSLs. @example \\'sum(rate(http_requests_total{status=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m]))\\'' },\n    baseline_value: { type: 'number', description: 'Historical baseline. Pairs with `current_value` to indicate drift. @example 99.85' },\n  },\n  // ServiceLevelObjectiveProperties: Service Level Objective.\n  service_level_objective: {\n    target_percentage: { type: 'number', description: 'Target percentage. The reliability commitment. @example 99.9 (three nines), 99.95, 99.99 (four nines)' },\n    window: { type: 'string', description: 'Evaluation window. @example \"30 days\", \"rolling 28 days\", \"calendar quarter\"' },\n    current_percentage: { type: 'number', description: 'Current achieved percentage. Compared against `target_percentage` for health. @example 99.92 (above a 99.9 target)', modifier: 'snapshot' },\n    slo_type: { type: 'string', enum: ['metric', 'monitor', 'time_slice'], description: 'Measurement mechanism. `metric` = ratio (good/total). `monitor` = monitor-based. `time_slice` = uptime windows.' },\n    warning_threshold: { type: 'number', description: 'Soft alert threshold before the target breaches. Gives teams time to act. @example 99.95 (warn at 99.95% when target is 99.9%)' },\n  },\n  // SkillProperties: Skill entity.\n  skill: {\n    skill_category: { type: 'string', enum: ['technical', 'leadership', 'design', 'product', 'business', 'operations', 'other'], description: 'Category of the skill (UPG-579 Option B).' },\n    proficiency_levels: { type: 'string[]', description: 'Description of proficiency levels for this skill' },\n    domain: { type: 'string', description: 'Problem domain the skill applies to (e.g. \"payments\", \"accessibility\")' },\n    rarity: {\n      type: 'assessment', scale_id: 'scale_5', description: 'How scarce this skill is in the labour market this team hires from',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    hours_to_proficiency: { type: 'number', description: 'Typical hours of deliberate practice to reach working proficiency' },\n  },\n  // SocialPostProperties: Social media post.\n  social_post: {\n    platform: { type: 'string', enum: ['twitter', 'linkedin', 'instagram', 'youtube', 'tiktok', 'other'], description: 'Social media platform' },\n    post_type: { type: 'string', enum: ['text', 'image', 'video', 'carousel', 'story'], description: 'Format of the post' },\n    scheduled_date: { type: 'string', description: 'Date the post is scheduled to publish (ISO format)' },\n  },\n  // SolutionProperties: A proposed response to an opportunity\n  solution: {\n    timeline: { type: 'string', description: 'Estimated delivery or target timeline' },\n  },\n  // SpecificationProperties: A governed specification: a query language, protocol, data format, encoding,\n  specification: {\n    kind: { type: 'string', enum: ['language', 'protocol', 'data_format', 'encoding', 'interface_contract', 'object_model'], description: 'What the artifact fundamentally is, independent of how it is governed.' },\n    language_flavor: { type: 'string', enum: ['query', 'programming', 'markup', 'styling', 'schema', 'template'], description: 'Set only when `kind` is `language`: the kind of language.' },\n    governance: { type: 'string', enum: ['open_spec_stewarded', 'open_standard_consortium', 'proprietary_open', 'internal_primitive', 'de_facto'], description: 'How the specification is governed (its ratification status, and whether it counts as a `standard`). `open_standard_consortium` is a formal standard (W3C, IETF, ISO); `de_facto` and `internal_primitive` never became one.' },\n    steward: { type: 'string', description: 'The governing body or organisation (may later become an `organization` ref).' },\n    openness: { type: 'string', enum: ['open', 'proprietary'], description: 'Whether the specification itself is open or proprietary.' },\n    spec_url: { type: 'string', description: 'URL of the published specification.' },\n    current_version: { type: 'string', description: 'Latest published version string.' },\n    since: { type: 'string', description: 'Year or version the specification was introduced.' },\n    conformance: { type: 'string', description: 'How conformance is tested (test suite, certification program). Optional.' },\n  },\n  // StakeholderProperties: Stakeholder entity.\n  stakeholder: {\n    stakeholder_type: { type: 'string', enum: ['internal', 'external', 'investor', 'regulator'], description: 'Relationship of the stakeholder to the organisation' },\n    influence: {\n      type: 'assessment', scale_id: 'importance_5', description: 'How much influence this stakeholder has over decisions (1 = minimal, 5 = decisive)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    interest: {\n      type: 'assessment', scale_id: 'importance_5', description: 'How much interest this stakeholder has in the outcome (1 = passive, 5 = deeply invested)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    engagement_posture: { type: 'string', enum: ['champion', 'supporter', 'neutral', 'skeptic', 'blocker'], description: 'Which way this stakeholder leans: actively for, actively against, or neither. The third axis of the stakeholder model (0.35.0), beside the power/interest grid `influence` and `interest` describe.', notes: '`influence` and `interest` are magnitudes and carry no direction: a high-influence, high-interest stakeholder can be the strongest champion or the one who kills it, and the grid renders them identically. This closed enum is what makes \"who blocks this?\" a query rather than a reading exercise. Pairs with `UPG_ENUM_SCALES.EngagementPosture`. Posture is about the person\\'s stance; it is NOT delivery health, which belongs to work items, and NOT the relationship\\'s operational state.' },\n    engagement_cadence: { type: 'string', enum: ['continuous', 'hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'yearly', 'on_demand', 'other'], description: 'How often this stakeholder is engaged. Uses the shared `Cadence` scale.', notes: 'Typed as `Cadence` rather than free text on purpose: v0.4.0 introduced that enum precisely to retire strings like `\"2x/week\"`, and a cadence that cannot be compared across stakeholders cannot answer \"who have we not spoken to this quarter?\". WHERE you meet them (the channel) is an app-level concern and is deliberately not modelled here.' },\n  },\n  // StatusReportProperties: Status report.\n  status_report: {\n    report_period: { type: 'string', description: 'Time period the report covers' },\n    overall_status: { type: 'string', enum: ['on_track', 'at_risk', 'off_track'], description: 'Overall Red/Amber/Green health status' },\n    risks_flagged: { type: 'number', description: 'Number of risks flagged in this report' },\n    blockers: { type: 'string', description: 'Description of current blockers' },\n  },\n  // StrategicPillarProperties: StrategicPillar entity. Durable multi-year direction the product commits to.\n  strategic_pillar: {\n    owner: { type: 'string', description: 'Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    description: { type: 'string', description: 'Narrative of the pillar\\'s intent as a durable strategic area' },\n    scope: { type: 'string', description: 'The standing organisational area this pillar owns' },\n    time_horizon: { type: 'string', description: 'Standing / multi-year horizon, often open-ended (a pillar is durable). @example \"3 years\", \"2026-2028\", \"ongoing\"' },\n    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.' },\n  },\n  // StrategicQuestionProperties: StrategicQuestion entity.\n  strategic_question: {\n    question: { type: 'string', description: 'The question itself. Primary content.' },\n    context: { type: 'string', description: 'Context that surfaced the question: the reorg, the boundary, the unowned area.' },\n    resolution: { type: 'string', description: 'The answer, captured when the question moves to `resolved`.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Importance to resolve relative to other open questions.' },\n  },\n  // StrategicThemeProperties: StrategicTheme entity.\n  strategic_theme: {\n    owner: { type: 'string', description: 'Owning person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    time_horizon: { type: 'string', description: 'Bounded period this theme is active (a theme is time-bound, within a pillar). @deprecated since 0.20.0, removeIn 1.0.0. Promote the period to a `planning_cycle` node and link it with the `strategic_theme_scoped_to_planning_cycle` edge, which points at a shared, dated, nestable interval instead of a drifting per-theme string. Kept (not removed) for back-compat. The removal version is stated at 0.33.0 because an undated deprecation is how this field survived twelve minors; the promotion is documented rather than automated and no `drop_props` migration ships. `strategic_pillar.time_horizon` stays as-is (a durable pillar horizon is genuinely open-ended, not a dated cycle). @example \"Q1 2026\", \"FY26\"' },\n    description: { type: 'string', description: 'Short narrative of this time-bound thrust within its pillar' },\n    scope: { type: 'string', description: 'What the theme explicitly includes or excludes' },\n  },\n  // SubscriptionProperties: Subscription.\n  subscription: {\n    monthly_recurring_revenue: { type: 'number', description: 'Monthly recurring revenue from this subscription', modifier: 'snapshot' },\n    start_date: { type: 'string', description: 'Subscription start date (ISO format)' },\n    renewal_date: { type: 'string', description: 'Next renewal date (ISO format)' },\n    subscription_status: { type: 'string', enum: ['active', 'trialing', 'past_due', 'cancelled', 'paused'], description: 'Current status of the subscription' },\n  },\n  // SuccessMilestoneProperties: Customer success milestone.\n  success_milestone: {\n    milestone_type: { type: 'string', enum: ['adoption', 'expansion', 'renewal', 'advocacy'], description: 'Phase of the customer lifecycle this milestone tracks' },\n    target_date: { type: 'string', description: 'Target date for achieving this milestone (ISO format)' },\n    achieved: { type: 'boolean', description: 'Whether the milestone has been reached' },\n  },\n  // SupportTicketProperties: Support ticket.\n  support_ticket: {\n    ticket_type: { type: 'string', enum: ['bug', 'question', 'feature_request'], description: 'Classification of the ticket' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Impact severity of the issue (1 = cosmetic, 5 = service down)',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    resolution: { type: 'string', description: 'Description of how the ticket was resolved' },\n    source: { type: 'string', description: 'Where the ticket originated (e.g. \"email\", \"in-app\", \"chat\")' },\n    signal_sentiment: { type: 'string', enum: ['positive', 'neutral', 'negative', 'mixed'], description: 'Detected sentiment of the customer\\'s message' },\n    signal_channel: { type: 'string', description: 'Channel through which the signal was received' },\n    signal_urgency: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], description: 'Perceived urgency of the customer\\'s request' },\n  },\n  // SurfaceProperties: A place in the UI, its occupants, and the rule that arbitrates between them.\n  surface: {\n    surface_kind: { type: 'string', enum: ['shell', 'tool', 'pane', 'region', 'slot', 'gutter', 'action_bar', 'overlay', 'ambient'], description: 'Structural kind. Determines what may legally nest inside this surface.' },\n    persistence: { type: 'string', enum: ['always', 'conditional', 'on_demand', 'transient'], description: 'How reliably the surface is present.' },\n    visibility_condition: { type: 'string', description: 'When the surface appears, in plain language. Pairs with `persistence: \\'conditional\\'`, which states *that* it is conditional; this states *what* the condition is. @example \"A node is selected\", \"Only for workspace admins\"' },\n    capacity: { type: 'number', description: 'How many occupants ONE INSTANCE of the surface holds at once, as a non-negative count. Absent means unbounded, `0` means a reserved place nothing may occupy. Always the cap the design INTENDS, never what was observed rendering. Count the instances themselves with `cardinality`.', notes: 'Intent, not observation: a banner region declared `capacity: 1` keeps saying 1 even after someone finds it rendering four. Reality that has drifted from the declared intent belongs on `surface_deviates_via_technical_debt_item` as a trackable, assignable debt item. Editing this number up to match the bug would destroy the only record that a gap exists. Why absence rather than a sentinel: UPG has no union-typed property primitive, so `integer | unbounded` is expressed as an optional number whose absence carries the \"no cap\" reading, instead of a magic value every consumer would have to special-case. Three states, all different. ABSENT is unbounded, no cap stated. `0` is a reserved place. `null` is neither, and nothing this field defines: it is what an explicit null write leaves behind, and no consumer reads it as a cap. To return the property to absent, remove the key with `update_node`\\'s or `batch_update_nodes`\\' `unset_properties`, since a property merge preserves anything omitted. Unbounded is not an exemption from scrutiny. The contention detector reads an absent capacity as a threshold of 1, because a surface that states no limit has stated no answer either, so several occupants is exactly the unrecorded decision worth naming. Declaring a real capacity is the way to quiet the check honestly, and the only way that also records something true.' },\n    cardinality: { type: 'string', enum: ['1', '0..1', '1..n', '0..n'], description: 'How many instances of this surface exist. `capacity` counts occupants within one instance; this counts the instances.' },\n    instance_scope: { type: 'string', enum: ['global', 'per_parent'], description: 'What an instance is scoped to: one shared instance for the product, or one per containing surface. Decides whether \"the product has this surface\" is a true sentence or a per-parent one.' },\n    composition_mode: { type: 'string', enum: ['exclusive', 'additive', 'chained'], description: 'How the occupants relate: one wins (`exclusive`), all coexist (`additive`), or each wraps the next (`chained`). Declaring `chained` exempts the surface from `contended-surface-without-arbitration`; leaving this unset does not.' },\n    arbitration_rule: { type: 'string', description: 'Who wins when more occupants want the surface than `capacity` allows, and why. Absence is meaningful: on a contested surface it means nobody decided. @example \"Highest priority wins; ties break to the most recently updated.\"', notes: 'An empty or absent rule on a contested surface is exactly what `contended-surface-without-arbitration` detects. Do not fill it in with a placeholder to silence the check: the check exists to find the unrecorded decision, and a placeholder hides it without settling anything. The field is overloaded across composition modes, which is worth knowing before writing one. On an `exclusive` surface it records DISPLACEMENT (who is not rendered). On an `additive` surface everyone fits, so what it records is ORDER. Only the displacement reading is what the contention detector reads.' },\n    arbitration_state: { type: 'string', enum: ['enforced_documented', 'enforced_undocumented', 'safe_by_coincidence', 'none', 'no_contention_by_design'], description: 'Whether the arbitration answer is enforced, written down, both, neither, or not owed at all. Leaving the field unset means unassessed, and always did.', notes: 'The separations are the whole point of the field, because absence alone conflates four situations with four different remediations: \"enforced in code but never transcribed\" is ten minutes of typing, \"never decided\" is a design meeting, \"safe only because nothing has collided yet\" is the dangerous one, and \"nothing to decide, the occupants never compete\" is a chained surface, which owes no arbitration rule at all.' },\n    extensibility: { type: 'string', enum: ['closed', 'plugin_registerable', 'user_configurable'], description: 'Who may add occupants to the surface. @deprecated since 0.36.0, removeIn 1.0.0. Use `extension_mechanism` / `extension_audience` / `extension_scope` / `extension_point`: this single enum collapses four independent facts (mechanism, audience, scope, and the named API entry point) into one value, which forces false `closed` readings on surfaces that are overridable through a mechanism the enum has no room to name. STAGED, not renamed: the field is kept and still read, no stored bytes change. There is no `PROPERTY_SCALE_MAP_BY_ENTITY` entry for this one: unlike `risk.probability` → `likelihood_5`, this is a structural split with no scale to remap onto, so no machine migration ships; re-modelling a surface\\'s real mechanism/audience/scope is a judgement call, same as promoting `objective.timeframe` to a `planning_cycle` node.' },\n    extension_mechanism: { type: 'string', enum: ['none', 'component_wrap', 'component_replace', 'list_resolve', 'register', 'config_flag', 'render_callback'], description: 'The mechanism by which this surface is customized: e.g. `component_wrap` for a `renderDefault`-style override, `list_resolve` for a filter/append resolver, `register` for named-collection registration. Independent of `extension_audience` and `extension_scope`. `none` means not customizable by this mechanism, not unassessed.', notes: 'A surface can be `component_wrap`-able by a schema author globally and `register`-able by a plugin author per type at the same time, which is exactly the shape `extensibility` could not hold: it named only a mechanism-or-audience, never both.' },\n    extension_audience: { type: 'string[]', enum: ['config_author', 'schema_author', 'plugin_author', 'end_user'], description: 'WHO may customize the surface through the declared `extension_mechanism`: the studio config author, the schema author, a plugin author, or the end user. Multi-valued because the same surface is often overridable by more than one audience through different entry points (e.g. globally by a config author, per-type by a schema author).' },\n    extension_scope: { type: 'string[]', enum: ['global', 'per_type', 'per_field', 'per_instance'], description: 'AT WHAT SCOPE the customization applies: the whole surface, one type, one field, or one instance. Multi-valued: a form field surface can be overridable globally and per type at once.', notes: 'This is the fact `extensibility: \\'closed\\'` got wrong most often: \"has no registration list of its own\" (no per-instance entry, e.g. `form.components.field` has none) does not mean \"cannot be customized\" (it is still overridable globally and per type via a schema-level `components` declaration).' },\n    extension_point: { type: 'string', description: 'The named API entry point through which the customization happens. @example \"form.components.field\", \"document.actions\", \"studio.tools\"', notes: 'A durable, checkable link from the model to the code, in the same spirit as recording a DOM selector: it makes the customization fact verifiable against the real API rather than asserted from memory.' },\n    mutates_content: { type: 'boolean', description: 'Whether occupying this surface can change the underlying content, as opposed to only selecting or revealing it. The selector-versus-mutator distinction: a gutter that toggles a value is a mutator, a gutter that jumps the cursor is not.' },\n    dimensional_constraint: { type: 'string', description: 'The hard spatial budget the surface imposes on its occupants, in whatever unit the design system speaks. @example \"292px wide\", \"25px per field\", \"two grid columns\"' },\n  },\n  // SurveyResponseProperties: Aggregated survey response data.\n  survey_response: {\n    response_count: { type: 'number', description: 'Total responses', modifier: 'snapshot' },\n    completion_rate: { type: 'number', description: 'Completion (0–1)', modifier: 'snapshot' },\n    method: { type: 'string', enum: ['email', 'in_app', 'phone', 'other'], description: 'Distribution method' },\n  },\n  // SwitchingCostProperties: SwitchingCost entity.\n  switching_cost: {\n    cost_type: { type: 'string', enum: ['financial', 'learning', 'data', 'relationship', 'procedural'], description: 'Type of switching cost' },\n    magnitude: {\n      type: 'assessment', scale_id: 'severity_5', description: 'How large the barrier is (UPGAssessment on the `severity_5` scale).',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    barrier_description: { type: 'string', description: 'Free-text description of the barrier' },\n  },\n  // SymptomProperties: Observable behaviour produced by a root cause.\n  symptom: {\n    symptom_description: { type: 'string', description: 'Plain-language description of observed behaviour. Primary content of the entity.' },\n    first_observed_at: { type: 'string', description: 'ISO timestamp first observed in the wild. Pairs with `frequency_rating` and `reproducibility` for triage.' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', 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`.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    frequency_count: { type: 'number', description: 'Exact observation count in the period. Pairs with `frequency_period` for a precise rate.', modifier: 'snapshot' },\n    frequency_period: { type: 'string', description: 'Recurrence period (ISO-8601 `Duration`). @example \\'P7D\\' (per week), \\'P1D\\' (per day), \\'PT1H\\' (per hour)' },\n    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 → rare`, `sporadic → occasional`, `frequent → regular`, `constant → constant`.' },\n    affected_users_estimate: { type: 'number', description: 'Approximate count of users affected. Snapshot estimate.' },\n    reproducibility: { type: 'string', enum: ['always', 'frequent', 'intermittent', 'rare', 'once'], description: 'Reproduction reliability' },\n    steps_to_reproduce: { type: 'string', description: 'Steps to reproduce' },\n  },\n  // TargetCustomerSegmentProperties: TargetCustomerSegment.\n  target_customer_segment: {\n    segment_type: { type: 'string', enum: ['mass', 'niche', 'segmented', 'diversified', 'multi_sided'], description: 'Segmentation strategy' },\n    segment_size: { type: 'number', description: 'Estimated potential customers' },\n    willingness_to_pay: { type: 'string', description: 'Price sensitivity and willingness-to-pay description' },\n  },\n  // TaskProperties: Task: a discrete unit of work, smaller than a story.\n  task: {\n    assignee: { type: 'string', description: 'Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    effort: { type: 'string', description: 'Effort estimate (e.g. \"2h\", \"1d\", \"3 points\"). Use a consistent unit within your team.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Relative importance against other tasks' },\n    due_date: { type: 'string', description: 'ISO date due. Typically bounded by the containing story\\'s due date.' },\n    labels: { type: 'string[]', description: 'Free-form classification tags. @deprecated since 0.32.0. Use base-node `tags` for ungrouped labels, and `classification_axis` + `classification_value` + `node_classified_as_classification_value` when the labels belong to a named group. This field duplicated `tags` and had no consumers; three parallel label surfaces (base `tags`, per-type `tags`, per-type `labels`) were two too many. `UPG_PROPERTY_MIGRATIONS[\\'0.32.0\\']` drops it.' },\n    workflow_state: { type: 'string', description: 'The source tool\\'s raw custom workflow state, verbatim and opaque (e.g. \"In Review\", \"QA\", \"Needs Triage\"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.' },\n    workflow_state_category: { type: 'string', enum: ['triage', 'backlog', 'unstarted', 'started', 'completed', 'cancelled'], description: 'Canonical bucket the raw `workflow_state` maps onto for reasoning: a source \"In Review\" and a source \"QA\" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.', notes: 'It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source\\'s raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.' },\n  },\n  // TeamProperties: Team entity.\n  team: {\n    team_type: { type: 'string', enum: ['product', 'engineering', 'design', 'growth', 'customer_success'], description: 'Functional area of the team' },\n    size: { type: 'number', description: 'Number of people on the team' },\n    mission: { type: 'string', description: 'Team\\'s mission statement' },\n    key_prefix: { type: 'string', description: 'Prefix this team mints node keys with (e.g. `\"ENTP\"`, giving `ENTP-1`, `ENTP-2`, ...). @example \"ENTP\"', notes: 'SUPERSEDES `product.key_prefix` FOR THIS PRODUCT, AND NOTHING ELSE (normative, narrowed in 0.34.0). The moment any team declares a prefix, the PRODUCT-LEVEL prefix stops being consulted. A product-level prefix that still resolved would win on order alone, and a multi-team product would then silently mint everything under it, which is the defect this field exists to end. THE CANDIDATE SET IS THE UNION OF DECLARED AND OBSERVED PREFIXES. A declaration adds a candidate; it does not remove one. A prefix stops being offered only when something claims it or when nothing has ever minted under it, and while more than one candidate stands the create surface keeps asking. WHY THIS WAS NARROWED, stated because 0.33.0 shipped the wider reading and an implementer built against it. The paragraph above made ANY declaration replace the candidate set outright, and its own stated rationale is entirely about `product.key_prefix`: a SINGLE STRING, declared once, that cannot represent two teams. An OBSERVED prefix is not that. It is evidence of a namespace already in active use. Suppressing it reproduces the precise defect this field exists to end, inside one product, and does so silently. Measured on the only keyed graph in the estate: it carries two observed prefixes, 370 keys under one and 662 under the other, and declares neither. Under the wider reading, one team declaring the smaller prefix collapses the candidate set to it, the picker disappears, and every later create mints under it, including the 662 keys\\' worth of work belonging to the other namespace. The sentence over-reached beyond its own reason, and this narrows it back to that reason. Shipped as a CHANGE in 0.34.0 rather than as a patch correction. Read as a correction it is defensible, but implementers had already built to the wider text, and moving a contract under them in a patch is how a patch becomes a surprise. A DECLARED PREFIX IS A CANDIDATE BEFORE IT IS OBSERVED. Candidates derived only from keys that already exist cannot see a team\\'s first create, which is the one that most needs asking about. That is why declaration ADDS to the candidate set; it is not a reason for it to subtract. UNIQUENESS IS PRODUCT-SCOPED, AND A TEAM PREFIX DOES NOT WIDEN IT. The key sequence runs per product across entity types, so two teams in one product share one number line and never collide with each other. A team prefix names a team WITHIN that scope; it does not create a sequence that spans products. MINTING IS PRODUCT-SCOPED (normative, 0.33.0). `team` is `portfolio_shared`, so one team node can be referenced from two products. Minting is not portfolio-scoped with it. The rule, and it is a requirement rather than a recommendation: 1. A portfolio-shared team\\'s prefix is NOT a minting candidate in a second product. The first product a team mints under is the only product that prefix mints in. 2. Refusal is NO-KEY. The node is created without a key. Refusal MUST NOT be an exception: a keyless create is a legal outcome everywhere else in the ladder, and throwing here would break creates that succeed today on every surface. Throwing stays reserved for a broken invariant, not for policy. 3. The rule applies on the MINT path, not the picker path, and it covers the INFERRED case. A prefix that was never requested by anyone, and was derived from keys that already exist in the second product, is refused on the same terms as one a caller named. A guard that only inspects an explicitly requested prefix misses the quiet path, and the quiet path is the one a fixture reproduces. WHY THE SCOPE STOPS AT THE PRODUCT. Key uniqueness is enforced by a `(product_id, key)` index, which permits the same key under two product ids by construction. A prefix that minted in two products would therefore run two independent sequences under one name and hand two different nodes the same citation, with nothing objecting. Portfolio-shared team minting is DEFERRED until a supra-product uniqueness design exists, rather than approximated. HOW RULE 1 IS DECIDED: THE EVIDENCE RULE (normative, 0.34.0). Rule 1 names a first product without saying how a minter knows which one it is. It is decided by EVIDENCE, not by a stored marker: at mint, if any other IN-SCOPE product already holds a key under the prefix, refuse. Evidence is derivable from the graphs themselves, needs no migration, cannot go stale, and cannot disagree with the keys. A durable home marker could do all three, and would mint state for a fact the graph already carries. The cost is stated rather than hidden: evidence is SCOPE-DEPENDENT, which is why the scope is ruled below in the same breath rather than left open. THE UNDECIDABLE CASE: NEITHER MINTS (normative, 0.34.0). When two products already hold keys under one prefix and nothing establishes which was first, NEITHER mints. No tiebreak is invented. Creation order is not recorded, and `max(existing)` measures import volume rather than precedence, so any tiebreak would be a guess wearing a rule, and a silent one, since it would attribute a namespace to a product with nothing to say it was wrong. Refusing both is the NO-KEY outcome rule 2 already sanctions, and it is recoverable: once either product declares the prefix, the other is unambiguous and a backfill can run. WHAT \"IN SCOPE\" MEANS: ENGINE-DEFINED, WITH A FLOOR AND A CEILING (normative, 0.34.0). The scope over which the evidence rule looks is defined by the engine, bounded on both sides. FLOOR. It MUST include every product the engine can enumerate for this caller. An engine that looks at fewer products than it can see is choosing not to notice a collision it could have seen. CEILING. It MUST NEVER include a product the caller could not otherwise read. A wider read is a cross-tenant information channel: refusing a mint because of a key in a graph the caller cannot see leaks that the graph exists and what is in it. This half is a security constraint and is not negotiable. PORTFOLIO ALTITUDE IS THE WRONG NORMATIVE ALTITUDE, and it was measured rather than argued: deleting the portfolio document changes nothing about minting, because no minter consults the portfolio seam. Stating the invariant there states it where nobody looks. In practice the local engine\\'s scope is every graph in the workspace folder and the cloud engine\\'s is the caller\\'s own product list. THE HONEST CONSEQUENCE, which belongs in the text rather than in a later surprise: the invariant is SCOPE-RELATIVE. Two engines can legitimately disagree about whether one mint is safe, because they can legitimately see different sets of products. That is a real limitation of the evidence rule and the price of the ceiling. IMMUTABLE ONCE ANYTHING HAS MINTED UNDER IT, PER PRODUCT (normative, 0.34.0). Once any key exists under this prefix IN A GIVEN PRODUCT, the declaration cannot be edited for that product. Refusal-shaped and NO-KEY, matching rule 2: never an exception, because a keyless create is legal everywhere else in the ladder. SCOPED PER PRODUCT, NOT PER TEAM, and the reason is that `team` is `portfolio_shared`: a team that has never minted in product B must still be free to declare there. A per-team global lock would strand it. WHAT IT PREVENTS. Without it, a team edits its prefix after four hundred mints and one product silently carries two number lines under two names, with nothing recording that they were ever one sequence. RENAMING STAYS POSSIBLE BY THE HONEST ROUTE: a migration that rewrites the existing keys. That is a deliberate act with a visible cost, which is the difference between renaming a namespace and forking it by accident. THE PICKER MAY OFFER WHAT THE MINT REFUSES, AND THE SURFACE OWNS THE DIVERGENCE (0.34.0). Rule 3 applies on the MINT path and not the picker path, which is deliberate: the picker cannot cheaply know the answer, since knowing it requires reading other products. The consequence is that a surface can present a choice that then fails. The owner is named here rather than left implicit: A CREATE SURFACE THAT OFFERS A PREFIX THE MINT MAY REFUSE MUST BE ABLE TO REPORT THE REFUSAL, AND MUST BE ABLE TO PRESENT NO-KEY AS AN OUTCOME RATHER THAN AS AN ERROR. This is a design obligation on the surface, not a spec mechanic: the spec cannot fix a UX gap and should not pretend to. The union ruling above shrinks the divergence considerably, because the picker now keeps asking in exactly the case that would otherwise resolve wrongly. This rule states the CONTRACT. The behaviour belongs to whatever mints keys, which is not this package: see `UPGBaseNode.key`.' },\n  },\n  // TeamOkrProperties: TeamOkr entity.\n  team_okr: {\n    period: { type: 'string', description: 'Time period for the OKR (e.g. \"Q2 2026\")' },\n    progress: { type: 'number', description: 'Overall progress toward the objective (0-100%)' },\n    objective_statement: { type: 'string', description: 'The team-level objective statement (key results live in child entities)' },\n  },\n  // TechnicalDebtItemProperties: Technical debt item.\n  technical_debt_item: {\n    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.' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Severity on system or team. Requires human evaluation.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    effort_to_fix: {\n      type: 'assessment', scale_id: 'effort_5', description: 'Estimated effort to resolve. Requires team knowledge of the codebase.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    owner: { type: 'string', description: 'Owning person or team responsible for paydown. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    affected_area: { type: 'string', description: 'Codebase location, service, or module. @example \"apps/graph/src/canvas/\", \"UserService\", \"auth module\"' },\n    interest: { type: 'string', description: 'Ongoing cost of leaving it unresolved (the \"interest\" in the financial metaphor). @example \"~2h/sprint of workarounds\", \"blocks type-safe refactor of checkout\"' },\n    intentionality: { type: 'string', enum: ['deliberate', 'inadvertent'], description: 'Origin of the debt. `deliberate` = conscious decision to ship something imperfect (prudent or reckless). `inadvertent` = discovered after the fact. Based on Fowler\\'s Technical Debt Quadrant.' },\n  },\n  // TerritoryProperties: Territory entity.\n  territory: {\n    territory_type: { type: 'string', enum: ['geographic', 'vertical', 'account_based', 'named'], description: 'How the territory is defined' },\n    region: { type: 'string', description: 'Geographic region or market covered' },\n    quota: { type: 'number', description: 'Revenue quota for this territory' },\n  },\n  // TestCaseProperties: Test case.\n  test_case: {\n    execution_type: { type: 'string', enum: ['manual', 'automated', 'exploratory'], description: 'How the test is executed' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Test importance' },\n    preconditions: { type: 'string[]', description: 'Conditions required before running the test' },\n    steps: { type: 'string[]', description: 'Ordered steps to execute the test' },\n    expected_result: { type: 'string', description: 'What a passing result looks like' },\n    last_result: { type: 'string', enum: ['not_run', 'pass', 'fail', 'blocked', 'skipped'], description: 'Result of the most recent execution' },\n    section: { type: 'string', description: 'Hierarchical grouping within the parent suite (e.g. \"Checkout / Payment\")' },\n    template: { type: 'string', description: 'Test case template applied (e.g. \"BDD\", \"Given-When-Then\", \"exploratory charter\")' },\n    references: { type: 'string[]', description: 'Links to requirements, tickets, or external documentation' },\n    automation_status: { type: 'string', enum: ['manual', 'automated', 'partially_automated', 'planned', 'other'], description: 'Automation status. Closed set so coverage dashboards can group test cases by automation maturity. Pair with `automation_tool` for the specific framework (e.g. Playwright, Cypress) when automated.' },\n    automation_tool: { type: 'string', description: 'Automation tool or framework (e.g. `\\'Playwright\\'`, `\\'Cypress\\'`, `\\'Jest\\'`). Free-text; the universe of tools is open. Pairs with `automation_status` per audit recommendation (#40).' },\n  },\n  // TestCoverageReportProperties: Test coverage report.\n  test_coverage_report: {\n    line_coverage: { type: 'number', description: 'Percentage of lines covered (0-100)' },\n    branch_coverage: { type: 'number', description: 'Percentage of branches covered (0-100)' },\n    function_coverage: { type: 'number', description: 'Percentage of functions covered (0-100)' },\n    statement_coverage: { type: 'number', description: 'Percentage of statements covered (0-100)' },\n    target_coverage: { type: 'number', description: 'Coverage target threshold set by the team (0-100)' },\n    uncovered_lines: { type: 'number', description: 'Number of lines not covered by any test' },\n    report_date: { type: 'string', description: 'ISO date when the report was generated' },\n  },\n  // TestEnvironmentProperties: Test environment.\n  test_environment: {\n    env_type: { type: 'string', enum: ['local', 'ci', 'staging', 'sandbox', 'production_mirror'], description: 'Type of environment' },\n    env_status: { type: 'string', enum: ['available', 'in_use', 'maintenance', 'unavailable'], description: 'Current availability status of the environment' },\n    config: { type: 'string', description: 'Configuration details (e.g. OS, browser version, database seed)' },\n  },\n  // TestPlanProperties: Test plan: the QA verification procedure for a product or release.\n  test_plan: {\n    test_scope: { type: 'string', description: 'What the plan covers (e.g. \"checkout flow\", \"auth module\", \"release 2.4\").' },\n    plan_type: { type: 'string', enum: ['release', 'regression', 'integration', 'acceptance', 'smoke', 'exploratory'], description: 'Kind of verification effort this plan governs.' },\n    environments: { type: 'string[]', enum: ['local', 'ci', 'staging', 'sandbox', 'production_mirror'], description: 'Environments the plan exercises (mirrors `TestEnvironmentProperties.env_type`).' },\n    entry_criteria: { type: 'string', description: 'Conditions that must hold before execution may begin.' },\n    pass_criteria: { type: 'string', description: 'Exit / pass criteria determining whether the plan succeeds.' },\n  },\n  // TestResultProperties: Single test execution result.\n  test_result: {\n    result_status: { type: 'string', enum: ['passed', 'failed', 'timed_out', 'skipped', 'interrupted'], description: 'Outcome of this execution. passed = all assertions met; failed = one or more assertions failed; timed_out = execution exceeded the timeout; skipped = test was not run; interrupted = test was stopped mid-run.' },\n    duration_ms: { type: 'number', description: 'Duration of this execution in milliseconds' },\n    retry_index: { type: 'number', description: 'Retry index. 0 = first attempt, 1 = first retry, etc.' },\n    error_message: { type: 'string', description: 'Error message if the test failed' },\n    version_tested: { type: 'string', description: 'Version of the product or build under test' },\n    executed_at: { type: 'string', description: 'ISO timestamp of the execution. @example \"2026-04-05T14:30:00Z\"' },\n    attachments: { type: 'string', description: 'Comma-separated list of attachment names or URLs (screenshots, logs, traces)' },\n    comment: { type: 'string', description: 'Notes or commentary about this result' },\n  },\n  // TestSuiteProperties: Test suite.\n  test_suite: {\n    suite_type: { type: 'string', enum: ['unit', 'integration', 'e2e', 'performance', 'security', 'accessibility', 'visual'], description: 'Category of test suite. The single canonical verification-method vocabulary in the spec: do not mint a second one at criterion level.', notes: '`visual` covers visual-regression and screenshot-diff suites, whose evidence is a rendered-output comparison rather than an assertion over behaviour. Before it existed, producers mapped visual suites onto `integration` as the least-wrong stock value, which made them indistinguishable from genuine integration coverage.' },\n    test_count: { type: 'number', description: 'Number of tests in the suite', modifier: 'derived' },\n    pass_rate: { type: 'number', description: 'Percentage of tests passing (0-100)', modifier: 'snapshot' },\n    last_run: { type: 'string', description: 'ISO date of last execution' },\n    total_duration_ms: { type: 'number', description: 'Total execution time for the last run, in milliseconds' },\n    failed_count: { type: 'number', description: 'Number of tests that failed in the last run', modifier: 'snapshot' },\n    skipped_count: { type: 'number', description: 'Number of tests that were skipped in the last run', modifier: 'snapshot' },\n    flaky_count: { type: 'number', description: 'Number of tests that passed only on retry (flaky) in the last run', modifier: 'snapshot' },\n  },\n  // ThreatProperties: Threat.\n  threat: {\n    category: { type: 'string', description: 'Attack or threat scenario. @example \"injection\", \"misconfiguration\", \"social engineering\", \"supply chain\"' },\n    likelihood: {\n      type: 'assessment', scale_id: 'likelihood_5', description: 'Likelihood (1 = theoretical, 5 = actively exploited). @example value 5 for a known, exploitable, commonly targeted pattern',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    impact: {\n      type: 'assessment', scale_id: 'impact_5', description: 'Impact (1 = minimal, 5 = catastrophic). @example value 5 for threats that expose PII or cause complete service compromise',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    stride_type: { type: 'string', enum: ['spoofing', 'tampering', 'repudiation', 'info_disclosure', 'denial_of_service', 'elevation_of_privilege'], description: 'STRIDE classification. Which security property is violated. `spoofing` = identity. `tampering` = integrity. `repudiation` = non-repudiability. `info_disclosure` = confidentiality. `denial_of_service` = availability. `elevation_of_privilege` = authorisation.' },\n    threat_agent: { type: 'string', description: 'Threat actor or source. @example \"external attacker\", \"malicious insider\", \"compromised dependency\", \"misconfigured service\"' },\n    mitigation_status: { type: 'string', enum: ['open', 'mitigated', 'accepted', 'transferred', 'eliminated'], description: 'Mitigation status. @example \"accepted\" = the risk has been formally acknowledged and no action will be taken' },\n    violated_property: { type: 'string', enum: ['authentication', 'integrity', 'non_repudiation', 'confidentiality', 'availability', 'authorisation'], description: 'Violated security property. Maps STRIDE to the CIA+ model. @example \"confidentiality\" for information disclosure threats' },\n  },\n  // ThreatModelProperties: Threat model.\n  threat_model: {\n    methodology: { type: 'string', enum: ['stride', 'dread', 'pasta', 'attack_tree', 'other'], description: 'Threat-modelling methodology: `stride`, `dread`, `pasta`, or `attack_tree`. @example \"stride\" is the most widely used methodology for web applications', notes: '`stride` is the OWASP standard (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege). `dread` is numeric scoring (Damage, Reproducibility, Exploitability, Affected users, Discoverability). `pasta` is the seven-stage Process for Attack Simulation and Threat Analysis. `attack_tree` is a hierarchical tree of attack paths.' },\n    scope: { type: 'string', description: 'What system, feature, or data flow is being analysed. @example \"user authentication\", \"payment processing\", \"admin API\"' },\n    last_reviewed: { type: 'string', description: 'ISO date last reviewed. Models become stale as systems evolve. @example \"2026-03-01\"' },\n    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)\"' },\n    threat_count: { type: 'number', description: 'Threats identified. Key metric for scope and completeness. @example 12', modifier: 'derived' },\n  },\n  // TouchpointProperties: Customer touchpoint.\n  touchpoint: {\n    touchpoint_channel: { type: 'string', enum: ['in_app', 'email', 'phone', 'chat', 'sms', 'in_person', 'mail'], description: 'Medium (modality) of the interaction: how it physically happens. Distinct from a go-to-market *channel* (`marketing_channel`/`acquisition_channel`/ `distribution_channel`), which are market routes, not interaction media. (UPG-679)' },\n    touchpoint_type: { type: 'string', enum: ['reactive', 'proactive', 'automated'], description: 'Whether the touchpoint is initiated by the customer, CSM, or system' },\n    satisfaction_score: { type: 'number', description: 'Customer satisfaction score for this touchpoint' },\n  },\n  // TranslationBundleProperties: Translation bundle.\n  translation_bundle: {\n    bundle_scope: { type: 'string', enum: ['core', 'onboarding', 'settings', 'errors', 'marketing', 'help', 'legal', 'other'], description: 'Bundle scope. Closed set of common translation bundle groupings. Use `\\'other\\'` for product-specific module bundles.' },\n    last_synced: { type: 'string', description: 'ISO timestamp of the last sync with the translation service' },\n  },\n  // TranslationKeyProperties: Translation key.\n  translation_key: {\n    key_path: { type: 'string', description: 'Dot-separated key path (e.g. \"onboarding.welcome.title\")' },\n    source_text: { type: 'string', description: 'Original source-language text' },\n    context_hint: { type: 'string', description: 'Contextual hint for translators' },\n    max_length: { type: 'number', description: 'Maximum character length for the translated string' },\n  },\n  // TrialConfigProperties: Trial configuration.\n  trial_config: {\n    trial_type: { type: 'string', enum: ['time_limited', 'feature_limited', 'usage_limited', 'reverse'], description: 'How the trial is limited' },\n    duration_days: { type: 'number', description: 'Length of the trial period in days' },\n    conversion_rate: { type: 'number', description: 'Percentage of trial users who convert to paid', modifier: 'snapshot' },\n  },\n  // TutorialProperties: Tutorial.\n  tutorial: {\n    tutorial_format: { type: 'string', enum: ['written', 'video', 'interactive', 'code_along'], description: 'Delivery format of the tutorial' },\n    difficulty: { type: 'string', enum: ['beginner', 'intermediate', 'advanced'], description: 'Skill level required to follow the tutorial' },\n    duration_minutes: { type: 'number', description: 'Estimated time to complete in minutes' },\n    completion_rate: { type: 'number', description: 'Percentage of users who complete the tutorial', modifier: 'snapshot' },\n  },\n  // UnitEconomicsProperties: UnitEconomics.\n  unit_economics: {\n    lifetime_value: { type: 'number', description: 'Customer lifetime value' },\n    customer_acquisition_cost: { type: 'number', description: 'Customer acquisition cost' },\n    payback_period_months: { type: 'number', description: 'Months to recover CAC from revenue' },\n    gross_margin: { type: 'number', description: 'Gross margin (0–100)' },\n  },\n  // UserAdvisoryBoardProperties: User advisory board.\n  user_advisory_board: {\n    member_count: { type: 'number', description: 'Number of members on the board', modifier: 'snapshot' },\n    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.' },\n    board_focus: { type: 'string', description: 'Primary topic or area the board advises on' },\n  },\n  // UserFlowProperties: User flow.\n  user_flow: {\n    flow_type: { type: 'string', description: 'What sort of flow this is. Free-form rather than a closed enum, because flow kinds are product-specific and the spec has no complete vocabulary for them. @example \"onboarding\", \"checkout\", \"recovery\", \"upgrade\"', notes: '`user_flow` otherwise carries only structure (`trigger`, `steps`, `success_state`, `failure_state`) and no classification. The retired `onboarding_flow` type collapsed into `user_flow` along this axis, and its migration default stamps the value so the distinction survives.' },\n    flow_order: { type: 'number', description: 'Display order of this flow among sibling flows (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). The free-text `steps` array below still captures the within-flow narrative; this scalar makes the flow itself a deterministically orderable sibling.' },\n    trigger: { type: 'string', description: 'Initiating event' },\n    steps: { type: 'string[]', description: 'Ordered steps' },\n    success_state: { type: 'string', description: 'Successful completion' },\n    failure_state: { type: 'string', description: 'Failed completion' },\n  },\n  // UserJourneyProperties: User journey map.\n  user_journey: {\n    scope: { type: 'string', description: 'Scope (e.g. \"end-to-end onboarding\")' },\n    journey_type: { type: 'string', enum: ['current_state', 'future_state', 'day_in_the_life'], description: 'Maps current or future state' },\n    scenario: { type: 'string', description: 'Scenario context' },\n  },\n  // UserStoryProperties: \"As X, I want Y so Z\" templated promise on a user story (UCS pattern P5).\n  user_story: {\n    as_a: { type: 'string', description: '\"As a [persona], …\". Free-text persona name or slug ref.' },\n    i_want_to: { type: 'string', description: 'Capability or action the persona wants.' },\n    so_that: { type: 'string', description: 'Benefit or outcome the persona expects.' },\n    text: { type: 'string', description: 'Free-form story text. Used as a single-line rendered view.' },\n    assignee: { type: 'string', description: 'Assigned person. Promote to a `node_owned_by_person` edge if ownership must be queryable.' },\n    effort: { type: 'string', description: 'Effort estimate (e.g. \"2h\", \"1d\", \"3 points\"). Use a consistent unit within your team.' },\n    priority: { type: 'string', enum: ['urgent', 'high', 'medium', 'low', 'none'], description: 'Relative importance against other stories. Lifted onto user_story (0.20.0) so the story is a first-class plannable unit alongside task, matching Jira/Linear where the story/issue is the estimated-and-assigned atom.' },\n    due_date: { type: 'string', description: 'ISO date due. Typically bounded by the release or planning_cycle the story is scheduled into.' },\n    workflow_state: { type: 'string', description: 'The source tool\\'s raw custom workflow state, verbatim and opaque (e.g. \"In Review\", \"QA\", \"Needs Triage\"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.' },\n    workflow_state_category: { type: 'string', enum: ['triage', 'backlog', 'unstarted', 'started', 'completed', 'cancelled'], description: 'Canonical bucket the raw `workflow_state` maps onto for reasoning: a source \"In Review\" and a source \"QA\" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.', notes: 'It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source\\'s raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.' },\n  },\n  // ValueObjectProperties: DDD value object.\n  value_object: {\n    immutable: { type: 'boolean', description: 'Whether immutable' },\n    equality_fields: { type: 'string', description: 'Fields used for equality' },\n  },\n  // ValuePropositionProperties: ValueProposition. Most relationships expressed as edges.\n  value_proposition: {\n    validation_state: { type: 'string', enum: ['hypothesis', 'tested', 'validated'], description: 'Validation maturity. Where it sits on the \"is this real?\" journey. Renamed from `confidence` because these values describe validation state, not subjective confidence. Use `Confidence` or `UPGAssessment` from primitives for per-rater confidence.' },\n    offering_type: { type: 'string', enum: ['product', 'service', 'platform', 'experience', 'hybrid'], description: 'Offering shape' },\n    unique_selling_point: { type: 'string', enum: ['category_definition', 'price', 'speed', 'quality', 'integration', 'experience', 'other'], description: 'Differentiation axis. Closed set so dashboards group propositions by differentiation strategy. For the narrative form, use `unique_selling_point_statement`.' },\n    unique_selling_point_statement: { type: 'string', description: 'Narrative differentiator copy. Pairs with `unique_selling_point` for messaging when the team needs the rhetorical sentence.' },\n  },\n  // ValueStreamProperties: ValueStream entity.\n  value_stream: {\n    stream_stage: { type: 'string', enum: ['discovery', 'definition', 'build', 'delivery', 'operation', 'other'], description: 'Current stage in the value delivery pipeline (UPG-579 Option B).' },\n    lead_time: { type: 'string', description: 'End-to-end lead time. @example \"2 weeks\"' },\n    throughput: { type: 'string', description: 'Throughput measure. @example \"5 features/sprint\"' },\n  },\n  // VariantProperties: Variant entity.\n  variant: {\n    variant_name: { type: 'string', description: 'Display name of the experiment variant' },\n    traffic_percentage: { type: 'number', description: 'Percentage of traffic allocated to this variant' },\n    variant_status: { type: 'string', enum: ['active', 'winner', 'loser', 'inactive'], description: 'Outcome status of the variant' },\n  },\n  // VisionProperties: Vision entity.\n  vision: {\n    timeframe: { type: 'string', description: 'Target timeframe. @example \"3 years\"' },\n    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).' },\n    success_looks_like: { type: 'string', description: 'Narrative of what success looks like' },\n  },\n  // VulnerabilityProperties: Vulnerability.\n  vulnerability: {\n    cve_id: { type: 'string', description: 'CVE identifier from the National Vulnerability Database. @example \"CVE-2024-1234\"' },\n    cvss_score: { type: 'number', description: 'CVSS numeric score (0.0–10.0). Computed from the CVSS vector. Distinct from the categorical `severity`. @example 9.8 (critical), 6.5 (medium), 3.7 (low)' },\n    severity: {\n      type: 'assessment', scale_id: 'severity_5', description: 'Categorical severity derived from CVSS, as a UPGAssessment on the `severity_5` scale. Score alone is insufficient for triage: severity is what drives filtering and prioritisation. @example value 5, label \\'Critical\\', scale_id \\'severity_5\\' (a remotely exploitable, no-auth vuln)', notes: 'Migrated from the inline `critical|high|medium|low|informational` enum (UPG-579 Option C): map `critical` to 5, `high` to 4, `medium` to 3, `low` to 2, `informational` to 1, carrying the old word in `label` so the original vocabulary survives the move.',\n      properties: {\n        value: { type: 'number', description: 'The numeric value, used for computation.' },\n        label: { type: 'string', description: 'The qualitative label (what the assessor meant).' },\n        scale_id: { type: 'string', description: 'Which assessment scale this was rated on (optional).' },\n        normalized: { type: 'number', description: 'Normalized 0-1 value for cross-tool comparison (optional).' },\n      },\n      required: ['value', 'label'],\n    },\n    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' },\n    affected_component: { type: 'string', description: 'Affected component, library, or system. @example \"lodash\", \"openssl\", \"login service\"' },\n    exploit_maturity: { type: 'string', enum: ['no_known_exploit', 'proof_of_concept', 'functional_exploit', 'active_exploitation'], description: 'Exploit maturity. Primary prioritisation factor after severity. `no_known_exploit` = theoretical. `proof_of_concept` = exploit code exists, not weaponised. `functional_exploit` = working exploit available. `active_exploitation` = active in the wild. @example \"active_exploitation\" demands immediate response regardless of severity score' },\n    fix_available: { type: 'boolean', description: 'Patch availability. Common triage question after severity. @example false for a zero-day with no available patch' },\n    disclosed_at: { type: 'string', description: 'ISO date publicly disclosed. Time since disclosure matters for SLA. @example \"2024-03-15\"' },\n    discovered_at: { type: 'string', description: 'ISO date discovered in this system. @example \"2026-04-01\"' },\n    remediated_at: { type: 'string', description: 'ISO date resolved or accepted. Closes the remediation timeline. @example \"2026-04-10\"' },\n  },\n  // WalkthroughProperties: Product walkthrough.\n  walkthrough: {\n    walkthrough_type: { type: 'string', enum: ['product_tour', 'feature_intro', 'tooltip_sequence', 'checklist'], description: 'Format of the in-product walkthrough' },\n    step_count: { type: 'number', description: 'Number of steps in the walkthrough', modifier: 'derived' },\n    trigger: { type: 'string', description: 'User action or event that starts the walkthrough' },\n    completion_rate: { type: 'number', description: 'Percentage of users who complete the walkthrough', modifier: 'snapshot' },\n  },\n  // WebinarProperties: Webinar.\n  webinar: {\n    webinar_type: { type: 'string', enum: ['live', 'recorded', 'hybrid'], description: 'Delivery format of the webinar' },\n    scheduled_date: { type: 'string', description: 'Date the webinar is scheduled (ISO format)' },\n    duration_minutes: { type: 'number', description: 'Duration of the webinar in minutes' },\n    registrations: { type: 'number', description: 'Number of people who registered' },\n    attendance: { type: 'number', description: 'Number of people who attended' },\n  },\n  // WireframeProperties: Wireframe.\n  wireframe: {\n    fidelity: { type: 'string', enum: ['low', 'medium', 'high'], description: 'Detail level' },\n    version: { type: 'string', description: 'Version or iteration (e.g. \"v2\", \"2026-04-B\")' },\n    tool: { type: 'string', description: 'Authoring tool. @example \"Figma\", \"Balsamiq\", \"pen and paper\"' },\n    review_status: { type: 'string', enum: ['draft', 'in_review', 'approved', 'rejected'], description: 'Review gate status' },\n    linked_prototype_url: { type: 'string', description: 'URL of the corresponding interactive prototype', modifier: 'volatile' },\n  },\n  // WorkflowArtifactProperties: Workflow artifact.\n  workflow_artifact: {\n    artifact_type: { type: 'string', enum: ['document', 'code', 'data', 'report', 'other'], description: 'Kind of output produced by the workflow' },\n    artifact_url: { type: 'string', description: 'URL or path to the artifact' },\n    produced_at: { type: 'string', description: 'ISO timestamp when the artifact was produced' },\n  },\n  // WorkflowRunProperties: Workflow run.\n  workflow_run: {\n    started_at: { type: 'string', description: 'ISO timestamp when the run started' },\n    completed_at: { type: 'string', description: 'ISO timestamp when the run completed' },\n    run_status: { type: 'string', enum: ['pending', 'running', 'completed', 'failed', 'canceled'], description: 'Current execution status of the run' },\n    triggering_event: { type: 'string', description: 'Event or action that triggered this run' },\n    step_count: { type: 'number', description: 'Number of steps executed in this run', modifier: 'derived' },\n    total_tokens: { type: 'number', description: 'Total tokens consumed across all steps' },\n    total_cost: { type: 'number', description: 'Total monetary cost of the run' },\n    error_message: { type: 'string', description: 'Error message if the run failed' },\n  },\n  // WorkflowTemplateProperties: Workflow template.\n  workflow_template: {\n    template_type: { type: 'string', enum: ['sequential', 'parallel', 'conditional', 'loop'], description: 'Execution pattern for the workflow steps' },\n    step_count: { type: 'number', description: 'Number of steps in the workflow', modifier: 'derived' },\n    agent_count: { type: 'number', description: 'Number of agents involved in the workflow', modifier: 'derived' },\n    estimated_duration: { type: 'string', description: 'Estimated wall-clock duration of a full run' },\n    state_schema: { type: 'string', description: 'Schema describing the workflow\\'s state object' },\n    checkpoint_enabled: { type: 'boolean', description: 'Whether the workflow supports checkpointing for recovery' },\n    human_in_loop: { type: 'boolean', description: 'Whether a human approval step is required' },\n    version: { type: 'string', description: 'Version label for this workflow template (e.g. \"2.1\")' },\n  },\n  // WorkspaceProperties: Workspace: a spatial thinking space for arranging entities.\n  workspace: {\n    member_query: { type: 'object', description: 'When present, membership is DERIVED: members are produced by running this query rather than authored by placement. The clause list is authoritative and the named fields are a positive-only projection of it; since 0.34.0 a clause is a discriminated union on `dimension`, so the `type` axis carries entity types rather than free strings.', notes: 'This is the portable statement of what the layer shows. On a composition, `CompositionMember.href` remains the publishing tool\\'s own resolved route and stays opaque to everyone else; a member may carry both, and then the href is a fast path while the query is the meaning. A consumer that cannot parse the href can still render the layer, which is the whole reason the declaration is here rather than in a tool-namespaced bag key. A layer with no `member_query` is authored, which is what every composition written before 0.32.0 is. DECLARED ON BOTH HALVES OF THE PAIR since 0.33.0. A layer is query-driven while it is being worked on, not only once it is published, so declaring the query only on the durable composition would make it a fact invented at publish time rather than one recorded.' },\n    presentation: { type: 'object', description: 'Advisory rendering intent for the layer as a whole: `group_by`, `sort`, `layout`, `nest_by`, and `orphan_disposition` (0.34.0, absent means `\\'root\\'`). A consumer may ignore it entirely and still be conformant, because every default it then applies is the safe one.', notes: 'THE DESCRIPTION LISTS THE FIELDS ON PURPOSE. This property is `object` in the runtime property registry, so an agent reading `get_entity_schema` gets an opaque blob and this sentence. For an object-typed property the description IS the declared shape, which is why `check:editorial` hashes it (E.4, 0.34.0) and why a field added to `UPGViewPresentation` without a word here would be invisible to every gate and every agent at once.' },\n    visibility: { type: 'string', enum: ['private', 'shared', 'public'], description: 'Who can see this workspace' },\n    purpose: { type: 'string', description: 'Free-text description. Pairs with the closed-enum `workspace_purpose`.' },\n    workspace_purpose: { type: 'string', enum: ['discovery', 'planning', 'retrospective', 'design', 'research', 'strategy', 'general'], description: 'What the workspace is for. Drives template suggestions and surfaces in workspace browsers.', notes: '`discovery` is persona, job and opportunity exploration. `planning` covers roadmap and decision sessions. `retrospective` is reflection on shipped work. `design` is experience or UI exploration. `research` organises study data and synthesis. `strategy` is high-level direction setting. `general` is the catch-all.' },\n    owner: { type: 'string', description: 'Workspace owner (handle or email). Display label; canonical owner is `team_owns_workspace` or `persona_owns_workspace`.' },\n    member_count: { type: 'number', description: 'Snapshot count. `team_works_in_workspace` edges are the source of truth.', modifier: 'derived' },\n    archived: { type: 'boolean', description: 'Archived. Archived workspaces remain queryable but hidden from default views. @deprecated since 0.32.0. Use `UPGBaseNode.archived`, which generalises this pair to every entity type. Field data showed the archived/status split is not a workspace peculiarity: a tracker held 559 archived-completed items beside 18 live-completed ones, and one status field has nowhere to put the difference. `UPG_PROPERTY_MIGRATIONS[\\'0.32.0\\']` lifts this value to the top level.' },\n    archived_at: { type: 'string', description: 'ISO timestamp archived. Pairs with `archived === true`. @deprecated since 0.32.0. Use `UPGBaseNode.archived_at`. Lifted by `UPG_PROPERTY_MIGRATIONS[\\'0.32.0\\']`.' },\n    icon: { type: 'string', description: 'Display icon (emoji or icon name)' },\n    retention: { type: 'string', enum: ['transient', 'durable'], description: 'Retention intent. Absent means `transient`.', notes: 'A workspace is a free-form thinking space and is transient by default, so the spec makes both intents EXPRESSIBLE and takes no position on which reaches the file. Whether to write a transient canvas at all is a tool decision, and the recommended posture is not to: a scratch canvas nobody named has no business in a shared, git-tracked graph, where it lands in everyone\\'s diff. Writing only `durable` workspaces is what keeps a canonical graph entity comfortable with a transient-by-default object.' },\n    canvas: { type: 'object', description: 'Opaque canvas furniture: the parts of a canvas with no graph referent. Preserved verbatim on round-trip and never interpreted. Tool extension keys are namespaced `<tool>:<key>` with a colon (the rule since 0.31.0), and no consumer interprets a key it does not own.', notes: 'The cut here is UPG principle P14 applied literally. Anything that is a REFERENCE TO A GRAPH NODE is an edge, which is why placed entities ride `workspace_arranges_node` and not this bag: a node id held as a scalar inside a blob is a foreign key in disguise, and a deleted node would leave a stale reference nothing can detect. Anything that is pure UI chrome with no graph referent stays here, because minting `annotation` and `frame` entity types would add catalog surface that is meaningless to every consumer outside the tool that drew it. WHY THE COLON, and why the rule is in the summary rather than buried here. An underscore key is indistinguishable from an ordinary property name, so a migration that targets namespaced keys cannot match it and no validator can detect one that should have been namespaced. That undetectability is why enforcement lives in the type and the documentation instead of in a check: a check would report clean on a bag full of underscore keys, which is worse than no check. Two conventions were already coexisting when this was ruled (`entopo_views` in a live writer, `entopo:view_blocks` in the contract test certifying preservation), which is how a cheap rule becomes a migration. PRESERVATION IS NOT PERMISSION TO RENDER. Preserving every byte says nothing about meaning: a field-measured canvas carried `excluded: true` tombstones, and a consumer that preserved them faithfully while rendering every entry showed the user images they had deleted.' },\n  },\n}\n\n/**\n * Get the property schema for an entity type.\n * Returns undefined if the type has no typed properties.\n */\nexport function getPropertySchema(entityType: string): PropertySchema | undefined {\n  return UPG_PROPERTY_SCHEMA[entityType]\n}\n","/**\n * Canonical Framework Library: v1 public surface.\n *\n * The famous, battle-tested product frameworks that anchor the public\n * Unified Product Graph framework catalog. Curated for editorial confidence\n * over breadth: every name here is universally recognised and actively\n * taught in product education.\n *\n * The fuller research catalog (~182 additional definitions) lives in the\n * `definitions/` directory and is promoted into this canonical set\n * incrementally as each framework is reviewed and validated.\n *\n * THIS FILE IS GENERATED. See scripts/regen-canonical-frameworks.ts.\n */\n\nimport type { UPGFramework } from './types.js'\n\nexport const UPG_FRAMEWORKS: UPGFramework[] = [\n  {\n    \"id\": \"opportunity-sizing\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"Opportunity Sizing\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Size opportunities by Reach, Frequency, and Pain to rank which problems are most worth solving before committing to solutions.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Continuous discovery practice\",\n      \"description\": \"A lightweight discovery-prioritisation method: weigh how many users hit a problem, how often, and how much it hurts, to rank opportunities before investing in solutions.\",\n      \"url\": \"https://www.producttalk.org/2016/08/opportunity-solution-tree/\",\n      \"year\": 2016,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"discovery\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Opportunities to size\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"Opportunities scored on Reach, Frequency, and Pain.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"opportunity\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users experience this problem?\"\n          },\n          {\n            \"property\": \"frequency\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"frequency_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Frequency\",\n            \"description\": \"How often do they run into it?\"\n          },\n          {\n            \"property\": \"pain\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"pain_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Pain\",\n            \"description\": \"How painful is it when left unaddressed?\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"opportunity_score\",\n          \"expression\": \"reach * frequency * pain\",\n          \"entity_type\": \"opportunity\",\n          \"label\": \"Opportunity Score\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"opportunity\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users experience this problem?\"\n          },\n          {\n            \"property\": \"frequency\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"frequency_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Frequency\",\n            \"description\": \"How often do they run into it?\"\n          },\n          {\n            \"property\": \"pain\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"pain_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Pain\",\n            \"description\": \"How painful is it when left unaddressed?\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"opportunity_score\",\n            \"expression\": \"reach * frequency * pain\",\n            \"label\": \"Opportunity Score\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Opportunities to size\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"reach\",\n            \"label\": \"Reach\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"frequency\",\n            \"label\": \"Frequency\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"pain\",\n            \"label\": \"Pain\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"opportunity_score\",\n            \"label\": \"Opportunity Score\",\n            \"sortable\": true,\n            \"format\": \"score_pill\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"opportunity_score\",\n        \"direction\": \"desc\"\n      },\n      \"colour_by\": \"score\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Rank opportunities by how widely, how often, and how painfully a problem is felt, so discovery effort flows to the problems most worth solving.\",\n      \"core_question\": \"Of the problems we could pursue, which affect the most users, most often, with the most pain?\",\n      \"when_to_use\": [\n        \"You have more opportunities than you can pursue\",\n        \"You need to compare problems before committing to solutions\",\n        \"You want a defensible, transparent way to choose what to explore\"\n      ],\n      \"when_not_to_use\": [\n        \"A single opportunity is already validated and obvious\",\n        \"You have no signal yet on reach, frequency, or pain\"\n      ]\n    }\n  },\n  {\n    \"id\": \"opportunity-solution-tree\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Opportunity Solution Tree\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Map desired outcomes to opportunities, then branch into solutions and experiments. Ensures every solution traces back to a real user need.\",\n    \"category\": \"discovery\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Teresa Torres\",\n      \"description\": \"Introduced in Continuous Discovery Habits. Maps outcomes to opportunities, solutions, and experiments.\",\n      \"url\": \"https://www.producttalk.org/opportunity-solution-tree/\",\n      \"year\": 2021,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"discovery\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Root Outcome\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"The desired business or user outcome\"\n      },\n      {\n        \"label\": \"Opportunities\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"User needs, pain points, or desires\"\n      },\n      {\n        \"label\": \"Solutions\",\n        \"entityTypeId\": \"solution\",\n        \"description\": \"Ideas to address each opportunity\"\n      },\n      {\n        \"label\": \"Experiments\",\n        \"entityTypeId\": \"experiment_run\",\n        \"description\": \"Tests to validate each solution\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"outcome\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"solution\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"experiment_run\",\n          \"role\": \"leaf\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Connect a desired outcome to the opportunities and solutions that could drive it, making the reasoning chain from goal to feature explicit and testable.\",\n      \"core_question\": \"What opportunities exist under our target outcome, and which solutions best address them?\",\n      \"when_to_use\": [\n        \"You need to understand unmet user needs before committing to solutions\",\n        \"The problem space is ambiguous and requires structured exploration\",\n        \"You want to reduce the risk of building the wrong thing\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is well-understood and validated\",\n        \"You are in a delivery phase with clear requirements\"\n      ]\n    }\n  },\n  {\n    \"id\": \"story-map\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Story Map\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Arrange user activities across the top, then prioritise user stories vertically under each activity. Horizontal = breadth, vertical = depth.\",\n    \"category\": \"discovery\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Jeff Patton\",\n      \"description\": \"Published in User Story Mapping (O'Reilly). Organises stories by user activities to reveal the whole product.\",\n      \"url\": \"https://www.jpattonassociates.com/user-story-mapping/\",\n      \"year\": 2014,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"discovery\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"User Activities\",\n        \"entityTypeId\": \"job\",\n        \"description\": \"High-level tasks users perform (horizontal axis)\"\n      },\n      {\n        \"label\": \"Epics\",\n        \"entityTypeId\": \"epic\",\n        \"description\": \"Groups of stories under each activity\"\n      },\n      {\n        \"label\": \"User Stories\",\n        \"entityTypeId\": \"user_story\",\n        \"description\": \"Detailed stories prioritised vertically\"\n      },\n      {\n        \"label\": \"Release Slices\",\n        \"entityTypeId\": \"release\",\n        \"description\": \"Horizontal cuts defining MVP and iterations\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"job\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"epic\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"user_story\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"release\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Arrange user stories along the narrative flow of the user journey, creating a two-dimensional backlog that shows both breadth and depth of functionality.\",\n      \"core_question\": \"What is the complete user journey, and which stories form the minimum walking skeleton versus later enhancements?\",\n      \"when_to_use\": [\n        \"You need to understand unmet user needs before committing to solutions\",\n        \"The problem space is ambiguous and requires structured exploration\",\n        \"You want to reduce the risk of building the wrong thing\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is well-understood and validated\",\n        \"You are in a delivery phase with clear requirements\"\n      ]\n    }\n  },\n  {\n    \"id\": \"value-proposition-canvas\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Value Proposition Canvas\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Map customer jobs, pains, and gains on one side, then align product features, pain relievers, and gain creators on the other to achieve product-market fit.\",\n    \"category\": \"discovery\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Osterwalder\",\n      \"description\": \"Value Proposition Design\",\n      \"url\": \"https://en.wikipedia.org/wiki/Value_proposition_canvas\",\n      \"year\": 2014,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"discovery\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Customer Jobs\",\n        \"role\": \"customer_job\",\n        \"entityTypeId\": \"job\",\n        \"description\": \"Place job entities in the Customer Jobs position of the matrix\"\n      },\n      {\n        \"label\": \"Pains\",\n        \"role\": \"pain\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Place need entities in the Pains position of the matrix\"\n      },\n      {\n        \"label\": \"Gains\",\n        \"role\": \"gain\",\n        \"entityTypeId\": \"desired_outcome\",\n        \"description\": \"Place desired outcome entities in the Gains position of the matrix\"\n      },\n      {\n        \"label\": \"Products & Services\",\n        \"role\": \"product_or_service\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Place feature entities in the Products & Services position of the matrix\"\n      },\n      {\n        \"label\": \"Pain Relievers\",\n        \"role\": \"pain_reliever\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Place feature entities in the Pain Relievers position of the matrix\"\n      },\n      {\n        \"label\": \"Gain Creators\",\n        \"role\": \"gain_creator\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Place feature entities in the Gain Creators position of the matrix\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"job\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"desired_outcome\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"feature\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 3\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Zoom into one customer segment. Map their jobs, pains, and gains against your value proposition's products, pain relievers, and gain creators. Product-market fit by design.\",\n      \"core_question\": \"Does our value proposition address the jobs, pains, and gains that matter most to this customer segment?\",\n      \"when_to_use\": [\n        \"You need to understand unmet user needs before committing to solutions\",\n        \"The problem space is ambiguous and requires structured exploration\",\n        \"You want to reduce the risk of building the wrong thing\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is well-understood and validated\",\n        \"You are in a delivery phase with clear requirements\"\n      ]\n    }\n  },\n  {\n    \"id\": \"persona-canvas\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Persona Canvas\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Demographics, goals, frustrations, JTBD: a structured template for creating research-backed personas.\",\n    \"category\": \"user_understanding\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Alan Cooper\",\n      \"description\": \"Based on Alan Cooper's persona methodology from \\\"The Inmates Are Running the Asylum\\\" (1999). The canvas format structures persona creation around goals, behaviours, frustrations, and context.\",\n      \"url\": \"https://www.cooper.com/journal/2001/08/perfecting_your_personas\",\n      \"year\": 1999,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"user_understanding\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Demographics\",\n        \"entityTypeId\": \"persona\",\n        \"description\": \"Place persona entities in the Demographics position of the matrix\"\n      },\n      {\n        \"label\": \"Goals\",\n        \"entityTypeId\": \"desired_outcome\",\n        \"description\": \"Place job entities in the Goals position of the matrix\"\n      },\n      {\n        \"label\": \"Frustrations\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Place need entities in the Frustrations position of the matrix\"\n      },\n      {\n        \"label\": \"Behaviours\",\n        \"entityTypeId\": \"observation\",\n        \"description\": \"Place desired outcome entities in the Behaviours position of the matrix\"\n      },\n      {\n        \"label\": \"Jobs to Be Done\",\n        \"entityTypeId\": \"job\",\n        \"description\": \"Place quote entities in the Jobs to Be Done position of the matrix\"\n      },\n      {\n        \"label\": \"Quotes\",\n        \"entityTypeId\": \"quote\",\n        \"description\": \"Place observation entities in the Quotes position of the matrix\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"persona\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"job\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"desired_outcome\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"quote\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"observation\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 3\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Define a user archetype's goals, behaviours, frustrations, and context on a structured canvas so every team member designs for the same person instead of an abstract \\\"user\\\".\",\n      \"core_question\": \"Who specifically are we building for? What are their goals, frustrations, and the context in which they use our product?\",\n      \"when_to_use\": [\n        \"You need to build empathy for your users across the team\",\n        \"Product decisions require deeper understanding of user context\",\n        \"You want to segment users in meaningful ways beyond demographics\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single, well-understood user persona\",\n        \"The product serves a narrow, homogeneous audience\"\n      ]\n    }\n  },\n  {\n    \"id\": \"empathy-map\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Empathy Map\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Visualise what a user says, thinks, does, and feels to build deeper empathy and uncover hidden needs.\",\n    \"category\": \"research\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Dave Gray (XPLANE)\",\n      \"description\": \"Created by Dave Gray at XPLANE. Originally a design thinking exercise, now standard in product discovery.\",\n      \"url\": \"https://gamestorming.com/empathy-mapping/\",\n      \"year\": 2010,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"research\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Says\",\n        \"entityTypeId\": \"quote\",\n        \"description\": \"Direct quotes from user interviews\"\n      },\n      {\n        \"label\": \"Thinks\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"What the user is thinking but may not say\"\n      },\n      {\n        \"label\": \"Does\",\n        \"entityTypeId\": \"job\",\n        \"description\": \"Observable actions and behaviours\"\n      },\n      {\n        \"label\": \"Feels\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Emotions, frustrations, and anxieties\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"job\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"quote\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Synthesise research observations into what a user says, thinks, does, and feels. Build a shared mental model of the user that goes beyond demographics.\",\n      \"core_question\": \"What does this user truly think and feel versus what they say and do? What do the gaps reveal?\",\n      \"when_to_use\": [\n        \"You need to synthesise findings from multiple research activities\",\n        \"Research insights are scattered and not accessible to the team\",\n        \"You want to build a shared understanding of what you have learned\"\n      ],\n      \"when_not_to_use\": [\n        \"You have not yet conducted enough research to synthesise\",\n        \"The team prefers to act on intuition rather than evidence\"\n      ]\n    }\n  },\n  {\n    \"id\": \"wardley-map\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Wardley Map\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Map your value chain on axes of visibility (to user) and evolution (genesis → custom → product → commodity). Reveals strategic moves.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Simon Wardley\",\n      \"description\": \"Developed by Simon Wardley. A situational awareness tool for strategy based on value chain evolution.\",\n      \"url\": \"https://learnwardleymapping.com/\",\n      \"year\": 2005,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"quadrant\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"User Need\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"The anchor: what the user actually needs\"\n      },\n      {\n        \"label\": \"Value Chain\",\n        \"entityTypeId\": \"capability\",\n        \"description\": \"Components that fulfill the user need\"\n      },\n      {\n        \"label\": \"Evolution Stage\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Where each component sits on the evolution axis\"\n      },\n      {\n        \"label\": \"Movement\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"How components are evolving over time\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"capability\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"feature\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"competitor\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"capability\": [\n          {\n            \"property\": \"evolution_stage\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Evolution Stage\",\n            \"description\": \"Where this component sits on the evolution axis\",\n            \"enum_values\": [\n              \"genesis\",\n              \"custom\",\n              \"product\",\n              \"commodity\"\n            ]\n          },\n          {\n            \"property\": \"visibility\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Visibility\",\n            \"description\": \"Y-axis position (0=infrastructure, 1=anchor/user)\"\n          }\n        ],\n        \"feature\": [\n          {\n            \"property\": \"evolution_stage\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Evolution Stage\",\n            \"description\": \"Where this component sits on the evolution axis\",\n            \"enum_values\": [\n              \"genesis\",\n              \"custom\",\n              \"product\",\n              \"commodity\"\n            ]\n          },\n          {\n            \"property\": \"visibility\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Visibility\",\n            \"description\": \"Y-axis position (0=infrastructure, 1=anchor/user)\"\n          }\n        ],\n        \"competitor\": [\n          {\n            \"property\": \"evolution_stage\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Evolution Stage\",\n            \"description\": \"Where this component sits on the evolution axis\",\n            \"enum_values\": [\n              \"genesis\",\n              \"custom\",\n              \"product\",\n              \"commodity\"\n            ]\n          },\n          {\n            \"property\": \"visibility\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Visibility\",\n            \"description\": \"Y-axis position (0=infrastructure, 1=anchor/user)\"\n          }\n        ],\n        \"need\": [\n          {\n            \"property\": \"evolution_stage\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Evolution Stage\",\n            \"description\": \"Where this component sits on the evolution axis (need anchor is usually at \\\"product\\\" or \\\"commodity\\\")\",\n            \"enum_values\": [\n              \"genesis\",\n              \"custom\",\n              \"product\",\n              \"commodity\"\n            ]\n          },\n          {\n            \"property\": \"visibility\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Visibility\",\n            \"description\": \"Y-axis position (0=infrastructure, 1=anchor/user); needs sit at 1.0\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"quadrant\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"quadrant\",\n        \"x_axis\": \"evolution_stage\",\n        \"y_axis\": \"visibility\",\n        \"x_label\": \"Evolution (Genesis → Commodity)\",\n        \"y_label\": \"Visibility (Invisible → Anchor)\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Visualise the value chain from user need to underlying components, positioning each by evolution stage to reveal strategic moves competitors cannot see.\",\n      \"core_question\": \"Where is each component in our value chain on the evolution axis, and what strategic moves does that positioning reveal?\",\n      \"when_to_use\": [\n        \"You need to align the team on long-term direction\",\n        \"Market conditions are shifting and you need to reassess positioning\",\n        \"Leadership needs a structured view of strategic options\"\n      ],\n      \"when_not_to_use\": [\n        \"You are in pure execution mode with a clear strategy already set\",\n        \"The team is too early-stage to commit to strategic constraints\"\n      ]\n    }\n  },\n  {\n    \"id\": \"business-model-canvas\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Business Model Canvas\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Nine building blocks that describe how an organisation creates, delivers, and captures value.\",\n    \"category\": \"business_model\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Alexander Osterwalder & Yves Pigneur\",\n      \"description\": \"Published in Business Model Generation (Wiley). The most widely used business model framework in the world.\",\n      \"url\": \"https://www.strategyzer.com/business-model-canvas\",\n      \"year\": 2010,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"business_model\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Key Partners\",\n        \"entityTypeId\": \"partnership\",\n        \"description\": \"Who are your key partners and suppliers?\"\n      },\n      {\n        \"label\": \"Key Activities\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"What key activities does your value prop require?\"\n      },\n      {\n        \"label\": \"Value Propositions\",\n        \"entityTypeId\": \"value_proposition\",\n        \"description\": \"What value do you deliver to the customer?\"\n      },\n      {\n        \"label\": \"Customer Relationships\",\n        \"entityTypeId\": \"customer_relationship\",\n        \"description\": \"What type of relationship does each segment expect?\"\n      },\n      {\n        \"label\": \"Customer Segments\",\n        \"entityTypeId\": \"market_segment\",\n        \"description\": \"For whom are you creating value?\"\n      },\n      {\n        \"label\": \"Key Resources\",\n        \"entityTypeId\": \"key_resource\",\n        \"description\": \"What key resources does your value prop require?\"\n      },\n      {\n        \"label\": \"Channels\",\n        \"entityTypeId\": \"distribution_channel\",\n        \"description\": \"How do you reach your customer segments?\"\n      },\n      {\n        \"label\": \"Cost Structure\",\n        \"entityTypeId\": \"cost_structure\",\n        \"description\": \"What are the most important costs?\"\n      },\n      {\n        \"label\": \"Revenue Streams\",\n        \"entityTypeId\": \"revenue_stream\",\n        \"description\": \"For what value are customers willing to pay?\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"partnership\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"key_activity\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"value_proposition\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"customer_relationship\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"key_resource\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"distribution_channel\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"cost_structure\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"revenue_stream\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"market_segment\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 3,\n        \"cols\": 3\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Map all nine building blocks of a business model so teams see how value creation, delivery, and capture connect end-to-end.\",\n      \"core_question\": \"How does our organisation create, deliver, and capture value, and where are the dependencies between those activities?\",\n      \"when_to_use\": [\n        \"You are designing or redesigning how the business creates and captures value\",\n        \"You need to communicate the business model to stakeholders or investors\",\n        \"You want to identify risks and assumptions in your business model\"\n      ],\n      \"when_not_to_use\": [\n        \"The business model is mature and well-understood by all stakeholders\",\n        \"You are focused on tactical execution rather than model design\"\n      ]\n    }\n  },\n  {\n    \"id\": \"lean-canvas\",\n    \"name\": \"Lean Canvas\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Startup-focused adaptation of the BMC. Replaces partners/resources with problem/solution/unfair advantage.\",\n    \"category\": \"business_model\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Ash Maurya\",\n      \"description\": \"Adapted from BMC for startups. Published in Running Lean (O'Reilly). Replaces partners/resources with problem/solution.\",\n      \"url\": \"https://leanstack.com/lean-canvas\",\n      \"year\": 2012,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"business_model\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Problem\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Top 3 problems your customers face\"\n      },\n      {\n        \"label\": \"Solution\",\n        \"entityTypeId\": \"solution\",\n        \"description\": \"Top 3 features addressing each problem\"\n      },\n      {\n        \"label\": \"Key Metrics\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Key numbers that tell you how your business is doing\"\n      },\n      {\n        \"label\": \"Unique Value Prop\",\n        \"entityTypeId\": \"value_proposition\",\n        \"description\": \"Single, clear, compelling message\"\n      },\n      {\n        \"label\": \"Unfair Advantage\",\n        \"entityTypeId\": \"capability\",\n        \"description\": \"Something that cannot be easily copied\"\n      },\n      {\n        \"label\": \"Channels\",\n        \"entityTypeId\": \"acquisition_channel\",\n        \"description\": \"Path to customers\"\n      },\n      {\n        \"label\": \"Customer Segments\",\n        \"entityTypeId\": \"persona\",\n        \"description\": \"Target customers\"\n      },\n      {\n        \"label\": \"Existing Alternatives\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"What do customers use today?\"\n      },\n      {\n        \"label\": \"Early Adopters\",\n        \"entityTypeId\": \"behavioral_segment\",\n        \"description\": \"Your first target customers\"\n      },\n      {\n        \"label\": \"Cost Structure\",\n        \"entityTypeId\": \"cost_structure\",\n        \"description\": \"Customer acquisition costs, hosting, etc.\"\n      },\n      {\n        \"label\": \"Revenue Streams\",\n        \"entityTypeId\": \"revenue_stream\",\n        \"description\": \"Revenue model, lifetime value, margins\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"solution\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"value_proposition\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"competitor\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"persona\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"behavioral_segment\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"acquisition_channel\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"cost_structure\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"revenue_stream\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"capability\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 3,\n        \"cols\": 4\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Capture an entire business model hypothesis on a single page so founders can test assumptions rapidly without writing a full business plan.\",\n      \"core_question\": \"What are the riskiest assumptions in our business model, and how can we test them quickly?\",\n      \"when_to_use\": [\n        \"You are designing or redesigning how the business creates and captures value\",\n        \"You need to communicate the business model to stakeholders or investors\",\n        \"You want to identify risks and assumptions in your business model\"\n      ],\n      \"when_not_to_use\": [\n        \"The business model is mature and well-understood by all stakeholders\",\n        \"You are focused on tactical execution rather than model design\"\n      ]\n    }\n  },\n  {\n    \"id\": \"competitive-landscape\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"Competitive Landscape\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Survey the whole competitive environment on one surface: who competes, what they ship, where the market is moving, and how you are positioned within it.\",\n    \"category\": \"competitive\",\n    \"origin\": {\n      \"type\": \"custom\",\n      \"attribution\": \"The Product Creator\",\n      \"description\": \"Original to the Unified Product Graph. Where competitor-profile studies one rival in depth, the landscape holds the market-level view: the competitor set, their features, the trends acting on all of them, and your own positioning read against the whole. Assembled from four entity types the catalog already models rather than adapted from a published methodology.\",\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"competitive\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Competitors\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"The rivals in the market you are surveying\"\n      },\n      {\n        \"label\": \"Competitor Features\",\n        \"entityTypeId\": \"competitor_feature\",\n        \"description\": \"What those competitors actually ship\"\n      },\n      {\n        \"label\": \"Market Trends\",\n        \"entityTypeId\": \"market_trend\",\n        \"description\": \"Forces acting on the whole market, not on one rival\"\n      },\n      {\n        \"label\": \"Positioning\",\n        \"entityTypeId\": \"positioning\",\n        \"description\": \"Where you stand relative to the field\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"competitor\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"competitor_feature\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"market_trend\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"positioning\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Hold the market-level competitive picture in one place: the field of rivals, what they ship, the trends moving the whole category, and your own position read against all three.\",\n      \"core_question\": \"What does the field look like from above, and where do we sit in it?\",\n      \"when_to_use\": [\n        \"You need the shape of a whole market before choosing which rival to study in depth\",\n        \"Trends are moving the category and you need them beside the competitor set, not in a separate document\",\n        \"A positioning statement needs the competitive evidence sitting next to it\"\n      ],\n      \"when_not_to_use\": [\n        \"You already know which single rival matters and want depth on them: use competitor-profile\",\n        \"You are comparing capabilities feature-by-feature against named rivals: use competitive-matrix\",\n        \"You need to place rivals positionally on two scored axes: use positioning-map\"\n      ]\n    }\n  },\n  {\n    \"id\": \"porter-five-forces\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"Porter Five Forces\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Analyse industry competitiveness through five forces: rivalry, new entrants, substitutes, buyer power, and supplier power.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Michael Porter\",\n      \"description\": \"Published in Competitive Strategy (Free Press). The foundational framework for industry analysis.\",\n      \"year\": 1979,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Competitive Rivalry\",\n        \"role\": \"competitive_rivalry\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"Intensity of competition among existing players\"\n      },\n      {\n        \"label\": \"Threat of New Entrants\",\n        \"role\": \"new_entrants\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"How easy is it for new competitors to enter?\"\n      },\n      {\n        \"label\": \"Threat of Substitutes\",\n        \"role\": \"substitutes\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"Can customers switch to alternatives?\"\n      },\n      {\n        \"label\": \"Buyer Power\",\n        \"role\": \"buyer_power\",\n        \"entityTypeId\": \"persona\",\n        \"description\": \"How much leverage do buyers have?\"\n      },\n      {\n        \"label\": \"Supplier Power\",\n        \"role\": \"supplier_power\",\n        \"entityTypeId\": \"persona\",\n        \"description\": \"How much leverage do suppliers have?\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"competitor\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"persona\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Analyse the competitive dynamics of an industry through five structural forces that determine profitability, revealing where power lies and where threats emerge.\",\n      \"core_question\": \"What structural forces shape competition in our industry, and how do they affect our ability to capture value?\",\n      \"when_to_use\": [\n        \"You need to align the team on long-term direction\",\n        \"Market conditions are shifting and you need to reassess positioning\",\n        \"Leadership needs a structured view of strategic options\"\n      ],\n      \"when_not_to_use\": [\n        \"You are in pure execution mode with a clear strategy already set\",\n        \"The team is too early-stage to commit to strategic constraints\"\n      ]\n    }\n  },\n  {\n    \"id\": \"swot-analysis\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"SWOT Analysis\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Map Strengths, Weaknesses, Opportunities, and Threats in a 2x2 grid. Internal vs external, helpful vs harmful.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Widely attributed to Albert Humphrey at Stanford Research Institute. One of the most commonly used strategy frameworks.\",\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Strengths\",\n        \"entityTypeId\": \"capability\",\n        \"description\": \"Internal advantages and core competencies\"\n      },\n      {\n        \"label\": \"Weaknesses\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Internal limitations and gaps\"\n      },\n      {\n        \"label\": \"Opportunities\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"External trends and openings\"\n      },\n      {\n        \"label\": \"Threats\",\n        \"entityTypeId\": \"competitor\",\n        \"description\": \"External risks and competitive pressures\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"capability\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"competitor\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Map internal strengths and weaknesses against external opportunities and threats so teams can align strategy with reality.\",\n      \"core_question\": \"What are our strongest advantages, biggest vulnerabilities, untapped opportunities, and most serious threats?\",\n      \"when_to_use\": [\n        \"You need to align the team on long-term direction\",\n        \"Market conditions are shifting and you need to reassess positioning\",\n        \"Leadership needs a structured view of strategic options\"\n      ],\n      \"when_not_to_use\": [\n        \"You are in pure execution mode with a clear strategy already set\",\n        \"The team is too early-stage to commit to strategic constraints\"\n      ]\n    }\n  },\n  {\n    \"id\": \"value-chain-analysis\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Value Chain Analysis\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Map primary and support activities to understand where value is created and where costs can be optimised across the organisation.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Michael Porter\",\n      \"description\": \"Competitive Advantage\",\n      \"url\": \"https://en.wikipedia.org/wiki/Value_chain\",\n      \"year\": 1985,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Inbound Logistics\",\n        \"role\": \"inbound_logistics\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Inbound Logistics phase: key activity entities move through this stage\"\n      },\n      {\n        \"label\": \"Operations\",\n        \"role\": \"operations\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Operations phase: key activity entities move through this stage\"\n      },\n      {\n        \"label\": \"Outbound Logistics\",\n        \"role\": \"outbound_logistics\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Outbound Logistics phase: key activity entities move through this stage\"\n      },\n      {\n        \"label\": \"Marketing & Sales\",\n        \"role\": \"marketing_and_sales\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Marketing & Sales phase: key activity entities move through this stage\"\n      },\n      {\n        \"label\": \"Service\",\n        \"role\": \"service\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Service phase: key activity entities move through this stage\"\n      },\n      {\n        \"label\": \"Support Activities\",\n        \"role\": \"support_activity\",\n        \"entityTypeId\": \"capability\",\n        \"description\": \"Support Activities phase: capability entities move through this stage\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"key_activity\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"capability\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Decompose the organisation into primary and support activities to identify where value is created, where costs accumulate, and where competitive advantage can be built.\",\n      \"core_question\": \"Which activities in our value chain create the most value for customers, and which are candidates for cost reduction or outsourcing?\",\n      \"when_to_use\": [\n        \"You need to align the team on long-term direction\",\n        \"Market conditions are shifting and you need to reassess positioning\",\n        \"Leadership needs a structured view of strategic options\"\n      ],\n      \"when_not_to_use\": [\n        \"You are in pure execution mode with a clear strategy already set\",\n        \"The team is too early-stage to commit to strategic constraints\"\n      ]\n    }\n  },\n  {\n    \"id\": \"product-vision-board\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Product Vision Board\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Roman Pichler's one-page vision canvas. A vision at the top narrows through target group, needs, product and business goals, so the reason for building and the thing being built stay on the same page.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Roman Pichler\",\n      \"description\": \"Created by Roman Pichler as a one-page tool for capturing and sharing a product vision, and published in \\\"Strategize\\\" (2016). The board deliberately keeps the vision, the people it serves, their needs, the product and the business goals in a single vertical read, so a change to any one is visible against the other four.\",\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Vision\",\n        \"entityTypeId\": \"vision\",\n        \"description\": \"The long-term change the product exists to bring about\"\n      },\n      {\n        \"label\": \"Target Group\",\n        \"entityTypeId\": \"persona\",\n        \"description\": \"The customers and users the vision is for\"\n      },\n      {\n        \"label\": \"Needs\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"The problem the product solves or the benefit it provides for that group\"\n      },\n      {\n        \"label\": \"Product\",\n        \"entityTypeId\": \"solution\",\n        \"description\": \"What the product is, and what makes it stand out\"\n      },\n      {\n        \"label\": \"Business Goals\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"How the product benefits the company that builds it\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"vision\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"persona\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"solution\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 5,\n        \"cols\": 1\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Capture a product vision on one page together with the group it serves, their needs, the product itself and the business goals it advances.\",\n      \"core_question\": \"What change are we trying to bring about, for whom, and how does building it pay off?\",\n      \"when_to_use\": [\n        \"A new product or a major new direction needs a shared vision before any roadmap exists\",\n        \"The team can describe what it is building but not why anyone should want it\",\n        \"Vision, target group and business goals are living in three different documents and drifting apart\"\n      ],\n      \"when_not_to_use\": [\n        \"The vision is settled and the open question is sequencing: use goal-oriented-roadmap\",\n        \"You need the causal chain from vision down to daily work: use strategic-cascade\",\n        \"The question is which business model captures the value: use business-model-canvas\"\n      ]\n    }\n  },\n  {\n    \"id\": \"three-horizons\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Three Horizons of Growth\",\n    \"version\": \"1.0.0\",\n    \"description\": \"McKinsey's growth framework dividing the portfolio into three time horizons: H1 (core business), H2 (emerging opportunities), H3 (future bets). Ensures balanced investment across today, tomorrow, and the future.\",\n    \"category\": \"portfolio\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"McKinsey\",\n      \"description\": \"Introduced by Mehrdad Baghai, Stephen Coley, and David White in \\\"The Alchemy of Growth\\\" (1999, McKinsey). Adapted by many organisations and later by Bill Sharpe for futures thinking.\",\n      \"url\": \"https://www.mckinsey.com/business-functions/strategy-and-corporate-finance/our-insights/enduring-ideas-the-three-horizons-of-growth\",\n      \"year\": 1999,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"portfolio\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Portfolio\",\n        \"role\": \"portfolio\",\n        \"entityTypeId\": \"portfolio\",\n        \"description\": \"Innovation portfolio balanced across three horizons: core performance, emerging growth, and future creation\"\n      },\n      {\n        \"label\": \"Product\",\n        \"role\": \"product\",\n        \"entityTypeId\": \"product\",\n        \"description\": \"Product or business unit assigned to a horizon: H1 (defend and extend), H2 (build), or H3 (seed and explore)\"\n      },\n      {\n        \"label\": \"Initiative\",\n        \"role\": \"initiative\",\n        \"entityTypeId\": \"portfolio\",\n        \"description\": \"Growth initiative positioned in a horizon, with appropriate funding model, governance, and success metrics\"\n      },\n      {\n        \"label\": \"Product Area\",\n        \"role\": \"product_area\",\n        \"entityTypeId\": \"product_area\",\n        \"description\": \"Product area representing a horizon: core products (H1), adjacent expansions (H2), or experimental ventures (H3)\"\n      },\n      {\n        \"label\": \"Capability\",\n        \"role\": \"capability\",\n        \"entityTypeId\": \"capability\",\n        \"description\": \"Capability needed to execute across horizons: H1 needs efficiency, H2 needs scaling, H3 needs discovery\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"portfolio\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"product\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"product_area\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"capability\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Balance investment across three time horizons: Horizon 1 (core business), Horizon 2 (emerging), Horizon 3 (future bets). The organisation grows while protecting current revenue.\",\n      \"core_question\": \"Are we investing enough in future horizons, or is the urgency of the core business starving our long-term growth options?\",\n      \"when_to_use\": [\n        \"You manage multiple products and need to allocate resources across them\",\n        \"You need to assess the health and lifecycle stage of products\",\n        \"Strategic decisions require a portfolio-level view\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single product with no portfolio complexity\",\n        \"Portfolio decisions are made ad-hoc without need for frameworks\"\n      ]\n    }\n  },\n  {\n    \"id\": \"rice-scoring\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"RICE Scoring\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Score features, solutions, opportunities, and needs by Reach, Impact, Confidence, and Effort to produce a ranked priority list.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Intercom (Sean McBride)\",\n      \"description\": \"Developed at Intercom as a way to quantify feature prioritisation. Published as a blog post that became an industry standard.\",\n      \"url\": \"https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/\",\n      \"year\": 2014,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Items to score\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Features, opportunities, or needs being evaluated\"\n      },\n      {\n        \"label\": \"Opportunities to score\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"Opportunities scored on the same RICE Scoring inputs as features.\"\n      },\n      {\n        \"label\": \"Solutions to score\",\n        \"entityTypeId\": \"solution\",\n        \"description\": \"Solutions scored on the same RICE Scoring inputs as features.\"\n      },\n      {\n        \"label\": \"Needs to score\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Needs scored on the same RICE Scoring inputs as features.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"solution\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users will this impact per quarter?\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"impact_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"How much will this impact each user, on the impact scale?\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"confidence_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"How confident are you in the reach, impact, and effort estimates?\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"effort_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Effort\",\n            \"description\": \"How much work is required to build and ship this, on the effort scale?\"\n          }\n        ],\n        \"opportunity\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users will this impact per quarter?\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"impact_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"How much will this impact each user, on the impact scale?\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"confidence_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"How confident are you in the reach, impact, and effort estimates?\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"effort_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Effort\",\n            \"description\": \"How much work is required to build and ship this, on the effort scale?\"\n          }\n        ],\n        \"solution\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users will this impact per quarter?\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"impact_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"How much will this impact each user, on the impact scale?\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"confidence_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"How confident are you in the reach, impact, and effort estimates?\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"effort_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Effort\",\n            \"description\": \"How much work is required to build and ship this, on the effort scale?\"\n          }\n        ],\n        \"need\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users will this impact per quarter?\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"impact_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"How much will this impact each user, on the impact scale?\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"confidence_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"How confident are you in the reach, impact, and effort estimates?\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"effort_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Effort\",\n            \"description\": \"How much work is required to build and ship this, on the effort scale?\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"rice_score\",\n          \"expression\": \"(reach * impact * confidence) / effort\",\n          \"entity_type\": \"feature\",\n          \"label\": \"RICE Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"rice_score\",\n          \"expression\": \"(reach * impact * confidence) / effort\",\n          \"entity_type\": \"opportunity\",\n          \"label\": \"RICE Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"rice_score\",\n          \"expression\": \"(reach * impact * confidence) / effort\",\n          \"entity_type\": \"solution\",\n          \"label\": \"RICE Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"rice_score\",\n          \"expression\": \"(reach * impact * confidence) / effort\",\n          \"entity_type\": \"need\",\n          \"label\": \"RICE Score\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"feature\",\n          \"opportunity\",\n          \"solution\",\n          \"need\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"reach\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"reach_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Reach\",\n            \"description\": \"How many users will this impact per quarter?\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"impact_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"How much will this impact each user, on the impact scale?\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"confidence_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"How confident are you in the reach, impact, and effort estimates?\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"assessment\",\n            \"scale_id\": \"effort_5\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Effort\",\n            \"description\": \"How much work is required to build and ship this, on the effort scale?\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"rice_score\",\n            \"expression\": \"(reach * impact * confidence) / effort\",\n            \"label\": \"RICE Score\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Items to score\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"reach\",\n            \"label\": \"Reach\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"impact\",\n            \"label\": \"Impact\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"label\": \"Confidence\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"effort\",\n            \"label\": \"Effort\",\n            \"sortable\": true,\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"rice_score\",\n            \"label\": \"RICE Score\",\n            \"sortable\": true,\n            \"format\": \"score_pill\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"rice_score\",\n        \"direction\": \"desc\"\n      },\n      \"colour_by\": \"score\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Quantify feature priority by scoring Reach, Impact, Confidence, and Effort so teams compare opportunities on the same scale instead of debating gut feelings.\",\n      \"core_question\": \"Given limited engineering capacity, which features will deliver the most user value relative to the effort required?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"build-measure-learn\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Build-Measure-Learn\",\n    \"version\": \"1.0.0\",\n    \"description\": \"The core Lean Startup feedback loop: build a minimum viable product, measure its impact with actionable metrics, and learn whether to pivot or persevere.\",\n    \"category\": \"validation\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Eric Ries\",\n      \"description\": \"Introduced by Eric Ries in \\\"The Lean Startup\\\" (2011). The Build-Measure-Learn feedback loop is the core engine of the Lean Startup methodology, emphasising validated learning over detailed planning.\",\n      \"url\": \"https://en.wikipedia.org/wiki/Lean_startup\",\n      \"year\": 2011,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"validation\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Build\",\n        \"entityTypeId\": \"prototype\",\n        \"description\": \"Build phase: prototype entities move through this stage\"\n      },\n      {\n        \"label\": \"Measure\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Measure phase: metric entities move through this stage\"\n      },\n      {\n        \"label\": \"Learn\",\n        \"entityTypeId\": \"learning\",\n        \"description\": \"Learn phase: learning entities move through this stage\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"learning\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"prototype\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Iterate through the Lean Startup loop (build the smallest thing, measure what matters, learn whether to persevere or pivot), minimising waste on unvalidated ideas.\",\n      \"core_question\": \"What is the minimum we need to build to test our current hypothesis, and what metric tells us whether to continue or pivot?\",\n      \"when_to_use\": [\n        \"You have hypotheses about user needs or solutions that need testing\",\n        \"You want to reduce risk before committing engineering resources\",\n        \"The team is debating assumptions that can be tested empirically\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is already validated through real usage data\",\n        \"Speed of shipping matters more than certainty about assumptions\"\n      ]\n    }\n  },\n  {\n    \"id\": \"kano-model\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"Kano Model\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Classify features by how they affect user satisfaction: must-haves, performance features, and delighters.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Noriaki Kano\",\n      \"description\": \"Created by Professor Noriaki Kano at Tokyo University of Science. Based on his theory of attractive quality.\",\n      \"url\": \"https://en.wikipedia.org/wiki/Kano_model\",\n      \"year\": 1984,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"quadrant\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Must-haves\",\n        \"role\": \"must_have\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Expected features: absence causes dissatisfaction\",\n        \"predicate\": [\n          {\n            \"scope\": \"framework\",\n            \"property\": \"functional_response\",\n            \"op\": \"in\",\n            \"value\": [\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\"\n            ]\n          },\n          {\n            \"scope\": \"framework\",\n            \"property\": \"dysfunctional_response\",\n            \"op\": \"eq\",\n            \"value\": \"i_dislike_it\"\n          }\n        ]\n      },\n      {\n        \"label\": \"Performance\",\n        \"role\": \"performance\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"More is better: linear satisfaction increase\",\n        \"predicate\": [\n          {\n            \"scope\": \"framework\",\n            \"property\": \"functional_response\",\n            \"op\": \"eq\",\n            \"value\": \"i_like_it\"\n          },\n          {\n            \"scope\": \"framework\",\n            \"property\": \"dysfunctional_response\",\n            \"op\": \"eq\",\n            \"value\": \"i_dislike_it\"\n          }\n        ]\n      },\n      {\n        \"label\": \"Delighters\",\n        \"role\": \"delighter\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Unexpected features: presence creates delight\",\n        \"predicate\": [\n          {\n            \"scope\": \"framework\",\n            \"property\": \"functional_response\",\n            \"op\": \"eq\",\n            \"value\": \"i_like_it\"\n          },\n          {\n            \"scope\": \"framework\",\n            \"property\": \"dysfunctional_response\",\n            \"op\": \"in\",\n            \"value\": [\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\"\n            ]\n          }\n        ]\n      },\n      {\n        \"label\": \"Indifferent\",\n        \"role\": \"indifferent\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Features users don't care about either way\",\n        \"predicate\": [\n          {\n            \"scope\": \"framework\",\n            \"property\": \"functional_response\",\n            \"op\": \"in\",\n            \"value\": [\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\"\n            ]\n          },\n          {\n            \"scope\": \"framework\",\n            \"property\": \"dysfunctional_response\",\n            \"op\": \"in\",\n            \"value\": [\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"functional_response\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Functional Response\",\n            \"description\": \"How users feel when the feature IS present\",\n            \"enum_values\": [\n              \"i_like_it\",\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\",\n              \"i_dislike_it\"\n            ]\n          },\n          {\n            \"property\": \"dysfunctional_response\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Dysfunctional Response\",\n            \"description\": \"How users feel when the feature IS NOT present\",\n            \"enum_values\": [\n              \"i_like_it\",\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\",\n              \"i_dislike_it\"\n            ]\n          },\n          {\n            \"property\": \"delighter_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Delighter classifications\",\n            \"description\": \"Count of survey responses classifying this feature as a delighter (attractive)\"\n          },\n          {\n            \"property\": \"performance_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Performance classifications\",\n            \"description\": \"Count of survey responses classifying this feature as performance (one-dimensional)\"\n          },\n          {\n            \"property\": \"must_be_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Must-be classifications\",\n            \"description\": \"Count of survey responses classifying this feature as must-be (basic)\"\n          },\n          {\n            \"property\": \"indifferent_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Indifferent classifications\",\n            \"description\": \"Count of survey responses classifying this feature as indifferent\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"satisfaction_coefficient\",\n          \"expression\": \"(delighter_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count)\",\n          \"entity_type\": \"feature\",\n          \"label\": \"Satisfaction Coefficient\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"dissatisfaction_coefficient\",\n          \"expression\": \"(must_be_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count) * -1\",\n          \"entity_type\": \"feature\",\n          \"label\": \"Dissatisfaction Coefficient\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"feature\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"functional_response\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Functional Response\",\n            \"description\": \"How users feel when the feature IS present\",\n            \"enum_values\": [\n              \"i_like_it\",\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\",\n              \"i_dislike_it\"\n            ]\n          },\n          {\n            \"property\": \"dysfunctional_response\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Dysfunctional Response\",\n            \"description\": \"How users feel when the feature IS NOT present\",\n            \"enum_values\": [\n              \"i_like_it\",\n              \"i_expect_it\",\n              \"i_am_neutral\",\n              \"i_can_tolerate_it\",\n              \"i_dislike_it\"\n            ]\n          },\n          {\n            \"property\": \"delighter_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Delighter classifications\",\n            \"description\": \"Count of survey responses classifying this feature as a delighter (attractive)\"\n          },\n          {\n            \"property\": \"performance_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Performance classifications\",\n            \"description\": \"Count of survey responses classifying this feature as performance (one-dimensional)\"\n          },\n          {\n            \"property\": \"must_be_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Must-be classifications\",\n            \"description\": \"Count of survey responses classifying this feature as must-be (basic)\"\n          },\n          {\n            \"property\": \"indifferent_count\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"scope\": \"framework\",\n            \"label\": \"Indifferent classifications\",\n            \"description\": \"Count of survey responses classifying this feature as indifferent\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"satisfaction_coefficient\",\n            \"expression\": \"(delighter_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count)\",\n            \"label\": \"Satisfaction Coefficient\",\n            \"format\": \"number\"\n          },\n          {\n            \"property\": \"dissatisfaction_coefficient\",\n            \"expression\": \"(must_be_count + performance_count) / (delighter_count + performance_count + must_be_count + indifferent_count) * -1\",\n            \"label\": \"Dissatisfaction Coefficient\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 5,\n        \"cols\": 5,\n        \"template\": \"kano-classification\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Classify features by how they affect user satisfaction (must-haves vs delighters). Teams invest in the right category at the right time.\",\n      \"core_question\": \"Which features prevent dissatisfaction, which increase satisfaction linearly, and which create unexpected delight?\",\n      \"when_to_use\": [\n        \"You need to distinguish must-have features from delighters\",\n        \"You want to identify features that drive satisfaction vs prevent dissatisfaction\",\n        \"You are investing in differentiation and need to know which delighters move users\"\n      ],\n      \"when_not_to_use\": [\n        \"You cannot survey users for functional/dysfunctional responses\",\n        \"The backlog is too early-stage for paired survey questions to be meaningful\"\n      ]\n    }\n  },\n  {\n    \"id\": \"now-next-later\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Now-Next-Later\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Prioritise work into three time horizons without committing to specific dates. Outcome-focused, not date-focused.\",\n    \"category\": \"planning\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Popularised by Janna Bastow (ProdPad). An outcome-focused roadmap that avoids false date commitments.\",\n      \"url\": \"https://www.prodpad.com/blog/invented-now-next-later-roadmap/\",\n      \"year\": 2012,\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"planning\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Now\",\n        \"role\": \"now\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Committed work in progress\"\n      },\n      {\n        \"label\": \"Next\",\n        \"role\": \"next\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"High-confidence upcoming work\"\n      },\n      {\n        \"label\": \"Later\",\n        \"role\": \"later\",\n        \"entityTypeId\": \"initiative\",\n        \"description\": \"Exploratory, needs more discovery\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"initiative\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Now\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Next\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Later\",\n            \"sortable\": true\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Organise work by time horizon without committing to dates. Now is in progress, Next is committed, Later is under consideration. Flexible direction.\",\n      \"core_question\": \"What are we certain about (Now), what have we committed to (Next), and what are we still exploring (Later)?\",\n      \"when_to_use\": [\n        \"You need to coordinate work across multiple teams or time horizons\",\n        \"Stakeholders need visibility into what is coming and when\",\n        \"You want to balance commitments with flexibility\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small enough that informal coordination works\",\n        \"Plans would create false precision about uncertain outcomes\"\n      ]\n    }\n  },\n  {\n    \"id\": \"moscow\",\n    \"approach_ids\": [\n      \"plan\",\n      \"prioritise\"\n    ],\n    \"name\": \"MoSCoW\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Categorise requirements into Must have, Should have, Could have, and Won't have to clarify scope and priorities.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Dai Clegg (Oracle)\",\n      \"description\": \"Created by Dai Clegg at Oracle as part of the DSDM Atern methodology for rapid application development.\",\n      \"year\": 1994,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Requirements to categorise\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Features or requirements sorted into the four MoSCoW buckets\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"moscow\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"MoSCoW priority\",\n            \"description\": \"Which scope bucket this requirement falls into for the current release\",\n            \"enum_values\": [\n              \"must\",\n              \"should\",\n              \"could\",\n              \"wont\"\n            ]\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Requirement\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"moscow\",\n            \"label\": \"Priority\",\n            \"sortable\": true,\n            \"format\": \"badge\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"moscow\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Categorise requirements into Must, Should, Could, and Won't buckets so stakeholders agree on scope boundaries before development begins.\",\n      \"core_question\": \"Which requirements are truly non-negotiable for this release, and which can be deferred without blocking the goal?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"experiment-tracker\",\n    \"name\": \"Experiment Tracker\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Track experiments from design through execution to results. Velocity-focused.\",\n    \"category\": \"validation\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Common in growth and product teams running continuous experiments.\",\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"validation\",\n      \"table\"\n    ],\n    \"relational\": {\n      \"spine\": \"experiment_run\",\n      \"columns\": [\n        {\n          \"kind\": \"field\",\n          \"id\": \"experiment\",\n          \"label\": \"Experiment\",\n          \"property\": \"title\",\n          \"sortable\": true\n        },\n        {\n          \"kind\": \"projection\",\n          \"id\": \"hypothesis\",\n          \"label\": \"Hypothesis\",\n          \"path\": [\n            {\n              \"edge\": \"experiment_plan_ran_as_experiment_run\",\n              \"direction\": \"reverse\"\n            },\n            {\n              \"edge\": \"hypothesis_requires_experiment_plan\",\n              \"direction\": \"reverse\"\n            }\n          ],\n          \"fields\": [\n            \"title\"\n          ],\n          \"sortable\": true\n        },\n        {\n          \"kind\": \"projection\",\n          \"id\": \"success_metric\",\n          \"label\": \"Success Metric\",\n          \"path\": [\n            {\n              \"edge\": \"experiment_run_measures_metric\",\n              \"direction\": \"forward\"\n            }\n          ],\n          \"fields\": [\n            \"title\",\n            \"current_value\",\n            \"target_value\"\n          ]\n        },\n        {\n          \"kind\": \"field\",\n          \"id\": \"stage\",\n          \"label\": \"Stage\",\n          \"property\": \"status\"\n        },\n        {\n          \"kind\": \"field\",\n          \"id\": \"verdict\",\n          \"label\": \"Verdict\",\n          \"property\": \"disposition\"\n        },\n        {\n          \"kind\": \"projection\",\n          \"id\": \"result\",\n          \"label\": \"Result\",\n          \"path\": [\n            {\n              \"edge\": \"experiment_run_produces_learning\",\n              \"direction\": \"forward\"\n            }\n          ],\n          \"fields\": [\n            \"title\",\n            \"result_direction\"\n          ]\n        },\n        {\n          \"kind\": \"projection\",\n          \"id\": \"evidence\",\n          \"label\": \"Evidence\",\n          \"path\": [\n            {\n              \"edge\": \"experiment_run_yields_evidence\",\n              \"direction\": \"forward\"\n            }\n          ],\n          \"fields\": [\n            \"title\"\n          ]\n        }\n      ],\n      \"sort\": {\n        \"column\": \"experiment\",\n        \"direction\": \"asc\"\n      }\n    },\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"experiment_run\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"experiment_plan\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"hypothesis\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"learning\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"evidence\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": []\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Track all running and completed experiments in one place: hypothesis, method, status, result, learnings. The team builds a cumulative record of validated knowledge.\",\n      \"core_question\": \"What experiments are running, what have we learned from completed experiments, and are we applying those learnings to new hypotheses?\",\n      \"when_to_use\": [\n        \"You have hypotheses about user needs or solutions that need testing\",\n        \"You want to reduce risk before committing engineering resources\",\n        \"The team is debating assumptions that can be tested empirically\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is already validated through real usage data\",\n        \"Speed of shipping matters more than certainty about assumptions\"\n      ]\n    }\n  },\n  {\n    \"id\": \"hypothesis-board\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Hypothesis Board\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Track hypotheses through their lifecycle: draft → designed → running → analysed. Each row is a hypothesis with its experiment and learning.\",\n    \"category\": \"validation\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Common in lean product teams. Tracks hypotheses through design, experimentation, and learning cycles.\",\n      \"year\": 2013,\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"validation\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Hypothesis\",\n        \"entityTypeId\": \"hypothesis\",\n        \"description\": \"We believe [action] will result in [outcome]\"\n      },\n      {\n        \"label\": \"Experiment\",\n        \"entityTypeId\": \"experiment_run\",\n        \"description\": \"The test designed to validate or invalidate\"\n      },\n      {\n        \"label\": \"Success Metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"What number tells us if the hypothesis holds?\"\n      },\n      {\n        \"label\": \"Learning\",\n        \"entityTypeId\": \"learning\",\n        \"description\": \"What we learned from the experiment\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"hypothesis\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"experiment_run\",\n          \"role\": \"leaf\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"learning\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Hypothesis\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Experiment\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Success Metric\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Learning\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Track product hypotheses through their lifecycle: assumption to experiment to validated/invalidated. Team learning becomes visible and cumulative.\",\n      \"core_question\": \"Which hypotheses have we validated, which have we invalidated, and what new hypotheses emerged from the evidence?\",\n      \"when_to_use\": [\n        \"You have hypotheses about user needs or solutions that need testing\",\n        \"You want to reduce risk before committing engineering resources\",\n        \"The team is debating assumptions that can be tested empirically\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is already validated through real usage data\",\n        \"Speed of shipping matters more than certainty about assumptions\"\n      ]\n    }\n  },\n  {\n    \"id\": \"c4-model\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"C4 Model\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Visualise software architecture at four levels of abstraction: System Context, Container, Component, and Code. Each level zooms in to reveal more detail.\",\n    \"category\": \"engineering\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Simon Brown\",\n      \"description\": \"Created by Simon Brown. The C4 model addresses the chaos of ad-hoc architecture diagrams by defining four standard levels of abstraction, each with clear rules about what to include and exclude.\",\n      \"url\": \"https://c4model.com\",\n      \"year\": 2011,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"engineering\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"System Context\",\n        \"entityTypeId\": \"bounded_context\",\n        \"description\": \"The system and its external actors\"\n      },\n      {\n        \"label\": \"Containers\",\n        \"entityTypeId\": \"service\",\n        \"description\": \"Applications, data stores, microservices\"\n      },\n      {\n        \"label\": \"Components\",\n        \"entityTypeId\": \"code_repository\",\n        \"description\": \"Major structural building blocks inside a container\"\n      },\n      {\n        \"label\": \"Code\",\n        \"entityTypeId\": \"library_dependency\",\n        \"description\": \"Classes, interfaces, implementation details\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"bounded_context\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"service\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"code_repository\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"library_dependency\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Document software architecture at four zoom levels (Context, Containers, Components, Code) so every stakeholder gets the diagram at the right level of detail.\",\n      \"core_question\": \"Can every team member (from PM to engineer) understand our architecture at the level of detail they need?\",\n      \"when_to_use\": [\n        \"You need to structure complex technical decisions or architecture\",\n        \"The engineering team needs alignment on technical approach\",\n        \"You want to evaluate or improve engineering practices\"\n      ],\n      \"when_not_to_use\": [\n        \"The technical solution is straightforward and well-understood\",\n        \"You are building a throwaway prototype where architecture does not matter\"\n      ]\n    }\n  },\n  {\n    \"id\": \"adr-log\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"ADR Log\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Architecture Decision Records: log decisions with context, options, and rationale.\",\n    \"category\": \"engineering\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Michael Nygard\",\n      \"description\": \"Proposed by Michael Nygard in 2011 as \\\"Architecture Decision Records\\\". The lightweight template (Title, Status, Context, Decision, Consequences) has become a standard practice in software teams.\",\n      \"url\": \"https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions\",\n      \"year\": 2011,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"engineering\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Decision\",\n        \"entityTypeId\": \"decision\",\n        \"description\": \"Decision: decision entries to evaluate\"\n      },\n      {\n        \"label\": \"Context\",\n        \"entityTypeId\": \"bounded_context\",\n        \"description\": \"Context: bounded context entries to evaluate\"\n      },\n      {\n        \"label\": \"Options Considered\",\n        \"entityTypeId\": \"solution\",\n        \"description\": \"Options Considered: solution entries to evaluate\"\n      },\n      {\n        \"label\": \"Consequences\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"Consequences: outcome entries to evaluate\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"decision\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"bounded_context\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"solution\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Decision\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Context\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Options Considered\"\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Consequences\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Record architectural decisions as lightweight, immutable documents (Context, Decision, Consequences). Future teams understand why the system is the way it is.\",\n      \"core_question\": \"Why was this architectural decision made, what alternatives were considered, and what consequences did we accept?\",\n      \"when_to_use\": [\n        \"You need to structure complex technical decisions or architecture\",\n        \"The engineering team needs alignment on technical approach\",\n        \"You want to evaluate or improve engineering practices\"\n      ],\n      \"when_not_to_use\": [\n        \"The technical solution is straightforward and well-understood\",\n        \"You are building a throwaway prototype where architecture does not matter\"\n      ]\n    }\n  },\n  {\n    \"id\": \"threat-model-canvas\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"Threat Model Canvas\",\n    \"version\": \"1.0.0\",\n    \"description\": \"One surface for a product's security posture: the threat models in play, the threats and vulnerabilities they name, and the controls, policies and reviews answering them.\",\n    \"category\": \"security\",\n    \"origin\": {\n      \"type\": \"custom\",\n      \"attribution\": \"The Product Creator\",\n      \"description\": \"Original to the Unified Product Graph. Deliberately NOT a STRIDE record: STRIDE is a taxonomy of six threat categories (spoofing, tampering, repudiation, information disclosure, denial of service, elevation of privilege), whereas this canvas lays out the security lifecycle: models, then threats, then vulnerabilities, then the controls, policies and reviews that answer them. A STRIDE record would be a different framework with six slots of one type, and is not this one. Assembled from six entity types the catalog already models.\",\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"security\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Threat Models\",\n        \"entityTypeId\": \"threat_model\",\n        \"description\": \"The modelling exercises themselves: scope, system, assumptions\"\n      },\n      {\n        \"label\": \"Threats\",\n        \"entityTypeId\": \"threat\",\n        \"description\": \"What an adversary could attempt against the system\"\n      },\n      {\n        \"label\": \"Vulnerabilities\",\n        \"entityTypeId\": \"vulnerability\",\n        \"description\": \"Weaknesses that make a threat realisable\"\n      },\n      {\n        \"label\": \"Controls\",\n        \"entityTypeId\": \"security_control\",\n        \"description\": \"Technical and procedural measures that reduce risk\"\n      },\n      {\n        \"label\": \"Policies\",\n        \"entityTypeId\": \"security_policy\",\n        \"description\": \"The standing rules the controls implement\"\n      },\n      {\n        \"label\": \"Reviews\",\n        \"entityTypeId\": \"security_review\",\n        \"description\": \"Assessments that check the posture actually holds\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"threat_model\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"threat\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"vulnerability\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"security_control\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"security_policy\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"security_review\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 3\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Hold a product's whole security posture on one surface, so a named threat and the control that answers it are read together rather than tracked in separate systems.\",\n      \"core_question\": \"What could go wrong, what makes it possible, and what have we actually put in place against it?\",\n      \"when_to_use\": [\n        \"A threat modelling session needs somewhere to land that is not a document nobody reopens\",\n        \"Controls and policies exist but nobody can point to the threats they answer\",\n        \"An audit or review asks you to show posture, not just a list of findings\"\n      ],\n      \"when_not_to_use\": [\n        \"You want STRIDE's six threat categories specifically. This canvas is a lifecycle, not that taxonomy\",\n        \"You are triaging a live incident rather than modelling posture\",\n        \"The work is scoring and ranking risks against each other rather than laying out what exists\"\n      ]\n    }\n  },\n  {\n    \"id\": \"atomic-design\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Atomic Design\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Atoms, Molecules, Organisms, Templates, Pages: a methodology for creating design systems from the smallest elements up.\",\n    \"category\": \"design\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Brad Frost\",\n      \"description\": \"Created by Brad Frost in 2013, inspired by chemistry. The five-level hierarchy (atoms → molecules → organisms → templates → pages) provides a mental model for building design systems from small, reusable parts.\",\n      \"url\": \"https://bradfrost.com/blog/post/atomic-web-design/\",\n      \"year\": 2013,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"design\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Atoms\",\n        \"role\": \"atom\",\n        \"entityTypeId\": \"design_component\",\n        \"description\": \"Atoms: design component entities for this dimension of the framework\"\n      },\n      {\n        \"label\": \"Molecules\",\n        \"role\": \"molecule\",\n        \"entityTypeId\": \"design_component\",\n        \"description\": \"Molecules: design token entities for this dimension of the framework\"\n      },\n      {\n        \"label\": \"Organisms\",\n        \"role\": \"organism\",\n        \"entityTypeId\": \"design_pattern\",\n        \"description\": \"Organisms: design pattern entities for this dimension of the framework\"\n      },\n      {\n        \"label\": \"Templates\",\n        \"role\": \"template\",\n        \"entityTypeId\": \"wireframe\",\n        \"description\": \"Templates: design system entities for this dimension of the framework\"\n      },\n      {\n        \"label\": \"Pages\",\n        \"role\": \"page\",\n        \"entityTypeId\": \"screen\",\n        \"description\": \"Pages: screen entities for this dimension of the framework\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"design_component\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"design_pattern\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"screen\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"wireframe\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Organise UI components into five levels (Atoms, Molecules, Organisms, Templates, Pages). Creates a shared vocabulary between design and engineering for building design systems.\",\n      \"core_question\": \"Can our design system be decomposed into reusable atoms and molecules that compose predictably into every page?\",\n      \"when_to_use\": [\n        \"You need a structured approach to solve a complex design problem\",\n        \"The team needs alignment on design process and principles\",\n        \"You want to evaluate or improve existing design quality\"\n      ],\n      \"when_not_to_use\": [\n        \"The design problem is straightforward and well-understood\",\n        \"You are in a rapid prototyping phase where process would slow you down\"\n      ]\n    }\n  },\n  {\n    \"id\": \"double-diamond\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Double Diamond\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Discover, Define, Develop, Deliver: a four-phase divergent/convergent design process.\",\n    \"category\": \"design\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"British Design Council\",\n      \"description\": \"Introduced by the British Design Council in 2005. Maps the design process as two connected diamonds: diverge to explore, converge to decide. Widely adopted across design, product, and innovation teams worldwide.\",\n      \"url\": \"https://www.designcouncil.org.uk/our-resources/the-double-diamond/\",\n      \"year\": 2005,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"design\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Discover\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"Explore the problem space: research, observe, and interview users to understand unmet needs\"\n      },\n      {\n        \"label\": \"Define\",\n        \"entityTypeId\": \"design_question\",\n        \"description\": \"Converge on the core problem: synthesise research into a clear problem statement\"\n      },\n      {\n        \"label\": \"Develop\",\n        \"entityTypeId\": \"design_concept\",\n        \"description\": \"Diverge on solutions: ideate, prototype, and explore multiple approaches\"\n      },\n      {\n        \"label\": \"Deliver\",\n        \"entityTypeId\": \"prototype\",\n        \"description\": \"Converge on the best solution: test, refine, and ship\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"design_question\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"design_concept\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"prototype\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Guide teams through two cycles of divergent and convergent thinking: first to find the right problem, then to find the right solution.\",\n      \"core_question\": \"How do we move from a fuzzy problem space to a tested solution through structured divergence and convergence?\",\n      \"when_to_use\": [\n        \"You need a structured approach to solve a complex design problem\",\n        \"The team needs alignment on design process and principles\",\n        \"You want to evaluate or improve existing design quality\"\n      ],\n      \"when_not_to_use\": [\n        \"The design problem is straightforward and well-understood\",\n        \"You are in a rapid prototyping phase where process would slow you down\"\n      ]\n    }\n  },\n  {\n    \"id\": \"dora-metrics\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"DORA Metrics\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Four key metrics for software delivery performance: deployment frequency, lead time, change failure rate, and time to restore.\",\n    \"category\": \"metrics\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"DORA Team (Google Cloud)\",\n      \"description\": \"From Accelerate: The Science of Lean Software (IT Revolution Press). Based on 6 years of State of DevOps research.\",\n      \"url\": \"https://dora.dev/\",\n      \"year\": 2018,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"metrics\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Delivery metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"One of the four DORA software-delivery performance metrics\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"metric\": [\n          {\n            \"property\": \"dora_metric\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"label\": \"DORA metric\",\n            \"description\": \"Which of the four DORA metrics this measures\",\n            \"enum_values\": [\n              \"deployment_frequency\",\n              \"lead_time_for_changes\",\n              \"change_failure_rate\",\n              \"time_to_restore\"\n            ]\n          },\n          {\n            \"property\": \"performance_tier\",\n            \"type\": \"enum\",\n            \"required\": false,\n            \"label\": \"Performance tier\",\n            \"description\": \"Where this metric sits on the DORA elite-to-low benchmark\",\n            \"enum_values\": [\n              \"elite\",\n              \"high\",\n              \"medium\",\n              \"low\"\n            ]\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Measure software delivery performance through four key metrics that predict both speed and stability, enabling data-driven engineering improvement.\",\n      \"core_question\": \"How fast and how safely is our team shipping software, and where are the bottlenecks?\",\n      \"when_to_use\": [\n        \"You need to define what success looks like for your product or team\",\n        \"Teams are optimising for different metrics that may conflict\",\n        \"You want to move from vanity metrics to actionable measurements\"\n      ],\n      \"when_not_to_use\": [\n        \"You lack the data infrastructure to track metrics reliably\",\n        \"The product is too early for meaningful quantitative measurement\"\n      ]\n    }\n  },\n  {\n    \"id\": \"shape-up\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Shape Up\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Basecamp's methodology: shape work into appetites, bet on 6-week cycles, and give teams full autonomy to deliver within fixed time, variable scope.\",\n    \"category\": \"planning\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Ryan Singer\",\n      \"description\": \"Created at Basecamp (formerly 37signals) by Ryan Singer. Published as a free online book in 2019. Introduces the concepts of shaping, appetite, and six-week cycles as an alternative to Scrum sprints.\",\n      \"url\": \"https://basecamp.com/shapeup\",\n      \"year\": 2019,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"planning\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Shaping\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Define the problem and solution at the right level of abstraction: rough enough to leave room, specific enough to act on\"\n      },\n      {\n        \"label\": \"Betting Table\",\n        \"entityTypeId\": \"decision\",\n        \"description\": \"Betting Table phase: decision entities move through this stage\"\n      },\n      {\n        \"label\": \"Building (6-week cycle)\",\n        \"entityTypeId\": \"epic\",\n        \"description\": \"Building (6-week cycle) phase: epic entities move through this stage\"\n      },\n      {\n        \"label\": \"Cooldown\",\n        \"entityTypeId\": \"task\",\n        \"description\": \"Two-week buffer for bug fixes, exploration, and preparing the next cycle's pitches\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"epic\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"task\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"decision\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Frame work in fixed six-week cycles with shaped pitches, giving teams autonomy within appetite-bounded scope instead of open-ended backlogs.\",\n      \"core_question\": \"What is the right appetite for this problem, and how do we shape a pitch that fits within that boundary?\",\n      \"when_to_use\": [\n        \"You need to coordinate work across multiple teams or time horizons\",\n        \"Stakeholders need visibility into what is coming and when\",\n        \"You want to balance commitments with flexibility\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small enough that informal coordination works\",\n        \"Plans would create false precision about uncertain outcomes\"\n      ]\n    }\n  },\n  {\n    \"id\": \"pirate-metrics-aarrr\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Pirate Metrics AARRR\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Track user lifecycle across five stages: Acquisition, Activation, Retention, Revenue, and Referral.\",\n    \"category\": \"growth\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Dave McClure\",\n      \"description\": \"Presented by Dave McClure at 500 Startups. Became the default growth metrics framework for startups.\",\n      \"url\": \"https://www.slideshare.net/dmc500hats/startup-metrics-for-pirates-long-version\",\n      \"year\": 2007,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"growth\",\n      \"funnel\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Lifecycle metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"A metric tracking one stage of the customer lifecycle funnel\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"metric\": [\n          {\n            \"property\": \"metric_category\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"label\": \"Lifecycle stage\",\n            \"description\": \"Which AARRR funnel stage this metric measures\",\n            \"enum_values\": [\n              \"acquisition\",\n              \"activation\",\n              \"retention\",\n              \"revenue\",\n              \"referral\"\n            ]\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"funnel\",\n      \"stages\": [\n        {\n          \"id\": \"acquisition\",\n          \"label\": \"Acquisition\",\n          \"order\": 0,\n          \"entity_type\": \"metric\"\n        },\n        {\n          \"id\": \"activation\",\n          \"label\": \"Activation\",\n          \"order\": 1,\n          \"entity_type\": \"metric\"\n        },\n        {\n          \"id\": \"retention\",\n          \"label\": \"Retention\",\n          \"order\": 2,\n          \"entity_type\": \"metric\"\n        },\n        {\n          \"id\": \"revenue\",\n          \"label\": \"Revenue\",\n          \"order\": 3,\n          \"entity_type\": \"metric\"\n        },\n        {\n          \"id\": \"referral\",\n          \"label\": \"Referral\",\n          \"order\": 4,\n          \"entity_type\": \"metric\"\n        }\n      ]\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"funnel\",\n        \"orientation\": \"vertical\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Track the five stages of the customer lifecycle (Acquisition, Activation, Retention, Revenue, Referral) to find and fix leaks in the growth funnel.\",\n      \"core_question\": \"Where in the customer lifecycle are we losing users, and which stage offers the highest-leverage improvement?\",\n      \"when_to_use\": [\n        \"You need to systematically identify and optimise growth levers\",\n        \"User acquisition, activation, or retention metrics need improvement\",\n        \"You want to build a structured growth experimentation practice\"\n      ],\n      \"when_not_to_use\": [\n        \"The product has not yet achieved product-market fit\",\n        \"Growth would scale problems rather than value\"\n      ]\n    }\n  },\n  {\n    \"id\": \"north-star-metric\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"North Star Metric\",\n    \"version\": \"1.0.0\",\n    \"description\": \"One metric that best captures the core value you deliver. Supported by 3-5 input metrics that drive it.\",\n    \"category\": \"metrics\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Sean Ellis / Amplitude\",\n      \"description\": \"Popularised by Sean Ellis (Hacking Growth) and Amplitude. One metric that captures the core value you deliver.\",\n      \"url\": \"https://amplitude.com/blog/north-star-metric\",\n      \"year\": 2017,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"metrics\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"The North Star metric or one of its 3-5 input (driver) metrics\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"metric\": [\n          {\n            \"property\": \"designation\",\n            \"type\": \"enum\",\n            \"required\": true,\n            \"label\": \"Metric role\",\n            \"description\": \"Whether this is the single North Star or a driver that feeds it\",\n            \"enum_values\": [\n              \"north_star\",\n              \"input\"\n            ]\n          },\n          {\n            \"property\": \"leverage\",\n            \"type\": \"number\",\n            \"required\": false,\n            \"label\": \"Leverage\",\n            \"description\": \"How strongly this input metric moves the North Star (input metrics only)\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Identify the single metric that best captures the core value your product delivers to customers, aligning the entire organisation around sustainable growth.\",\n      \"core_question\": \"What one metric, if it grows, proves we are delivering more value to more customers over time?\",\n      \"when_to_use\": [\n        \"You need to define what success looks like for your product or team\",\n        \"Teams are optimising for different metrics that may conflict\",\n        \"You want to move from vanity metrics to actionable measurements\"\n      ],\n      \"when_not_to_use\": [\n        \"You lack the data infrastructure to track metrics reliably\",\n        \"The product is too early for meaningful quantitative measurement\"\n      ]\n    }\n  },\n  {\n    \"id\": \"marketing-mix-4ps\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Marketing Mix 4Ps\",\n    \"version\": \"1.0.0\",\n    \"description\": \"The foundational marketing framework. Every marketing strategy must address four decisions: what to sell (Product), what to charge (Price), where to sell (Place), and how to promote (Promotion).\",\n    \"category\": \"marketing\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"E. Jerome McCarthy\",\n      \"description\": \"Basic Marketing: A Managerial Approach\",\n      \"url\": \"https://en.wikipedia.org/wiki/Marketing_mix\",\n      \"year\": 1960,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"marketing\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Product\",\n        \"entityTypeId\": \"product\",\n        \"description\": \"What you offer: features, quality, branding\"\n      },\n      {\n        \"label\": \"Price\",\n        \"entityTypeId\": \"proof_point\",\n        \"description\": \"Pricing strategy and structure\"\n      },\n      {\n        \"label\": \"Place\",\n        \"entityTypeId\": \"marketing_channel\",\n        \"description\": \"Distribution channels and availability\"\n      },\n      {\n        \"label\": \"Promotion\",\n        \"entityTypeId\": \"funnel_step\",\n        \"description\": \"Advertising, PR, sales promotion, direct marketing\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"marketing_channel\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"product\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"proof_point\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"funnel_step\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Evaluate the four foundational marketing levers (Product, Price, Place, Promotion). Ensure they are aligned and working together.\",\n      \"core_question\": \"Are our product offering, pricing, distribution, and promotion working in harmony, or are they pulling in different directions?\",\n      \"when_to_use\": [\n        \"You need to structure your marketing strategy and messaging\",\n        \"You want to align marketing activities with product positioning\",\n        \"You are entering a new market or launching a new product\"\n      ],\n      \"when_not_to_use\": [\n        \"The product is pre-launch with no audience to market to\",\n        \"Marketing strategy is well-established and performing\"\n      ]\n    }\n  },\n  {\n    \"id\": \"bullseye-framework\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"Bullseye Framework\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Test 19 traction channels systematically. Start with the outer ring (what's possible), narrow to the middle ring (what's probable), then focus on the inner ring (what's working). Run cheap tests across all channels to find your bullseye.\",\n    \"category\": \"growth\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Weinberg & Mares\",\n      \"description\": \"Traction: How Any Startup Can Achieve Explosive Customer Growth\",\n      \"url\": \"https://www.amazon.com/Traction-Startup-Achieve-Explosive-Customer/dp/1591848369\",\n      \"year\": 2015,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"growth\",\n      \"funnel\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Outer Ring\",\n        \"role\": \"outer_ring\",\n        \"entityTypeId\": \"acquisition_channel\",\n        \"description\": \"All 19 traction channels brainstormed\"\n      },\n      {\n        \"label\": \"Middle Ring\",\n        \"role\": \"middle_ring\",\n        \"entityTypeId\": \"acquisition_channel\",\n        \"description\": \"Top 6 channels worth testing\"\n      },\n      {\n        \"label\": \"Inner Ring\",\n        \"role\": \"inner_ring\",\n        \"entityTypeId\": \"acquisition_channel\",\n        \"description\": \"Top 3 channels to focus on\"\n      },\n      {\n        \"label\": \"Traction Test\",\n        \"role\": \"traction_test\",\n        \"entityTypeId\": \"growth_campaign\",\n        \"description\": \"Cheap test for each channel\"\n      },\n      {\n        \"label\": \"Bullseye Channel\",\n        \"role\": \"bullseye_channel\",\n        \"entityTypeId\": \"acquisition_channel\",\n        \"description\": \"The single best-performing channel\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"acquisition_channel\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"growth_campaign\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"funnel\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"funnel\",\n        \"orientation\": \"vertical\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Systematically test all 19 traction channels to find the one or two that drive scalable growth, avoiding premature commitment to a favourite channel.\",\n      \"core_question\": \"Which of the 19 traction channels is our bullseye, the one that works at our current stage and scale?\",\n      \"when_to_use\": [\n        \"You need to systematically identify and optimise growth levers\",\n        \"User acquisition, activation, or retention metrics need improvement\",\n        \"You want to build a structured growth experimentation practice\"\n      ],\n      \"when_not_to_use\": [\n        \"The product has not yet achieved product-market fit\",\n        \"Growth would scale problems rather than value\"\n      ]\n    }\n  },\n  {\n    \"id\": \"product-led-growth-framework\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"PLG Framework\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Product-led go-to-market motion. Free entry gives users access, the aha moment hooks them, they expand usage within their team, and monetisation captures value from power users.\",\n    \"category\": \"go_to_market\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Wes Bush\",\n      \"description\": \"Coined and formalised by Wes Bush in \\\"Product-Led Growth\\\" (2019). The framework describes how the product itself drives acquisition, activation, and expansion, reducing dependence on sales-led motions.\",\n      \"url\": \"https://www.productled.com/\",\n      \"year\": 2019,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"go_to_market\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Free Entry\",\n        \"role\": \"free_entry\",\n        \"entityTypeId\": \"gtm_strategy\",\n        \"description\": \"How users access the product for free\"\n      },\n      {\n        \"label\": \"Aha Moment\",\n        \"role\": \"aha_moment\",\n        \"entityTypeId\": \"gtm_strategy\",\n        \"description\": \"First experience of core value\"\n      },\n      {\n        \"label\": \"Expansion Motion\",\n        \"role\": \"expansion_motion\",\n        \"entityTypeId\": \"sales_motion\",\n        \"description\": \"How usage spreads within accounts\"\n      },\n      {\n        \"label\": \"Monetisation Trigger\",\n        \"role\": \"monetisation_trigger\",\n        \"entityTypeId\": \"gtm_strategy\",\n        \"description\": \"When and how to convert to paid\"\n      },\n      {\n        \"label\": \"Metric\",\n        \"role\": \"metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Key metric driving the PLG motion\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"gtm_strategy\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"sales_motion\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Design the product itself as the primary growth driver (free tier, self-serve onboarding, in-product virality) to reduce dependence on sales-led acquisition.\",\n      \"core_question\": \"Can our product acquire, activate, and expand users without human intervention, and where in the loop do we still need sales?\",\n      \"when_to_use\": [\n        \"You are launching a new product, feature, or entering a new market\",\n        \"You need to coordinate cross-functional launch activities\",\n        \"You want to define target customers, channels, and messaging\"\n      ],\n      \"when_not_to_use\": [\n        \"The product is mature with established distribution channels\",\n        \"You are iterating on an existing product for existing customers\"\n      ]\n    }\n  },\n  {\n    \"id\": \"gtm-playbook\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"GTM Playbook\",\n    \"version\": \"1.0.0\",\n    \"description\": \"End-to-end go-to-market plan. Covers market analysis, ICP definition, positioning, messaging, channel strategy, launch plan, and success metrics in a sequential flow.\",\n    \"category\": \"go_to_market\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Synthesised from go-to-market practice across product marketing, sales, and customer success. The playbook format coordinates all GTM functions into a single executable plan.\",\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"go_to_market\",\n      \"flow\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Market Analysis\",\n        \"entityTypeId\": \"gtm_strategy\",\n        \"description\": \"Market sizing and competitive landscape\"\n      },\n      {\n        \"label\": \"Ideal Customer Profile\",\n        \"entityTypeId\": \"ideal_customer_profile\",\n        \"description\": \"Ideal customer profile\"\n      },\n      {\n        \"label\": \"Positioning\",\n        \"entityTypeId\": \"positioning\",\n        \"description\": \"How you position against alternatives\"\n      },\n      {\n        \"label\": \"Messaging\",\n        \"entityTypeId\": \"messaging\",\n        \"description\": \"Key messages by audience\"\n      },\n      {\n        \"label\": \"Launch\",\n        \"entityTypeId\": \"launch\",\n        \"description\": \"Launch activities and timeline\"\n      },\n      {\n        \"label\": \"Sales Motion\",\n        \"entityTypeId\": \"sales_motion\",\n        \"description\": \"How you will sell\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"gtm_strategy\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"ideal_customer_profile\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"positioning\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"messaging\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"launch\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"sales_motion\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"flow\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"flow\",\n        \"direction\": \"LR\"\n      },\n      \"colour_by\": \"status\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Orchestrate every go-to-market activity (messaging, channels, pricing, enablement, launch timeline) into a single executable plan.\",\n      \"core_question\": \"Do all go-to-market functions (product, marketing, sales, CS) have a shared plan for how we'll bring this to market?\",\n      \"when_to_use\": [\n        \"You are launching a new product, feature, or entering a new market\",\n        \"You need to coordinate cross-functional launch activities\",\n        \"You want to define target customers, channels, and messaging\"\n      ],\n      \"when_not_to_use\": [\n        \"The product is mature with established distribution channels\",\n        \"You are iterating on an existing product for existing customers\"\n      ]\n    }\n  },\n  {\n    \"id\": \"okr-framework\",\n    \"approach_ids\": [\n      \"plan\"\n    ],\n    \"name\": \"OKR Framework\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Set ambitious Objectives and measure progress with Key Results. Cascades from company to team to individual.\",\n    \"category\": \"strategy\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Andy Grove / John Doerr\",\n      \"description\": \"Invented by Andy Grove at Intel, popularised by John Doerr in Measure What Matters (Portfolio/Penguin).\",\n      \"url\": \"https://www.whatmatters.com/\",\n      \"year\": 1999,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"strategy\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Objective\",\n        \"role\": \"objective\",\n        \"entityTypeId\": \"objective\",\n        \"description\": \"Qualitative, inspiring goal\"\n      },\n      {\n        \"label\": \"Key Result 1\",\n        \"role\": \"key_result\",\n        \"entityTypeId\": \"key_result\",\n        \"description\": \"Measurable outcome proving progress\"\n      },\n      {\n        \"label\": \"Key Result 2\",\n        \"role\": \"key_result\",\n        \"entityTypeId\": \"key_result\",\n        \"description\": \"Measurable outcome proving progress\"\n      },\n      {\n        \"label\": \"Initiatives\",\n        \"role\": \"initiative\",\n        \"entityTypeId\": \"initiative\",\n        \"description\": \"Work streams that drive key results\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"objective\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"key_result\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"initiative\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Align teams around measurable outcomes by pairing ambitious Objectives with concrete Key Results, creating focus and accountability at every level.\",\n      \"core_question\": \"What must we achieve this quarter, and how will we know we succeeded?\",\n      \"when_to_use\": [\n        \"You need to align the team on long-term direction\",\n        \"Market conditions are shifting and you need to reassess positioning\",\n        \"Leadership needs a structured view of strategic options\"\n      ],\n      \"when_not_to_use\": [\n        \"You are in pure execution mode with a clear strategy already set\",\n        \"The team is too early-stage to commit to strategic constraints\"\n      ]\n    }\n  },\n  {\n    \"id\": \"raci-matrix\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"RACI Matrix\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Assign roles: Responsible, Accountable, Consulted, Informed for each activity.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Standard project management tool for role clarity. Origins in 1950s management science.\",\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Activity\",\n        \"role\": \"activity\",\n        \"entityTypeId\": \"key_activity\",\n        \"description\": \"Place persona entities in the Activity position of the matrix\"\n      },\n      {\n        \"label\": \"Responsible\",\n        \"role\": \"responsible\",\n        \"entityTypeId\": \"role\",\n        \"description\": \"Does the work\"\n      },\n      {\n        \"label\": \"Accountable\",\n        \"role\": \"accountable\",\n        \"entityTypeId\": \"role\",\n        \"description\": \"Makes the final call\"\n      },\n      {\n        \"label\": \"Consulted\",\n        \"role\": \"consulted\",\n        \"entityTypeId\": \"role\",\n        \"description\": \"Gives input\"\n      },\n      {\n        \"label\": \"Informed\",\n        \"role\": \"informed\",\n        \"entityTypeId\": \"role\",\n        \"description\": \"Kept in the loop\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"key_activity\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"role\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 3\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Assign Responsible, Accountable, Consulted, and Informed roles for every deliverable so there are no ambiguity gaps and no duplicate ownership.\",\n      \"core_question\": \"For every key deliverable, does exactly one person own the decision (A), and does everyone know their role (R, C, or I)?\",\n      \"when_to_use\": [\n        \"You need to improve team collaboration, clarity, or effectiveness\",\n        \"Roles and responsibilities are unclear or causing friction\",\n        \"You want to establish or improve team processes and ceremonies\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small and informal coordination works well\",\n        \"Process overhead would slow down a team that needs speed\"\n      ]\n    }\n  },\n  {\n    \"id\": \"retrospective\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Retrospective\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Reflect on what went well, what didn't, and what to change. Classic agile ceremony.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Esther Derby & Diana Larsen\",\n      \"description\": \"Core agile ceremony. Formalised in Agile Retrospectives (Pragmatic Bookshelf) by Esther Derby & Diana Larsen.\",\n      \"year\": 2006,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"What Went Well\",\n        \"role\": \"went_well\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"Practices to continue\"\n      },\n      {\n        \"label\": \"What Didn't Go Well\",\n        \"role\": \"went_poorly\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Issues to address\"\n      },\n      {\n        \"label\": \"Action Items\",\n        \"role\": \"action_item\",\n        \"entityTypeId\": \"learning\",\n        \"description\": \"Changes for next iteration\"\n      },\n      {\n        \"label\": \"Learnings\",\n        \"role\": \"learning\",\n        \"entityTypeId\": \"learning\",\n        \"description\": \"Insights to carry forward\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"learning\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Reflect on the last iteration as a team: what went well, what did not, what to try next. Creates a continuous improvement habit.\",\n      \"core_question\": \"What should we start doing, stop doing, and continue doing to work better together?\",\n      \"when_to_use\": [\n        \"You need to improve team collaboration, clarity, or effectiveness\",\n        \"Roles and responsibilities are unclear or causing friction\",\n        \"You want to establish or improve team processes and ceremonies\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small and informal coordination works well\",\n        \"Process overhead would slow down a team that needs speed\"\n      ]\n    }\n  },\n  {\n    \"id\": \"metrics-tree\",\n    \"approach_ids\": [\n      \"trace\"\n    ],\n    \"name\": \"Metrics Tree\",\n    \"version\": \"1.0.0\",\n    \"description\": \"A hierarchical decomposition of a north-star metric into driver metrics and input metrics, making it clear which levers teams can pull to move the top-level outcome.\",\n    \"category\": \"data_analytics\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Amplitude/Reforge\",\n      \"description\": \"Popularised by Amplitude and Reforge around 2018 as growth teams needed to decompose north star metrics into actionable component metrics and identify the highest-leverage improvement opportunities.\",\n      \"url\": \"https://amplitude.com/blog/north-star-metric\",\n      \"year\": 2018,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"data_analytics\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"A measurable indicator at any level of the tree: north star at the root, driver and input metrics as children\"\n      },\n      {\n        \"label\": \"Outcome\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"The business or product outcome the north-star metric is designed to represent\"\n      },\n      {\n        \"label\": \"Dashboard\",\n        \"entityTypeId\": \"dashboard\",\n        \"description\": \"Dashboard visualising the metrics tree and showing real-time progress across levels\"\n      },\n      {\n        \"label\": \"Report\",\n        \"entityTypeId\": \"report\",\n        \"description\": \"Periodic report analysing movement across the tree and attributing changes to specific inputs\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"dashboard\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"report\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\",\n        \"engine\": \"dagre\"\n      },\n      \"colour_by\": \"type\",\n      \"collapsible\": true,\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Decompose a top-level business metric into its component parts and drivers, creating a tree that shows exactly which levers move the number.\",\n      \"core_question\": \"What are the component metrics that drive our north star, and which lever has the most headroom for improvement?\",\n      \"when_to_use\": [\n        \"You need to structure your data architecture or analytics practice\",\n        \"Data quality, governance, or accessibility is a problem\",\n        \"You want to move from ad-hoc analysis to systematic data practices\"\n      ],\n      \"when_not_to_use\": [\n        \"The product generates minimal data that does not warrant formal practices\",\n        \"You are in very early stage where data infrastructure is premature\"\n      ]\n    }\n  },\n  {\n    \"id\": \"team-health-check\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"Team Health Check\",\n    \"version\": \"1.0.0\",\n    \"description\": \"A facilitated team self-assessment across dimensions like mission, fun, learning, speed, and support, using traffic-light voting to surface strengths and improvement areas in a safe format.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Spotify / Kniberg\",\n      \"description\": \"Popularised by Spotify and Henrik Kniberg's Squad Health Check model (2014). Teams self-assess health across dimensions like mission clarity, psychological safety, speed, and learning.\",\n      \"url\": \"https://engineering.atspotify.com/2014/09/squad-health-check-model/\",\n      \"year\": 2014,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Team\",\n        \"entityTypeId\": \"team\",\n        \"description\": \"Team conducting the health check; all members vote anonymously on each dimension\"\n      },\n      {\n        \"label\": \"Retrospective\",\n        \"entityTypeId\": \"retrospective\",\n        \"description\": \"Health check session results feeding into the retrospective discussion and action items\"\n      },\n      {\n        \"label\": \"Metric\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Health dimension scored, e.g. delivering value, teamwork, fun, learning, mission clarity, speed\"\n      },\n      {\n        \"label\": \"Team OKR\",\n        \"entityTypeId\": \"team_okr\",\n        \"description\": \"Team OKR or improvement goal derived from consistently red health check dimensions\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"team\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"retrospective\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"team_okr\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Team\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Retrospective\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Metric\"\n          },\n          {\n            \"property\": \"title\",\n            \"label\": \"Team OKR\",\n            \"sortable\": true\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Regularly assess team health across dimensions (psychological safety, autonomy, mission clarity, fun, speed, learning) to catch problems early and celebrate strengths.\",\n      \"core_question\": \"How is the team really doing: where do they feel strong, where do they feel stuck, and what has changed since last check?\",\n      \"when_to_use\": [\n        \"You need to improve team collaboration, clarity, or effectiveness\",\n        \"Roles and responsibilities are unclear or causing friction\",\n        \"You want to establish or improve team processes and ceremonies\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small and informal coordination works well\",\n        \"Process overhead would slow down a team that needs speed\"\n      ]\n    }\n  },\n  {\n    \"id\": \"raid-log\",\n    \"approach_ids\": [\n      \"inspect\"\n    ],\n    \"name\": \"RAID Log\",\n    \"version\": \"1.0.0\",\n    \"description\": \"A project management register tracking Risks, Assumptions, Issues, and Dependencies, the four categories most likely to derail a project if left unmanaged.\",\n    \"category\": \"program_mgmt\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Standard project management tool used across methodologies. The RAID log (Risks, Assumptions, Issues, Dependencies) provides a single living document for tracking all factors that could derail a programme.\",\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"program_mgmt\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Risk Register\",\n        \"entityTypeId\": \"risk_register\",\n        \"description\": \"Risk or assumption logged with likelihood, impact, owner, and mitigation strategy\"\n      },\n      {\n        \"label\": \"Risk\",\n        \"entityTypeId\": \"risk\",\n        \"description\": \"Individual risk scored by probability and impact; severity = probability * impact\"\n      },\n      {\n        \"label\": \"Dependency\",\n        \"entityTypeId\": \"dependency\",\n        \"description\": \"Dependency on another team, system, or deliverable that could block progress if not resolved\"\n      },\n      {\n        \"label\": \"Status Report\",\n        \"entityTypeId\": \"status_report\",\n        \"description\": \"Status update summarising RAID log changes: new risks, resolved issues, and dependency updates\"\n      },\n      {\n        \"label\": \"Deliverable\",\n        \"entityTypeId\": \"deliverable\",\n        \"description\": \"Deliverable affected by logged risks, issues, or dependencies, linking RAID items to project scope\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"risk_register\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"risk\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"dependency\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"status_report\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"deliverable\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"risk\": [\n          {\n            \"property\": \"probability\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Probability\",\n            \"description\": \"Likelihood the risk materialises (risk.probability assessment)\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Impact\",\n            \"description\": \"Consequence severity if the risk materialises (risk.impact assessment)\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"severity\",\n          \"expression\": \"probability * impact\",\n          \"entity_type\": \"risk\",\n          \"label\": \"Severity\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"risk\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"probability\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Probability\",\n            \"description\": \"Likelihood the risk materialises (risk.probability assessment)\"\n          },\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Impact\",\n            \"description\": \"Consequence severity if the risk materialises (risk.impact assessment)\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"severity\",\n            \"expression\": \"probability * impact\",\n            \"label\": \"Severity\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Item\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Category\"\n          },\n          {\n            \"property\": \"status\",\n            \"label\": \"Status\"\n          },\n          {\n            \"property\": \"description\",\n            \"label\": \"Owner / Action\"\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Track Risks, Assumptions, Issues, and Dependencies in a single living document so the project manager sees all potential blockers in one place.\",\n      \"core_question\": \"What are the current risks, untested assumptions, open issues, and external dependencies that could derail this programme?\",\n      \"when_to_use\": [\n        \"You are managing complex, multi-team initiatives with dependencies\",\n        \"You need to track risks, decisions, and milestones across workstreams\",\n        \"Stakeholders need visibility into programme-level progress\"\n      ],\n      \"when_not_to_use\": [\n        \"The project is small enough for a single team to manage\",\n        \"Formal programme management would create overhead without value\"\n      ]\n    }\n  },\n  {\n    \"id\": \"ice-scoring\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"ICE Scoring\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Rate ideas by Impact, Confidence, and Ease on a 1-10 scale. Multiply for a composite score. Fast and lightweight.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Sean Ellis\",\n      \"description\": \"Created by Sean Ellis as a lightweight growth experiment scoring method. Widely adopted in growth teams.\",\n      \"year\": 2010,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Items to score\",\n        \"role\": \"candidate\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Features or experiments being evaluated\"\n      },\n      {\n        \"label\": \"Impact\",\n        \"role\": \"impact\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"How much will this move the needle?\"\n      },\n      {\n        \"label\": \"Confidence\",\n        \"role\": \"confidence\",\n        \"entityTypeId\": \"assumption\",\n        \"description\": \"How sure are we about the impact?\"\n      },\n      {\n        \"label\": \"Ease\",\n        \"role\": \"ease\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"How easy is this to implement?\"\n      },\n      {\n        \"label\": \"Opportunities to score\",\n        \"role\": \"candidate\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"Opportunities scored on the same ICE Scoring inputs as features.\"\n      },\n      {\n        \"label\": \"Needs to score\",\n        \"role\": \"candidate\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"Needs scored on the same ICE Scoring inputs as features.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"assumption\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"need\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"Expected impact on the target metric (1-10)\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"Confidence in the impact estimate (1-10)\"\n          },\n          {\n            \"property\": \"ease\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Ease\",\n            \"description\": \"Ease of implementation (1-10)\"\n          }\n        ],\n        \"opportunity\": [\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"Expected impact on the target metric (1-10)\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"Confidence in the impact estimate (1-10)\"\n          },\n          {\n            \"property\": \"ease\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Ease\",\n            \"description\": \"Ease of implementation (1-10)\"\n          }\n        ],\n        \"need\": [\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"Expected impact on the target metric (1-10)\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"Confidence in the impact estimate (1-10)\"\n          },\n          {\n            \"property\": \"ease\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Ease\",\n            \"description\": \"Ease of implementation (1-10)\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"ice_score\",\n          \"expression\": \"impact * confidence * ease\",\n          \"entity_type\": \"feature\",\n          \"label\": \"ICE Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"ice_score\",\n          \"expression\": \"impact * confidence * ease\",\n          \"entity_type\": \"opportunity\",\n          \"label\": \"ICE Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"ice_score\",\n          \"expression\": \"impact * confidence * ease\",\n          \"entity_type\": \"need\",\n          \"label\": \"ICE Score\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"feature\",\n          \"opportunity\",\n          \"need\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"impact\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Impact\",\n            \"description\": \"Expected impact on the target metric (1-10)\"\n          },\n          {\n            \"property\": \"confidence\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Confidence\",\n            \"description\": \"Confidence in the impact estimate (1-10)\"\n          },\n          {\n            \"property\": \"ease\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Ease\",\n            \"description\": \"Ease of implementation (1-10)\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"ice_score\",\n            \"expression\": \"impact * confidence * ease\",\n            \"label\": \"ICE Score\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Items to score\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"impact\",\n            \"label\": \"Impact\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"confidence\",\n            \"label\": \"Confidence\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"ease\",\n            \"label\": \"Ease\",\n            \"sortable\": true\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Provide a lightweight scoring model for early-stage ideas when detailed effort estimates are unavailable. Faster than RICE and useful for brainstorm triage.\",\n      \"core_question\": \"Which ideas should we investigate further based on their potential impact, confidence in our assumptions, and implementation ease?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"wsjf\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"WSJF (Weighted Shortest Job First)\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Prioritise work by dividing Cost of Delay (user value + time criticality + risk reduction) by job duration to maximise economic throughput.\",\n    \"category\": \"planning\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Reinertsen / SAFe\",\n      \"description\": \"Developed by Don Reinertsen and adopted as a core practice in the Scaled Agile Framework (SAFe). Combines urgency (Cost of Delay) with job size to produce an economic prioritisation sequence.\",\n      \"url\": \"https://www.scaledagileframework.com/wsjf/\",\n      \"year\": 2011,\n      \"license\": \"open_attribution\"\n    },\n    \"tags\": [\n      \"planning\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Backlog Items\",\n        \"role\": \"candidate\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Backlog Items: feature entries to evaluate\"\n      },\n      {\n        \"label\": \"User/Business Value\",\n        \"role\": \"user_business_value\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"User/Business Value: metric entries to evaluate\"\n      },\n      {\n        \"label\": \"Time Criticality\",\n        \"role\": \"time_criticality\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"How much value decays if delivery is delayed (deadlines, competition, seasonal windows)\"\n      },\n      {\n        \"label\": \"Risk Reduction / Opportunity Enablement\",\n        \"role\": \"risk_reduction\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Risk Reduction / Opportunity Enablement: metric entries to evaluate\"\n      },\n      {\n        \"label\": \"Job Size\",\n        \"role\": \"job_size\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"Estimated effort (story points, t-shirt size, or person-weeks)\"\n      },\n      {\n        \"label\": \"Opportunities to score\",\n        \"role\": \"candidate\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"Opportunities scored on the same WSJF (Weighted Shortest Job First) inputs as features.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"user_value\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"User/Business Value\",\n            \"description\": \"Relative value to users and the business if delivered\"\n          },\n          {\n            \"property\": \"time_criticality\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Time Criticality\",\n            \"description\": \"How much value decays if delivery is delayed (deadlines, competition, seasonal windows)\"\n          },\n          {\n            \"property\": \"risk_reduction\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Risk Reduction / Opportunity Enablement\",\n            \"description\": \"Value from reducing risk or enabling future opportunities\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Estimated effort (story points, t-shirt size, or person-weeks)\"\n          }\n        ],\n        \"opportunity\": [\n          {\n            \"property\": \"user_value\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"User/Business Value\",\n            \"description\": \"Relative value to users and the business if delivered\"\n          },\n          {\n            \"property\": \"time_criticality\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Time Criticality\",\n            \"description\": \"How much value decays if delivery is delayed (deadlines, competition, seasonal windows)\"\n          },\n          {\n            \"property\": \"risk_reduction\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Risk Reduction / Opportunity Enablement\",\n            \"description\": \"Value from reducing risk or enabling future opportunities\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Estimated effort (story points, t-shirt size, or person-weeks)\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"wsjf_score\",\n          \"expression\": \"(user_value + time_criticality + risk_reduction) / job_size\",\n          \"entity_type\": \"feature\",\n          \"label\": \"WSJF Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"wsjf_score\",\n          \"expression\": \"(user_value + time_criticality + risk_reduction) / job_size\",\n          \"entity_type\": \"opportunity\",\n          \"label\": \"WSJF Score\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"feature\",\n          \"opportunity\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"user_value\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"User/Business Value\",\n            \"description\": \"Relative value to users and the business if delivered\"\n          },\n          {\n            \"property\": \"time_criticality\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Time Criticality\",\n            \"description\": \"How much value decays if delivery is delayed (deadlines, competition, seasonal windows)\"\n          },\n          {\n            \"property\": \"risk_reduction\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Risk Reduction / Opportunity Enablement\",\n            \"description\": \"Value from reducing risk or enabling future opportunities\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Estimated effort (story points, t-shirt size, or person-weeks)\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"wsjf_score\",\n            \"expression\": \"(user_value + time_criticality + risk_reduction) / job_size\",\n            \"label\": \"WSJF Score\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Backlog Items\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"user_value\",\n            \"label\": \"User/Business Value\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"time_criticality\",\n            \"label\": \"Time Criticality\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"risk_reduction\",\n            \"label\": \"Risk Reduction / Opportunity Enablement\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"job_size\",\n            \"label\": \"Job Size\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"wsjf_score\",\n            \"label\": \"WSJF Score\",\n            \"sortable\": true\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Prioritise work by dividing the Cost of Delay by job duration, ensuring the most time-sensitive, valuable items are done first.\",\n      \"core_question\": \"Considering the cost of waiting, which items should we start now to maximise economic benefit?\",\n      \"when_to_use\": [\n        \"You need to coordinate work across multiple teams or time horizons\",\n        \"Stakeholders need visibility into what is coming and when\",\n        \"You want to balance commitments with flexibility\"\n      ],\n      \"when_not_to_use\": [\n        \"The team is small enough that informal coordination works\",\n        \"Plans would create false precision about uncertain outcomes\"\n      ]\n    }\n  },\n  {\n    \"id\": \"cost-of-delay\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"Cost of Delay\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Quantify the economic cost of not shipping a feature or opportunity to drive priority decisions. Combines urgency with value.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Don Reinertsen\",\n      \"description\": \"Formalised in The Principles of Product Development Flow (Celeritas Publishing). Foundational to lean product economics.\",\n      \"year\": 2009,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"table\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Items to evaluate\",\n        \"entityTypeId\": \"feature\",\n        \"description\": \"Features or initiatives being assessed\"\n      },\n      {\n        \"label\": \"User-Business Value\",\n        \"entityTypeId\": \"outcome\",\n        \"description\": \"Revenue, retention, or strategic value\"\n      },\n      {\n        \"label\": \"Time Criticality\",\n        \"entityTypeId\": \"metric\",\n        \"description\": \"How much value decays with delay\"\n      },\n      {\n        \"label\": \"Risk Reduction\",\n        \"entityTypeId\": \"risk\",\n        \"description\": \"What risk does this mitigate?\"\n      },\n      {\n        \"label\": \"Opportunities to score\",\n        \"entityTypeId\": \"opportunity\",\n        \"description\": \"Opportunities scored on the same Cost of Delay inputs as features.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"scored_item\"\n        },\n        {\n          \"type\": \"metric\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"outcome\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"risk\",\n          \"role\": \"item\"\n        },\n        {\n          \"type\": \"opportunity\",\n          \"role\": \"scored_item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"cost_of_delay\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Cost of Delay\",\n            \"description\": \"Weekly revenue impact of not shipping\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Weeks of development effort\"\n          }\n        ],\n        \"opportunity\": [\n          {\n            \"property\": \"cost_of_delay\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Cost of Delay\",\n            \"description\": \"Weekly revenue impact of not shipping\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Weeks of development effort\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"wsjf_score\",\n          \"expression\": \"cost_of_delay / job_size\",\n          \"entity_type\": \"feature\",\n          \"label\": \"WSJF Score\",\n          \"format\": \"number\"\n        },\n        {\n          \"property\": \"wsjf_score\",\n          \"expression\": \"cost_of_delay / job_size\",\n          \"entity_type\": \"opportunity\",\n          \"label\": \"WSJF Score\",\n          \"format\": \"number\"\n        }\n      ],\n      \"scoring_method\": {\n        \"applies_to\": [\n          \"feature\",\n          \"opportunity\"\n        ],\n        \"inputs\": [\n          {\n            \"property\": \"cost_of_delay\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Cost of Delay\",\n            \"description\": \"Weekly revenue impact of not shipping\"\n          },\n          {\n            \"property\": \"job_size\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"scope\": \"framework\",\n            \"label\": \"Job Size\",\n            \"description\": \"Weeks of development effort\"\n          }\n        ],\n        \"computed\": [\n          {\n            \"property\": \"wsjf_score\",\n            \"expression\": \"cost_of_delay / job_size\",\n            \"label\": \"WSJF Score\",\n            \"format\": \"number\"\n          }\n        ]\n      }\n    },\n    \"structure\": {\n      \"pattern\": \"table\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"table\",\n        \"columns\": [\n          {\n            \"property\": \"title\",\n            \"label\": \"Items to evaluate\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"cost_of_delay\",\n            \"label\": \"User-Business Value\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"job_size\",\n            \"label\": \"Job Size\",\n            \"sortable\": true\n          },\n          {\n            \"property\": \"wsjf_score\",\n            \"label\": \"CoD Score\",\n            \"sortable\": true\n          }\n        ]\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"type\",\n      \"card_fields\": [\n        \"title\",\n        \"description\",\n        \"status\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Quantify the economic impact of not delivering a feature by a given date, making urgency visible and enabling time-sensitive prioritisation.\",\n      \"core_question\": \"How much value are we losing every week this feature is not in production, and does that urgency justify fast-tracking it?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"five-whys\",\n    \"approach_ids\": [\n      \"reflect\",\n      \"inspect\"\n    ],\n    \"name\": \"Five Whys\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Iteratively ask \\\"why?\\\", typically five times, starting from a symptom; each answer becomes the subject of the next question. The chain of answers reveals the underlying root cause behind the surface problem.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Sakichi Toyoda / Toyota Production System\",\n      \"description\": \"Developed within the Toyota Production System as a root-cause analysis technique. Popularised through Lean and Six Sigma practice; now a widely used incident-review and design-debug staple.\",\n      \"year\": 1930,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"reflection\",\n      \"root_cause\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Symptom\",\n        \"role\": \"symptom\",\n        \"entityTypeId\": \"need\",\n        \"description\": \"The observed problem the analysis starts from.\"\n      },\n      {\n        \"label\": \"Why chain\",\n        \"role\": \"why\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"Each \\\"why?\\\" answer along the chain, typically five iterations deep.\"\n      },\n      {\n        \"label\": \"Root cause\",\n        \"role\": \"root_cause\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"The terminal answer at the bottom of the chain: the underlying cause to address.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"need\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"branch\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Move past surface symptoms by chaining \\\"why?\\\" questions until the underlying root cause surfaces, so fixes target the real driver rather than a downstream effect.\",\n      \"core_question\": \"Why is this happening, and why is THAT happening, until we reach a cause we can act on?\",\n      \"when_to_use\": [\n        \"A problem keeps recurring after surface fixes\",\n        \"Post-incident review where the obvious cause feels too obvious\",\n        \"Designing a fix and you want to confirm you understand the actual driver\"\n      ],\n      \"when_not_to_use\": [\n        \"The problem has multiple independent root causes (use a fishbone or richer RCA tool)\",\n        \"You need quantitative attribution rather than a single-thread narrative\",\n        \"Five linear \\\"whys\\\" oversimplify a systems problem with feedback loops\"\n      ]\n    }\n  },\n  {\n    \"id\": \"pre-mortem\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Pre-mortem\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Imagine the project has already failed; work backward listing the plausible causes of the failure. Produce a risk register and matching mitigations before the work starts.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Gary Klein\",\n      \"description\": \"Popularised by Gary Klein in Harvard Business Review (2007) as a prospective-hindsight technique. Inverts the post-mortem: imagine failure first, then list causes, while there is still time to act.\",\n      \"url\": \"https://hbr.org/2007/09/performing-a-project-premortem\",\n      \"year\": 2007,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"reflection\",\n      \"risk\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Imagined failures\",\n        \"entityTypeId\": \"risk\",\n        \"description\": \"Plausible failure modes named as if they had already occurred.\"\n      },\n      {\n        \"label\": \"Causes\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"For each imagined failure, the contributing causes the team can foresee.\"\n      },\n      {\n        \"label\": \"Mitigations\",\n        \"entityTypeId\": \"initiative\",\n        \"description\": \"Mitigation actions the team will take before failure can occur.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"risk\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"initiative\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Surface project risks early by inverting hindsight: imagine the project has already failed and ask why, while there is still time to mitigate.\",\n      \"core_question\": \"It is six months from now and the project has failed catastrophically. What happened, and why?\",\n      \"when_to_use\": [\n        \"Kicking off a project with significant downside or irreversible commitment\",\n        \"A plan looks too clean and the team senses unspoken concerns\",\n        \"Stakeholders disagree on risk; the exercise externalises and ranks them\"\n      ],\n      \"when_not_to_use\": [\n        \"The work is small, reversible, and cheap to course-correct\",\n        \"The team is in execution mode and reflective ceremonies will derail momentum\",\n        \"Risk surfacing has become performative: the team names risks but never mitigates them\"\n      ]\n    }\n  },\n  {\n    \"id\": \"red-team\",\n    \"approach_ids\": [\n      \"reflect\",\n      \"inspect\"\n    ],\n    \"name\": \"Red Team\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Structured adversarial review. A designated group is assigned to attack a plan, design, or proposal from an outside-in stance, surfacing weaknesses the inside-out builders cannot see.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"US Department of Defense (Cold War era); broadened by security and intelligence practice\",\n      \"description\": \"Originated in Cold War-era military strategic exercises (\\\"red\\\" team takes the adversary role against the \\\"blue\\\" team's defence). Adopted by cybersecurity, intelligence analysis, and product teams as a structured contrarian-review practice.\",\n      \"year\": 1960,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"reflection\",\n      \"adversarial\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Target\",\n        \"entityTypeId\": \"initiative\",\n        \"description\": \"The plan, design, or proposal under adversarial review.\"\n      },\n      {\n        \"label\": \"Attack vectors\",\n        \"entityTypeId\": \"risk\",\n        \"description\": \"The angles the red team uses to probe weaknesses.\"\n      },\n      {\n        \"label\": \"Findings\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"Weaknesses, blind spots, or unstated assumptions surfaced by the review.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"initiative\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"risk\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Stress-test a plan against an explicit adversary by assigning reviewers to attack rather than agree, so weaknesses surface before reality finds them.\",\n      \"core_question\": \"If a competent adversary wanted this to fail, where would they push first, and would we hold?\",\n      \"when_to_use\": [\n        \"A high-stakes decision, launch, or security posture needs hardening\",\n        \"Inside-out thinking is dominant and dissent has gone quiet\",\n        \"Risk register is suspiciously short for the size of the bet\"\n      ],\n      \"when_not_to_use\": [\n        \"Early-stage exploration where adversarial framing would crush a fragile idea prematurely\",\n        \"Team trust is too low: red-teaming will read as personal attack rather than role-play\",\n        \"The work is small enough that a lightweight devil's-advocate pass is sufficient\"\n      ]\n    }\n  },\n  {\n    \"id\": \"devils-advocate\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Devil's Advocate\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Designate one reviewer to formally take the opposing position regardless of personal view. The assigned-role contrarian defangs groupthink by making dissent legitimate and structured.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Roman Catholic Church (advocatus diaboli); broadened by decision-quality practice\",\n      \"description\": \"Originated in 16th-century canonisation proceedings as the advocatus diaboli, an official assigned to argue against canonising a candidate. Adopted by decision-science and product-team practice as a structured antidote to groupthink.\",\n      \"year\": 1587,\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"reflection\",\n      \"decision_quality\",\n      \"collection\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Proposal\",\n        \"entityTypeId\": \"initiative\",\n        \"description\": \"The plan or recommendation under consideration.\"\n      },\n      {\n        \"label\": \"Opposing arguments\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"The case against the proposal, voiced by the assigned contrarian regardless of personal view.\"\n      },\n      {\n        \"label\": \"Counter-evidence\",\n        \"entityTypeId\": \"evidence\",\n        \"description\": \"Data points the contrarian raises that the proposal does not yet account for.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"initiative\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"evidence\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"collection\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"grid\",\n        \"groupBy\": \"type\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Make dissent a legitimate role rather than a personal stance. Assigning one reviewer to argue against the proposal forces the team to confront the strongest counter-case.\",\n      \"core_question\": \"If we had to argue against this proposal (not because we believe it, but because the role demands it) what is the strongest case?\",\n      \"when_to_use\": [\n        \"A decision is heading toward consensus and you suspect groupthink\",\n        \"Stakes are high and the team has not heard a serious counter-argument\",\n        \"Cultural norms make raw dissent costly; assigning the role lowers the social cost\"\n      ],\n      \"when_not_to_use\": [\n        \"Genuine disagreement already exists in the room (let it surface; do not theatricalise it)\",\n        \"The decision is small enough that the ceremony costs more than the insight returned\",\n        \"The assigned contrarian will be punished socially for the role; set the norms first or skip\"\n      ]\n    }\n  },\n  {\n    \"id\": \"second-order-thinking\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Second-order Thinking\",\n    \"version\": \"1.0.0\",\n    \"description\": \"After deciding a move, ask \\\"and then what?\\\" repeatedly. Trace second-, third-, and higher-order consequences to surface downstream effects that first-order reasoning misses.\",\n    \"category\": \"team_process\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Howard Marks / Charlie Munger\",\n      \"description\": \"Howard Marks distinguished first-order vs second-order thinking in The Most Important Thing (2011) as the essential discipline of consequential decision-making. Charlie Munger's \\\"and then what?\\\" framing is the practical heuristic.\",\n      \"url\": \"https://www.oaktreecapital.com/insights/memo/dare-to-be-great-ii\",\n      \"year\": 2011,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"team_process\",\n      \"reflection\",\n      \"consequences\",\n      \"tree\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"First-order move\",\n        \"role\": \"first_order\",\n        \"entityTypeId\": \"decision\",\n        \"description\": \"The decision or move under consideration.\"\n      },\n      {\n        \"label\": \"Second-order consequences\",\n        \"role\": \"second_order\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"Downstream effects that follow from the first-order move.\"\n      },\n      {\n        \"label\": \"Higher-order consequences\",\n        \"role\": \"higher_order\",\n        \"entityTypeId\": \"insight\",\n        \"description\": \"Third-, fourth-, fifth-order ripples: second-order consequences of the second-order consequences.\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"decision\",\n          \"role\": \"root\"\n        },\n        {\n          \"type\": \"insight\",\n          \"role\": \"branch\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"tree\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"tree\",\n        \"direction\": \"TB\"\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Resist first-order reasoning by chaining \\\"and then what?\\\" until non-obvious downstream consequences come into view.\",\n      \"core_question\": \"If we make this move and it works, what does the world look like next, and is that the world we want?\",\n      \"when_to_use\": [\n        \"A decision has feedback loops, market reactions, or behavioural ripples\",\n        \"The first-order case is compelling, which is exactly when downstream effects bite\",\n        \"Considering an irreversible or large-scale commitment\"\n      ],\n      \"when_not_to_use\": [\n        \"Routine, reversible, low-blast-radius decisions where deliberation costs more than mistakes\",\n        \"Higher-order branches diverge into pure speculation with no anchor in evidence\",\n        \"Time pressure makes a deeper trace expensive and the first-order call is good enough\"\n      ]\n    }\n  },\n  {\n    \"id\": \"value-vs-effort\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"Value vs Effort\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Plot features on a 2x2 matrix of value against effort. Quick wins (high value, low effort) get prioritised first.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"description\": \"Common product management prioritisation tool. A simplified form of cost-benefit analysis.\",\n      \"license\": \"cc_by\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"quadrant\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Quick Wins\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"quick_win\",\n        \"description\": \"High value, low effort: do first\"\n      },\n      {\n        \"label\": \"Big Bets\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"big_bet\",\n        \"description\": \"High value, high effort: plan carefully\"\n      },\n      {\n        \"label\": \"Fill-ins\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"fill_in\",\n        \"description\": \"Low value, low effort: do when idle\"\n      },\n      {\n        \"label\": \"Avoid\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"money_pit\",\n        \"description\": \"Low value, high effort: deprioritise\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"value\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Value\",\n            \"description\": \"Expected business value (1-10)\"\n          },\n          {\n            \"property\": \"effort\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Effort\",\n            \"description\": \"Implementation effort (1-10)\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"value_effort_ratio\",\n          \"expression\": \"value / effort\",\n          \"entity_type\": \"feature\",\n          \"label\": \"Value/Effort Ratio\",\n          \"format\": \"number\"\n        }\n      ]\n    },\n    \"structure\": {\n      \"pattern\": \"quadrant\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"quadrant\",\n        \"x_axis\": \"impact\",\n        \"y_axis\": \"effort\",\n        \"x_label\": \"Quick Wins\",\n        \"y_label\": \"Big Bets\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Plot features on a value/effort matrix to identify quick wins (high value, low effort) and avoid resource traps (low value, high effort).\",\n      \"core_question\": \"Which features give us the best return on engineering investment, and which are traps disguised as good ideas?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"eisenhower-matrix\",\n    \"approach_ids\": [\n      \"prioritise\"\n    ],\n    \"name\": \"Eisenhower Matrix\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Classify tasks by urgency and importance into four quadrants: do, schedule, delegate, or eliminate.\",\n    \"category\": \"prioritization\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Dwight D. Eisenhower\",\n      \"description\": \"Based on a quote attributed to Eisenhower: 'What is important is seldom urgent and what is urgent is seldom important.' Popularised by Stephen Covey.\",\n      \"license\": \"public_domain\"\n    },\n    \"tags\": [\n      \"prioritization\",\n      \"quadrant\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Do First\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"do_first\",\n        \"description\": \"Urgent and important: act immediately\"\n      },\n      {\n        \"label\": \"Schedule\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"schedule\",\n        \"description\": \"Important but not urgent: plan it\"\n      },\n      {\n        \"label\": \"Delegate\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"delegate\",\n        \"description\": \"Urgent but not important: hand off\"\n      },\n      {\n        \"label\": \"Eliminate\",\n        \"entityTypeId\": \"feature\",\n        \"role\": \"eliminate\",\n        \"description\": \"Neither urgent nor important: drop it\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"feature\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {\n        \"feature\": [\n          {\n            \"property\": \"urgency\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Urgency\",\n            \"description\": \"How time-sensitive is this? (1-5)\"\n          },\n          {\n            \"property\": \"importance\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"label\": \"Importance\",\n            \"description\": \"How important is this to goals? (1-5)\"\n          }\n        ]\n      },\n      \"computed_properties\": [\n        {\n          \"property\": \"priority_score\",\n          \"expression\": \"(urgency * 2) + importance\",\n          \"entity_type\": \"feature\",\n          \"label\": \"Priority Score\",\n          \"format\": \"number\"\n        }\n      ]\n    },\n    \"structure\": {\n      \"pattern\": \"quadrant\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"quadrant\",\n        \"x_axis\": \"impact\",\n        \"y_axis\": \"effort\",\n        \"x_label\": \"Do First\",\n        \"y_label\": \"Schedule\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Sort tasks by urgency and importance into four quadrants, making it clear what to do now, schedule, delegate, or eliminate.\",\n      \"core_question\": \"Am I spending my time on what matters most, or am I trapped in the urgent-but-unimportant quadrant?\",\n      \"when_to_use\": [\n        \"You have more ideas or features than capacity to build them\",\n        \"Stakeholders disagree on what to build next\",\n        \"You need a transparent, defensible prioritisation process\"\n      ],\n      \"when_not_to_use\": [\n        \"You have a single obvious next step with no contention\",\n        \"The backlog is small enough to sequence intuitively\"\n      ]\n    }\n  },\n  {\n    \"id\": \"four-forces-of-progress\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Four Forces of Progress\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Analyse the four forces that drive or inhibit customers switching to a new solution: Push, Pull, Anxiety, and Habit.\",\n    \"category\": \"discovery\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"Bob Moesta\",\n      \"description\": \"Demand-Side Sales 101\",\n      \"url\": \"https://jobstobedone.org/\",\n      \"year\": 2014,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"discovery\",\n      \"matrix\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Push of Current Situation\",\n        \"entityTypeId\": \"need\",\n        \"role\": \"push\",\n        \"description\": \"Place need entities in the Push of Current Situation position of the matrix\"\n      },\n      {\n        \"label\": \"Pull of New Solution\",\n        \"entityTypeId\": \"desired_outcome\",\n        \"role\": \"pull\",\n        \"description\": \"Place desired outcome entities in the Pull of New Solution position of the matrix\"\n      },\n      {\n        \"label\": \"Anxiety of New Solution\",\n        \"entityTypeId\": \"switching_cost\",\n        \"role\": \"anxiety\",\n        \"description\": \"Place switching cost entities in the Anxiety of New Solution position of the matrix\"\n      },\n      {\n        \"label\": \"Habit of Current Situation\",\n        \"entityTypeId\": \"switching_cost\",\n        \"role\": \"habit\",\n        \"description\": \"Place switching cost entities in the Habit of Current Situation position of the matrix\"\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"need\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"switching_cost\",\n          \"role\": \"bucket\"\n        },\n        {\n          \"type\": \"desired_outcome\",\n          \"role\": \"bucket\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"matrix\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"matrix\",\n        \"rows\": 2,\n        \"cols\": 2\n      },\n      \"sort_by\": {\n        \"property\": \"title\",\n        \"direction\": \"asc\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Map the four forces that drive or resist a customer's switch to a new solution (Push, Pull, Anxiety, Habit) to understand why people change (or don't).\",\n      \"core_question\": \"Are the push and pull forces strong enough to overcome the anxiety of the new and the comfort of the familiar?\",\n      \"when_to_use\": [\n        \"You need to understand unmet user needs before committing to solutions\",\n        \"The problem space is ambiguous and requires structured exploration\",\n        \"You want to reduce the risk of building the wrong thing\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is well-understood and validated\",\n        \"You are in a delivery phase with clear requirements\"\n      ]\n    }\n  },\n  {\n    \"id\": \"assumption-map\",\n    \"approach_ids\": [\n      \"reflect\"\n    ],\n    \"name\": \"Assumption Map\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Plot assumptions on axes of uncertainty vs risk. Most risky + most uncertain = test first.\",\n    \"category\": \"validation\",\n    \"origin\": {\n      \"type\": \"practitioner\",\n      \"attribution\": \"David Bland\",\n      \"description\": \"Published in Testing Business Ideas (Wiley). Prioritises which assumptions to validate first.\",\n      \"url\": \"https://www.strategyzer.com/books/testing-business-ideas\",\n      \"year\": 2019,\n      \"license\": \"published_methodology\"\n    },\n    \"tags\": [\n      \"validation\",\n      \"quadrant\"\n    ],\n    \"slots\": [\n      {\n        \"label\": \"Test First\",\n        \"entityTypeId\": \"assumption\",\n        \"role\": \"test_first\",\n        \"description\": \"High risk, low confidence: validate immediately\",\n        \"predicate\": [\n          {\n            \"scope\": \"entity\",\n            \"property\": \"risk_level\",\n            \"op\": \"band\",\n            \"value\": [\n              4,\n              6\n            ]\n          },\n          {\n            \"scope\": \"entity\",\n            \"property\": \"confidence\",\n            \"op\": \"band\",\n            \"value\": [\n              1,\n              4\n            ]\n          }\n        ]\n      },\n      {\n        \"label\": \"Research\",\n        \"entityTypeId\": \"assumption\",\n        \"role\": \"research\",\n        \"description\": \"Low risk, low confidence: learn more\",\n        \"predicate\": [\n          {\n            \"scope\": \"entity\",\n            \"property\": \"risk_level\",\n            \"op\": \"band\",\n            \"value\": [\n              1,\n              4\n            ]\n          },\n          {\n            \"scope\": \"entity\",\n            \"property\": \"confidence\",\n            \"op\": \"band\",\n            \"value\": [\n              1,\n              4\n            ]\n          }\n        ]\n      },\n      {\n        \"label\": \"Monitor\",\n        \"entityTypeId\": \"assumption\",\n        \"role\": \"monitor\",\n        \"description\": \"High risk but well understood: watch closely\",\n        \"predicate\": [\n          {\n            \"scope\": \"entity\",\n            \"property\": \"risk_level\",\n            \"op\": \"band\",\n            \"value\": [\n              4,\n              6\n            ]\n          },\n          {\n            \"scope\": \"entity\",\n            \"property\": \"confidence\",\n            \"op\": \"band\",\n            \"value\": [\n              4,\n              6\n            ]\n          }\n        ]\n      },\n      {\n        \"label\": \"Accept\",\n        \"entityTypeId\": \"assumption\",\n        \"role\": \"accept\",\n        \"description\": \"Low risk, high confidence: safe to proceed\",\n        \"predicate\": [\n          {\n            \"scope\": \"entity\",\n            \"property\": \"risk_level\",\n            \"op\": \"band\",\n            \"value\": [\n              1,\n              4\n            ]\n          },\n          {\n            \"scope\": \"entity\",\n            \"property\": \"confidence\",\n            \"op\": \"band\",\n            \"value\": [\n              4,\n              6\n            ]\n          }\n        ]\n      }\n    ],\n    \"data\": {\n      \"entity_types\": [\n        {\n          \"type\": \"assumption\",\n          \"role\": \"item\"\n        }\n      ],\n      \"required_properties\": {}\n    },\n    \"structure\": {\n      \"pattern\": \"quadrant\"\n    },\n    \"presentation\": {\n      \"layout\": {\n        \"type\": \"quadrant\",\n        \"x_axis\": \"confidence\",\n        \"y_axis\": \"risk_level\",\n        \"x_label\": \"Confidence\",\n        \"y_label\": \"Risk\"\n      },\n      \"colour_by\": \"group\",\n      \"card_fields\": [\n        \"title\",\n        \"description\"\n      ]\n    },\n    \"education\": {\n      \"purpose\": \"Plot assumptions on a risk/evidence matrix so teams test the most dangerous unknowns first instead of building on unvalidated beliefs.\",\n      \"core_question\": \"Which assumptions carry the most risk and the least evidence? Where do we run experiments first?\",\n      \"when_to_use\": [\n        \"You have hypotheses about user needs or solutions that need testing\",\n        \"You want to reduce risk before committing engineering resources\",\n        \"The team is debating assumptions that can be tested empirically\"\n      ],\n      \"when_not_to_use\": [\n        \"The solution is already validated through real usage data\",\n        \"Speed of shipping matters more than certainty about assumptions\"\n      ]\n    }\n  }\n] as UPGFramework[]\n\n/** Framework lookup by ID */\nexport const UPG_FRAMEWORKS_BY_ID: Record<string, UPGFramework> = Object.fromEntries(\n  UPG_FRAMEWORKS.map((fw) => [fw.id, fw]),\n)\n\n/** Frameworks grouped by category */\nexport const UPG_FRAMEWORKS_BY_CATEGORY: Record<string, UPGFramework[]> = {}\nfor (const fw of UPG_FRAMEWORKS) {\n  if (!UPG_FRAMEWORKS_BY_CATEGORY[fw.category]) UPG_FRAMEWORKS_BY_CATEGORY[fw.category] = []\n  UPG_FRAMEWORKS_BY_CATEGORY[fw.category].push(fw)\n}\n","/**\n * UPG Document Validator. Validates a `UPGDocument` against the spec. Zero dependencies.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGDocument } from '../shapes/document.js'\nimport { UPG_CROSS_EDGE_TYPES } from '../shapes/document.js'\nimport { UPG_EDGE_CATALOG } from '../catalog/edge-catalog.js'\nimport { getTypes } from '../registry/domains.js'\nimport { getPropertySchema, type PropertyDefinition } from '../properties/property-schema.js'\nimport { UPG_FRAMEWORKS_BY_ID } from '../frameworks/canonical.js'\nimport type { UPGFramework, FrameworkPropertyRequirement } from '../frameworks/types.js'\nimport { getScale } from './scales.js'\n\n/**\n * Cross-product edge types must live in `portfolio.cross_edges[]`, not in a\n * product's `edges[]`. Finding one in `edges[]` is a spec violation. The\n * `migrate_cross_edges` MCP tool moves them to the correct location.\n */\nconst crossProductEdgeTypeSet: ReadonlySet<string> = new Set(UPG_CROSS_EDGE_TYPES)\n// A type registered in BOTH the within-product catalogue and the cross-edge\n// registry is dual-registered (e.g. `feature_rivals_competitor_feature`, UPG\n// 0.10.0 #38): it is a legitimate within-product edge AND a cross-product edge.\n// The \"must live in portfolio.cross_edges[]\" check below applies only to types\n// that are cross-product-ONLY, so a within-product parity edge in product\n// edges[] is not flagged.\nconst withinProductEdgeTypeSet: ReadonlySet<string> = new Set(Object.keys(UPG_EDGE_CATALOG))\n\nexport interface UPGValidationError {\n  /** JSON-path location of the field that failed validation (e.g. `$.nodes[2].type`) */\n  path: string\n  /** Human-readable description of the validation failure */\n  message: string\n}\n\nexport interface UPGValidationResult {\n  /** Whether the document passed all mandatory spec checks */\n  valid: boolean\n  /** Spec violations: any entry here means `valid` is false */\n  errors: UPGValidationError[]\n  /** Best-practice notices: present even when `valid` is true */\n  warnings: UPGValidationWarning[]\n}\n\nexport interface UPGValidationWarning {\n  /** JSON-path location of the field that triggered the warning */\n  path: string\n  /** Human-readable description of the best-practice notice */\n  message: string\n  /**\n   * Stable machine-readable category for the warning, when it belongs to one\n   * of the content-depth checks. Lets consumers (e.g. the CLI `verify`\n   * command) select a specific class of finding without parsing `message`.\n   *\n   * These are surfaced as warnings (not errors) on purpose: the document\n   * LOAD path throws on any `errors[]` entry, and real graphs already carry\n   * known drift (non-canonical enum values, primitive-where-assessment).\n   * Promoting them to errors would brick those graphs on load. `verify`\n   * re-runs the validator and re-classifies these as policy violations so a\n   * CI gate still fails, without making the parser refuse to read the file.\n   */\n  rule?: 'property-type' | 'property-enum' | 'self-loop' | 'framework-score'\n}\n\n/**\n * Warning `rule` codes for the content-depth checks.\n * `verify`/`check` treat a document carrying any of these as a policy\n * violation (exit 2) even though they never block the load path.\n *\n * - `property-type` / `property-enum` / `self-loop` — UPG-632.\n * - `framework-score` — UPG-638. A `framework_exercise`'s persisted per-entity\n *   result (carried on its `framework_exercise_includes_node` edge properties)\n *   that violates the framework's own input spec: an invalid enum bucket, a\n *   non-numeric / out-of-scale / negative score, or a zero in a divisor input\n *   (e.g. RICE `effort`, WSJF `job_size`). A WARNING, not an error: a drifted\n *   exercise still LOADS, consistent with the severity discipline above. See\n *   `validateFrameworkScores`.\n */\nexport const CONTENT_DEPTH_WARNING_RULES: ReadonlySet<NonNullable<UPGValidationWarning['rule']>> = new Set([\n  'property-type',\n  'property-enum',\n  'self-loop',\n  'framework-score',\n])\n\n/**\n * Validates a UPGDocument against the UPG v0.2 specification.\n *\n * Returns a result object with `valid`, `errors`, and `warnings`.\n * Errors are spec violations. Warnings are best-practice notices.\n * Unknown node types and edge types produce warnings, not errors.\n *\n * @example\n * const result = validateUPGDocument({\n *   upg_version: '0.2.0',\n *   exported_at: '2026-04-17T10:00:00Z',\n *   source: { tool: 'entopo', tool_version: '0.1.0' },\n *   product: { id: 'p1', title: 'My Product' },\n *   nodes: [{ id: 'n1', type: 'persona', title: 'Creator' }],\n *   edges: [],\n * })\n * // result.valid    === true\n * // result.errors   === []\n * // result.warnings === []   // unless an unknown type slipped in\n */\nexport function validateUPGDocument(doc: unknown): UPGValidationResult {\n  const errors: UPGValidationError[] = []\n  const warnings: UPGValidationWarning[] = []\n\n  if (!doc || typeof doc !== 'object') {\n    return { valid: false, errors: [{ path: '$', message: 'Document must be an object' }], warnings }\n  }\n\n  const d = doc as Record<string, unknown>\n\n  // Required top-level fields.\n  //\n  // PATHS NAME THE FIELD AS IT IS ON DISK, not as it is after normalisation\n  // (corrected 0.34.1). `normalizeDocument` lifts the `$upg` envelope into a\n  // flat in-memory shape before this runs, and these two errors used to report\n  // that flat shape: `$.upg_version` and `$.exported_at`. No `.upg` file in\n  // existence carries either name, so a reader who searched their file for\n  // `upg_version` found nothing, searched the docs and found nothing, and\n  // concluded the format was undocumented. An error message is read by someone\n  // holding the FILE.\n  if (!d.upg_version || typeof d.upg_version !== 'string') {\n    errors.push({\n      path: '$upg.spec_version',\n      message: 'spec_version is required and must be a string',\n    })\n  }\n  if (!d.exported_at || typeof d.exported_at !== 'string') {\n    errors.push({\n      path: '$upg.provenance.exported_at',\n      message: 'provenance.exported_at is required and must be an ISO 8601 string',\n    })\n  }\n  if (!d.source || typeof d.source !== 'object') {\n    errors.push({ path: '$.source', message: 'source is required and must be an object' })\n  } else {\n    const source = d.source as Record<string, unknown>\n    if (!source.tool || typeof source.tool !== 'string') {\n      errors.push({ path: '$.source.tool', message: 'source.tool is required and must be a string' })\n    }\n  }\n  if (!d.product || typeof d.product !== 'object') {\n    errors.push({ path: '$.product', message: 'product is required and must be an object' })\n  } else {\n    const product = d.product as Record<string, unknown>\n    if (!product.id || typeof product.id !== 'string') {\n      errors.push({ path: '$.product.id', message: 'product.id is required and must be a string' })\n    }\n    if (!product.title || typeof product.title !== 'string') {\n      errors.push({ path: '$.product.title', message: 'product.title is required and must be a string' })\n    }\n  }\n\n  // Build lookup sets from the registry\n  const allKnownTypes = new Set(getTypes())\n  const allKnownEdgeTypes = new Set(Object.keys(UPG_EDGE_CATALOG))\n\n  // Nodes\n  // UPG-641 (defense-in-depth): `nodes` must be an array. A present-but-non-array\n  // value (`nodes: 42`, `nodes: {}`) would otherwise reach a downstream `.map`\n  // and throw a raw, location-less TypeError on the load path. Distinguish the\n  // missing case from the wrong-type case so the failure is self-explaining.\n  // (The SDK load path also guards before `.map`; this is the validator layer.)\n  if (!Array.isArray(d.nodes)) {\n    errors.push({\n      path: '$.nodes',\n      message: d.nodes === undefined\n        ? 'nodes is required and must be an array'\n        : `nodes must be an array, got ${describeKind(d.nodes)}`,\n    })\n  } else {\n    const nodeIds = new Set<string>()\n    // Lookup by id, used for cross-property referential checks (empty-cell detection).\n    const nodesById = new Map<string, Record<string, unknown>>()\n    d.nodes.forEach((node: unknown, i: number) => {\n      const path = `$.nodes[${i}]`\n      if (!node || typeof node !== 'object') {\n        errors.push({ path, message: 'Each node must be an object' })\n        return\n      }\n      const n = node as Record<string, unknown>\n      if (!n.id || typeof n.id !== 'string') {\n        errors.push({ path: `${path}.id`, message: 'Node id is required and must be a string' })\n      } else {\n        if (nodeIds.has(n.id as string)) {\n          errors.push({ path: `${path}.id`, message: `Duplicate node id: ${n.id}` })\n        }\n        nodeIds.add(n.id as string)\n        nodesById.set(n.id as string, n)\n      }\n      if (!n.type || typeof n.type !== 'string') {\n        errors.push({ path: `${path}.type`, message: 'Node type is required and must be a string' })\n      } else if (!allKnownTypes.has(n.type as string)) {\n        warnings.push({ path: `${path}.type`, message: `Unknown UPG type: \"${n.type}\". Node will be preserved with its original type.` })\n      }\n      if (!n.title || typeof n.title !== 'string') {\n        errors.push({ path: `${path}.title`, message: 'Node title is required and must be a string' })\n      } else if (n.title.trim().length === 0) {\n        // Trim before the required-title check so whitespace-only titles\n        // (e.g. \"   \") are caught symmetrically with the empty string \"\".\n        // A truthy-but-blank title is still a missing title. Mirrors the CLI\n        // write-side guard (PR #1935 / UPG-628).\n        errors.push({ path: `${path}.title`, message: 'Node title must not be blank (whitespace-only)' })\n      }\n\n      // ── properties container shape (UPG-639) ────────────────────────\n      // `properties`, when present, must be a non-null plain object. A node\n      // built with `--data` type confusion can carry `properties: 42`,\n      // `properties: [1,2,3]`, or `properties: true`; today those slip\n      // through (the per-property checks below silently skip a non-object)\n      // and `verify` reports \"all checks passed\". This is a STRUCTURAL error\n      // (not a content-depth warning): the field is malformed, not merely\n      // drifted, so both reads and `verify` should surface it (exit 2).\n      if (n.properties !== undefined && n.properties !== null) {\n        if (typeof n.properties !== 'object' || Array.isArray(n.properties)) {\n          errors.push({\n            path: `${path}.properties`,\n            message: `Node properties must be a plain object when present, got ${describeKind(n.properties)}.`,\n          })\n        }\n      }\n\n      // ── property type + enum depth (UPG-632 / F5) ───────────────────\n      // Validate each present property against the entity schema's declared\n      // type and enum membership. Emitted as WARNINGS, never errors: real\n      // graphs carry known drift and the load path throws on any error.\n      if (typeof n.type === 'string') {\n        validateNodeProperties(n, `${path}`, warnings)\n      }\n    })\n\n    // Edges\n    // UPG-641 (defense-in-depth): same array-shape guard as `nodes` above.\n    if (!Array.isArray(d.edges)) {\n      errors.push({\n        path: '$.edges',\n        message: d.edges === undefined\n          ? 'edges is required and must be an array'\n          : `edges must be an array, got ${describeKind(d.edges)}`,\n      })\n    } else {\n      d.edges.forEach((edge: unknown, i: number) => {\n        const path = `$.edges[${i}]`\n        if (!edge || typeof edge !== 'object') {\n          errors.push({ path, message: 'Each edge must be an object' })\n          return\n        }\n        const e = edge as Record<string, unknown>\n        if (!e.id || typeof e.id !== 'string') {\n          errors.push({ path: `${path}.id`, message: 'Edge id is required and must be a string' })\n        }\n        if (\n          typeof e.type === 'string' &&\n          crossProductEdgeTypeSet.has(e.type) &&\n          !withinProductEdgeTypeSet.has(e.type)\n        ) {\n          errors.push({\n            path: `${path}.type`,\n            message: `Cross-product edge type \"${e.type}\" must live in portfolio.cross_edges[], not product edges[].`,\n          })\n          return\n        }\n        if (!e.source || typeof e.source !== 'string') {\n          errors.push({ path: `${path}.source`, message: 'Edge source is required and must be a string' })\n        } else if (!nodeIds.has(e.source as string)) {\n          errors.push({ path: `${path}.source`, message: `Edge source references unknown node id: ${e.source}` })\n        }\n        if (!e.target || typeof e.target !== 'string') {\n          errors.push({ path: `${path}.target`, message: 'Edge target is required and must be a string' })\n        } else if (!nodeIds.has(e.target as string)) {\n          errors.push({ path: `${path}.target`, message: `Edge target references unknown node id: ${e.target}` })\n        }\n        // ── self-loop detection (UPG-632 / F8) ────────────────────────\n        // An edge whose source and target are the same node is almost always\n        // an authoring error. Surfaced as a WARNING (not an error) so it does\n        // not throw on the load path; `verify` re-classifies it as a policy\n        // violation. See CONTENT_DEPTH_WARNING_RULES.\n        if (typeof e.source === 'string' && typeof e.target === 'string' && e.source === e.target) {\n          warnings.push({\n            path: `${path}`,\n            message: `Self-loop edge: source and target are the same node (\"${e.source}\"). A node related to itself is almost always an error.`,\n            rule: 'self-loop',\n          })\n        }\n        if (!e.type || typeof e.type !== 'string') {\n          errors.push({ path: `${path}.type`, message: 'Edge type is required and must be a string' })\n        } else if (!allKnownEdgeTypes.has(e.type as string)) {\n          warnings.push({\n            path: `${path}.type`,\n            message: `Unknown edge type: \"${e.type}\". Edge preserved but not in the edge registry.`,\n          })\n        }\n      })\n\n      // ── empty_cells referential integrity ────────────────────────\n      // For every competitive_analysis carrying `empty_cells`, validate that:\n      //   1. Each *_value_ref points at a known node id.\n      //   2. The referenced node has type `classification_value`.\n      //   3. The two referenced values descend from *distinct*\n      //      `classification_axis` parents (axis A × axis B; never axis A × axis A).\n      // Axis-parentage is resolved via `classification_axis_includes_classification_value`\n      // hierarchy edges, then by `parent_id` (Entopo runtime extension) as a fallback.\n      //\n      // Soft advisory (warning, not error):\n      //   - The parent `competitive_analysis` should be dimensioned by exactly\n      //     2 axes (the matrix shape that gives `empty_cells` its meaning).\n      const valueToAxis = new Map<string, string>()\n      const edgesArr = d.edges as unknown[]\n      for (const edge of edgesArr) {\n        if (!edge || typeof edge !== 'object') continue\n        const e = edge as Record<string, unknown>\n        if (e.type === 'classification_axis_includes_classification_value'\n            && typeof e.source === 'string'\n            && typeof e.target === 'string') {\n          valueToAxis.set(e.target, e.source)\n        }\n      }\n      // Fallback: parent_id on the value node (Entopo runtime extension).\n      for (const [id, n] of nodesById.entries()) {\n        if (n.type !== 'classification_value') continue\n        if (valueToAxis.has(id)) continue\n        const pid = (n as Record<string, unknown>).parent_id\n        if (typeof pid === 'string') {\n          const parent = nodesById.get(pid)\n          if (parent && parent.type === 'classification_axis') {\n            valueToAxis.set(id, pid)\n          }\n        }\n      }\n      // Count axes per competitive_analysis (for the soft advisory).\n      const axesPerAnalysis = new Map<string, number>()\n      for (const edge of edgesArr) {\n        if (!edge || typeof edge !== 'object') continue\n        const e = edge as Record<string, unknown>\n        if (e.type === 'competitive_analysis_dimensioned_by_classification_axis'\n            && typeof e.source === 'string') {\n          axesPerAnalysis.set(e.source, (axesPerAnalysis.get(e.source) ?? 0) + 1)\n        }\n      }\n\n      d.nodes.forEach((node: unknown, i: number) => {\n        if (!node || typeof node !== 'object') return\n        const n = node as Record<string, unknown>\n        if (n.type !== 'competitive_analysis') return\n        const props = n.properties\n        if (!props || typeof props !== 'object') return\n        const empty = (props as Record<string, unknown>).empty_cells\n        if (!Array.isArray(empty)) return\n\n        // Soft advisory if the analysis is not exactly 2-axis.\n        const axisCount = axesPerAnalysis.get((n.id as string) ?? '') ?? 0\n        if (axisCount !== 2) {\n          warnings.push({\n            path: `$.nodes[${i}].properties.empty_cells`,\n            message: `empty_cells is meaningful only on a 2-axis competitive_analysis; this node is dimensioned by ${axisCount} classification_axis ${axisCount === 1 ? 'child' : 'children'}.`,\n          })\n        }\n\n        empty.forEach((cell: unknown, j: number) => {\n          const cpath = `$.nodes[${i}].properties.empty_cells[${j}]`\n          if (!cell || typeof cell !== 'object') {\n            errors.push({ path: cpath, message: 'empty_cells entry must be an object' })\n            return\n          }\n          const c = cell as Record<string, unknown>\n          const aRef = c.axis_a_value_ref\n          const bRef = c.axis_b_value_ref\n          if (typeof aRef !== 'string') {\n            errors.push({ path: `${cpath}.axis_a_value_ref`, message: 'axis_a_value_ref is required and must be a string' })\n          }\n          if (typeof bRef !== 'string') {\n            errors.push({ path: `${cpath}.axis_b_value_ref`, message: 'axis_b_value_ref is required and must be a string' })\n          }\n          if (typeof aRef !== 'string' || typeof bRef !== 'string') return\n\n          const aNode = nodesById.get(aRef)\n          const bNode = nodesById.get(bRef)\n          if (!aNode) {\n            errors.push({ path: `${cpath}.axis_a_value_ref`, message: `Unknown node id: ${aRef}` })\n          } else if (aNode.type !== 'classification_value') {\n            errors.push({ path: `${cpath}.axis_a_value_ref`, message: `Expected classification_value, found \"${String(aNode.type)}\" at ${aRef}` })\n          }\n          if (!bNode) {\n            errors.push({ path: `${cpath}.axis_b_value_ref`, message: `Unknown node id: ${bRef}` })\n          } else if (bNode.type !== 'classification_value') {\n            errors.push({ path: `${cpath}.axis_b_value_ref`, message: `Expected classification_value, found \"${String(bNode.type)}\" at ${bRef}` })\n          }\n\n          // Distinct-axis check: only meaningful if both refs resolve to\n          // classification_value AND we know their axes.\n          if (aNode && bNode && aNode.type === 'classification_value' && bNode.type === 'classification_value') {\n            const aAxis = valueToAxis.get(aRef)\n            const bAxis = valueToAxis.get(bRef)\n            if (aAxis && bAxis && aAxis === bAxis) {\n              errors.push({\n                path: cpath,\n                message: `empty_cells references two classification_values from the same axis (${aAxis}); axis_a and axis_b must come from distinct classification_axis parents.`,\n              })\n            }\n          }\n\n          // rationale_kind enum check.\n          const kind = c.rationale_kind\n          if (kind !== undefined && kind !== 'structural' && kind !== 'ideological' && kind !== 'opportunity') {\n            errors.push({\n              path: `${cpath}.rationale_kind`,\n              message: `rationale_kind must be one of 'structural' | 'ideological' | 'opportunity'; got \"${String(kind)}\".`,\n            })\n          }\n        })\n      })\n\n      // ── framework score validation (UPG-638) ─────────────────────────\n      // A framework_exercise persists each entity's result on its\n      // `framework_exercise_includes_node` edge `properties`. Validate those\n      // stored scores against the framework's OWN input spec. Findings are\n      // WARNINGS (rule 'framework-score'): a drifted exercise still loads,\n      // and `verify` re-classifies to exit 2.\n      validateFrameworkScores(d.nodes as unknown[], d.edges as unknown[], warnings)\n    }\n  }\n\n  return { valid: errors.length === 0, errors, warnings }\n}\n\n/**\n * UPG-638: validate the per-entity scores a `framework_exercise` persists on its\n * `framework_exercise_includes_node` edge `properties` against the framework's\n * own declared input spec (`data.required_properties[<targetType>]`).\n *\n * Why on the edge, not the node: a framework_exercise records each scored\n * entity's result on the includes-edge (a MoSCoW bucket, RICE reach/impact/\n * confidence/effort, a WSJF job_size), because the value is a fact about that\n * run, not an intrinsic entity property. Today garbage persists undetected: an\n * invalid `moscow` bucket, an off-scale or negative RICE input, a non-numeric\n * score, or `effort: 0` (a zero divisor that makes the RICE score blow up).\n *\n * What we check, grounded ONLY in the framework definition (no invented rules):\n *   - enum input        → value must be a string in the requirement's\n *                         `enum_values`.\n *   - assessment input  → value (scalar, or an object's numeric `.value`) must\n *                         be a finite number within the declared `scale_id`'s\n *                         [min, max]. Falls back to a >0 sanity check when the\n *                         scale id is unknown.\n *   - number input      → value must be a finite, non-negative number.\n *   - divisor inputs    → a lone divisor identifier in any computed expression\n *                         (`… / effort`, `… / job_size`) must not be zero. A\n *                         parenthesised sum denominator (Kano) is not flagged.\n *\n * Conservative by design (mirrors the F5 property checks): only inputs the\n * framework actually declares for the scored entity's type are checked; an\n * unknown framework_id, a missing input value, or an entity type the framework\n * does not score is skipped, not flagged. WARNINGS only — never errors — so a\n * drifted exercise still loads. The CLI `verify` command re-classifies these\n * (see CONTENT_DEPTH_WARNING_RULES).\n */\nfunction validateFrameworkScores(\n  nodes: unknown[],\n  edges: unknown[],\n  warnings: UPGValidationWarning[],\n): void {\n  // Index nodes by id and collect the framework_exercise nodes.\n  const nodeById = new Map<string, Record<string, unknown>>()\n  const exercises: Array<{ id: string; framework: UPGFramework }> = []\n  for (const node of nodes) {\n    if (!node || typeof node !== 'object') continue\n    const n = node as Record<string, unknown>\n    if (typeof n.id === 'string') nodeById.set(n.id, n)\n    if (n.type !== 'framework_exercise') continue\n    const props = n.properties\n    if (!props || typeof props !== 'object' || Array.isArray(props)) continue\n    const frameworkId = (props as Record<string, unknown>).framework_id\n    if (typeof frameworkId !== 'string') continue\n    const framework = UPG_FRAMEWORKS_BY_ID[frameworkId]\n    // Unknown framework_id: not this rule's concern — skip rather than\n    // false-flag (a frozen exercise may reference an evolved/removed id).\n    if (!framework) continue\n    if (typeof n.id === 'string') exercises.push({ id: n.id, framework })\n  }\n  if (exercises.length === 0) return\n  const exerciseById = new Map(exercises.map((e) => [e.id, e.framework]))\n\n  // Walk every includes-edge from a resolved exercise and check its score.\n  edges.forEach((edge: unknown, i: number) => {\n    if (!edge || typeof edge !== 'object') return\n    const e = edge as Record<string, unknown>\n    if (e.type !== 'framework_exercise_includes_node') return\n    if (typeof e.source !== 'string' || typeof e.target !== 'string') return\n    const framework = exerciseById.get(e.source)\n    if (!framework) return\n    const score = e.properties\n    if (!score || typeof score !== 'object' || Array.isArray(score)) return\n\n    const targetNode = nodeById.get(e.target)\n    const targetType = typeof targetNode?.type === 'string' ? (targetNode.type as string) : undefined\n    if (!targetType) return\n\n    const requirements = framework.data?.required_properties?.[targetType]\n    if (!requirements || requirements.length === 0) return\n\n    const divisors = divisorInputs(framework)\n    const path = `$.edges[${i}].properties`\n    const scoreObj = score as Record<string, unknown>\n\n    for (const req of requirements) {\n      const value = scoreObj[req.property]\n      if (value === undefined || value === null) continue // missing input: not a depth concern here\n      const finding = checkScoreValue(req, value, divisors.has(req.property), framework.id)\n      if (finding) {\n        warnings.push({\n          path: `${path}.${req.property}`,\n          message: finding,\n          rule: 'framework-score',\n        })\n      }\n    }\n  })\n}\n\n/**\n * The set of input keys that appear as a *lone* denominator in any of a\n * framework's computed expressions. Framework-agnostic: RICE's `effort`\n * (`… / effort`), WSJF's `job_size` (`… / job_size`), `value / effort`. A zero\n * in one of these makes the computed score diverge, so it is always invalid.\n *\n * A parenthesised multi-term denominator is intentionally NOT decomposed. In\n * Kano's `(…) / (delighter_count + performance_count + must_be_count +\n * indifferent_count)` no single count is a must-not-be-zero divisor: any one can\n * be 0 while the sum stays positive, so flagging individual terms (the old\n * heuristic flagged the first, `delighter_count`) was a false positive. Only a\n * bare `/ ident` or a lone `/(ident)` counts.\n */\nfunction divisorInputs(framework: UPGFramework): ReadonlySet<string> {\n  const exprs = (framework.data?.computed_properties ?? [])\n    .map((c) => c?.expression)\n    .filter((e): e is string => typeof e === 'string' && e.length > 0)\n  if (exprs.length === 0) return EMPTY_STRING_SET\n  const out = new Set<string>()\n  // `/` (not `//`) followed by a lone divisor identifier: a bare `/ effort`, or\n  // a single identifier wrapped in parens `/(job_size)`. A `/ (a + b + …)`\n  // multi-term denominator matches neither branch and is left alone.\n  const re = /\\/\\s*(?:\\(\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\)|([A-Za-z_][A-Za-z0-9_]*))/g\n  for (const expr of exprs) {\n    let m: RegExpExecArray | null\n    while ((m = re.exec(expr)) !== null) out.add(m[1] ?? m[2])\n  }\n  return out\n}\n\nconst EMPTY_STRING_SET: ReadonlySet<string> = new Set<string>()\n\n/**\n * Validate a single persisted score `value` against one framework input\n * requirement. Returns a human-readable finding string, or `null` if the value\n * is acceptable. The check is keyed on the requirement's declared `type`.\n */\nfunction checkScoreValue(\n  req: FrameworkPropertyRequirement,\n  value: unknown,\n  isDivisor: boolean,\n  frameworkId: string,\n): string | null {\n  switch (req.type) {\n    case 'enum': {\n      const allowed = req.enum_values ?? []\n      if (typeof value !== 'string') {\n        return `${frameworkId} score \"${req.property}\" must be one of ${allowed.join(', ')}; got ${describeKind(value)}.`\n      }\n      if (allowed.length > 0 && !allowed.includes(value)) {\n        return `${frameworkId} score \"${req.property}\" has value \"${value}\" outside its allowed set: ${allowed.join(', ')}.`\n      }\n      return null\n    }\n    case 'assessment': {\n      const num = numericScore(value)\n      if (num === null) {\n        return `${frameworkId} score \"${req.property}\" must be a number; got ${describeKind(value)}.`\n      }\n      const scale = req.scale_id ? getScale(req.scale_id) : undefined\n      if (scale) {\n        if (num < scale.min || num > scale.max) {\n          return `${frameworkId} score \"${req.property}\" is ${num}, outside the ${req.scale_id} scale range [${scale.min}, ${scale.max}].`\n        }\n      } else if (num <= 0) {\n        // No resolvable scale: fall back to the universal \"scores are positive\"\n        // sanity bound so 0/negative still get caught.\n        return `${frameworkId} score \"${req.property}\" must be greater than 0; got ${num}.`\n      }\n      if (isDivisor && num === 0) {\n        return `${frameworkId} score \"${req.property}\" must not be 0 (it is a divisor in the framework's formula).`\n      }\n      return null\n    }\n    case 'number': {\n      const num = numericScore(value)\n      if (num === null) {\n        return `${frameworkId} score \"${req.property}\" must be a number; got ${describeKind(value)}.`\n      }\n      if (isDivisor && num === 0) {\n        return `${frameworkId} score \"${req.property}\" must not be 0 (it is a divisor in the framework's formula).`\n      }\n      if (num < 0) {\n        return `${frameworkId} score \"${req.property}\" must not be negative; got ${num}.`\n      }\n      return null\n    }\n    case 'boolean': {\n      if (typeof value !== 'boolean') {\n        return `${frameworkId} score \"${req.property}\" must be a boolean; got ${describeKind(value)}.`\n      }\n      return null\n    }\n    case 'string': {\n      if (typeof value !== 'string') {\n        return `${frameworkId} score \"${req.property}\" must be a string; got ${describeKind(value)}.`\n      }\n      return null\n    }\n    default:\n      return null\n  }\n}\n\n/**\n * Coerce a persisted assessment/number score to a finite number, or `null`.\n * Accepts a bare number, a numeric string (scores are sometimes serialised as\n * strings), or an assessment object with a numeric `value` field\n * (`{ value: 3, label: 'High' }`). Mirrors how `executePrioritise` reads\n * scores via `collectNumericScope`, so the validator and the scorer agree on\n * what counts as a usable number.\n */\nfunction numericScore(value: unknown): number | null {\n  if (typeof value === 'number') return Number.isFinite(value) ? value : null\n  if (typeof value === 'string') {\n    const n = Number.parseFloat(value)\n    return Number.isFinite(n) ? n : null\n  }\n  if (value && typeof value === 'object' && !Array.isArray(value)) {\n    const v = (value as Record<string, unknown>).value\n    if (typeof v === 'number') return Number.isFinite(v) ? v : null\n  }\n  return null\n}\n\n/**\n * Returns the JavaScript-runtime category a value falls into, expressed in the\n * `PropertyDefinition['type']` vocabulary, or `null` if it cannot be mapped.\n *\n * `assessment` and `object` are both backed by plain objects at runtime, so a\n * non-null, non-array object satisfies either. Arrays map to `string[]` (the\n * only array-shaped property type in the schema); element types are not\n * inspected here.\n */\nfunction runtimeKind(val: unknown): PropertyDefinition['type'] | 'array' | null {\n  if (val === null || val === undefined) return null\n  if (Array.isArray(val)) return 'string[]'\n  switch (typeof val) {\n    case 'string':\n      return 'string'\n    case 'number':\n      return 'number'\n    case 'boolean':\n      return 'boolean'\n    case 'object':\n      // assessment and object are both plain objects at runtime; report the\n      // broader `object` and let the caller accept either.\n      return 'object'\n    default:\n      return null\n  }\n}\n\n/**\n * True when `val` is shape-compatible with the declared property `type`.\n * `assessment` accepts any plain object (its nested `{value,label}` shape is\n * not deep-checked here, to stay conservative against real-world drift).\n */\nfunction valueMatchesType(defType: PropertyDefinition['type'], val: unknown): boolean {\n  const kind = runtimeKind(val)\n  if (kind === null) return true // null/undefined: treated as \"absent\", not a mismatch\n  switch (defType) {\n    case 'string':\n      return kind === 'string'\n    case 'number':\n      return kind === 'number'\n    case 'boolean':\n      return kind === 'boolean'\n    case 'string[]':\n    case 'object[]':\n      // runtimeKind reports any array as 'string[]'; element types are not\n      // inspected here (the write-time validator does the deeper check).\n      return kind === 'string[]'\n    case 'object':\n    case 'assessment':\n      // Both are plain objects at runtime. Arrays are not objects here.\n      return kind === 'object'\n    default:\n      return true\n  }\n}\n\n/**\n * A human-readable name for a value's runtime kind, for warning messages.\n */\nfunction describeKind(val: unknown): string {\n  if (Array.isArray(val)) return 'array'\n  return typeof val\n}\n\n/**\n * UPG-632 (F5): validate a node's `properties` against the entity schema's\n * declared property TYPE and ENUM membership. Findings are pushed as WARNINGS\n * (tagged with a `rule` code), never errors, so they never block the load path.\n *\n * Conservative by design — false positives on a real graph become spurious\n * warnings, so we only check what is unambiguous:\n *   - Only properties that exist in the entity schema are checked (unknown\n *     extras are author/runtime extensions and are left alone).\n *   - Only present (non-null, non-undefined) values are checked.\n *   - Type checks accept `assessment`/`object` for any plain object without\n *     deep-checking nested shape.\n *   - Enum checks only fire when the value is a string not in the closed set.\n *\n * Entity types with no typed schema (or non-canonical / alias types) are\n * skipped entirely.\n */\nfunction validateNodeProperties(\n  node: Record<string, unknown>,\n  basePath: string,\n  warnings: UPGValidationWarning[],\n): void {\n  const type = node.type\n  if (typeof type !== 'string') return\n  const schema = getPropertySchema(type)\n  if (!schema) return // no typed properties (or alias/unknown type): nothing to check\n\n  const props = node.properties\n  if (!props || typeof props !== 'object' || Array.isArray(props)) return\n\n  for (const [key, value] of Object.entries(props as Record<string, unknown>)) {\n    const def = schema[key]\n    if (!def) continue // author/runtime extension property: not in the spec schema\n    if (value === null || value === undefined) continue // absent: not a violation\n\n    // Type check.\n    if (!valueMatchesType(def.type, value)) {\n      warnings.push({\n        path: `${basePath}.properties.${key}`,\n        message: `Property \"${key}\" on ${type} should be ${def.type}, got ${describeKind(value)}.`,\n        rule: 'property-type',\n      })\n      // A type-mismatched value cannot meaningfully be enum-checked; skip.\n      continue\n    }\n\n    // Enum membership check (only for string-typed, closed-set properties).\n    if (def.enum && typeof value === 'string' && !def.enum.includes(value)) {\n      warnings.push({\n        path: `${basePath}.properties.${key}`,\n        message: `Property \"${key}\" on ${type} has value \"${value}\" outside its allowed set: ${def.enum.join(', ')}.`,\n        rule: 'property-enum',\n      })\n    }\n  }\n}\n\n/**\n * Type guard: returns true if the document is a valid UPGDocument.\n * Use `validateUPGDocument` for detailed error reporting.\n *\n * @example\n * const raw: unknown = JSON.parse(fileContents)\n * if (isUPGDocument(raw)) {\n *   // raw is now typed as UPGDocument\n *   console.log(`Loaded product \"${raw.product.title}\" with ${raw.nodes.length} nodes`)\n * }\n */\nexport function isUPGDocument(doc: unknown): doc is UPGDocument {\n  return validateUPGDocument(doc).valid\n}\n","/**\n * Property modifiers: the queryable surface (UPG-684 / 0.13.0 Wave 0).\n *\n * The `modifier` field on `PropertyDefinition` (`'derived' | 'snapshot' |\n * 'volatile'`, shipped in 0.11.6 off the 2026-06-16 property-fit audit) marks a\n * property whose value is NOT authored-and-stable. This module turns that field\n * from \"a key on a raw schema dump\" into a real, machine-checkable surface:\n * accessors to enumerate modified properties, the record-vs-definition\n * governance line, and the shape detectors that the spec guardrails (and, later,\n * `validate_graph`) consume.\n *\n * It carries no I/O and no graph instance — pure catalog introspection over\n * `UPG_PROPERTY_SCHEMA`. The guardrails in `__tests__/spec-guardrails.test.ts`\n * (T1.2 stored-aggregate, T1.3 runtime-state-on-definition-entity) read from\n * here so there is exactly one definition of each smell.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport { UPG_PROPERTY_SCHEMA, type PropertyDefinition } from './property-schema.js'\n\n/** The three property-modifier values. Single source — derived from the type. */\nexport type PropertyModifier = NonNullable<PropertyDefinition['modifier']>\n\n/** All modifier values, in canonical order. */\nexport const PROPERTY_MODIFIERS = ['derived', 'snapshot', 'volatile'] as const\n\n/**\n * Human-readable semantics for each modifier — the same prose the\n * `PropertyDefinition` doc comment carries, exposed as data so renderers,\n * docs, and tooling describe the modifiers consistently.\n */\nexport const PROPERTY_MODIFIER_SEMANTICS: Record<PropertyModifier, string> = {\n  derived:\n    'Computed from edges/children at read-time; never hand-authored. A stored value that contradicts the graph is a smell.',\n  snapshot:\n    'A stale-stamped cache of a live reading; SHOULD pair with a `*_as_of` timestamp. Definition entities carry live state only as a snapshot.',\n  volatile:\n    'An environment-specific pointer (URL / path / id) that may rot or be stripped on export; not portable modeling knowledge.',\n}\n\n/** One modified property, located by entity type + top-level property name. */\nexport interface ModifiedProperty {\n  /** Entity type id (key into `UPG_PROPERTY_SCHEMA`). */\n  type: string\n  /** Top-level property name. */\n  property: string\n  /** The modifier carried by the property. */\n  modifier: PropertyModifier\n}\n\n/**\n * Enumerate every property in the catalog that carries a modifier, optionally\n * filtered to one modifier kind. Top-level properties only — modifiers are a\n * property-level provenance signal and are not applied to nested object keys\n * anywhere in the catalog today.\n */\nexport function listPropertiesByModifier(modifier?: PropertyModifier): ModifiedProperty[] {\n  const out: ModifiedProperty[] = []\n  for (const [type, props] of Object.entries(UPG_PROPERTY_SCHEMA)) {\n    for (const [property, def] of Object.entries(props as Record<string, PropertyDefinition>)) {\n      const m = def?.modifier\n      if (!m) continue\n      if (modifier && m !== modifier) continue\n      out.push({ type, property, modifier: m })\n    }\n  }\n  return out\n}\n\n/** The modifier on a single property, or `undefined` if it is plain/authored. */\nexport function getPropertyModifier(\n  entityType: string,\n  property: string,\n): PropertyModifier | undefined {\n  return (UPG_PROPERTY_SCHEMA[entityType] as Record<string, PropertyDefinition> | undefined)?.[\n    property\n  ]?.modifier\n}\n\n/**\n * The modifiers an entity type carries, grouped by kind — `undefined` when the\n * entity has no modified properties. Powers the `property_modifiers` summary on\n * `get_entity_schema`.\n */\nexport function getEntityModifierSummary(\n  entityType: string,\n): Record<PropertyModifier, string[]> | undefined {\n  const props = UPG_PROPERTY_SCHEMA[entityType] as Record<string, PropertyDefinition> | undefined\n  if (!props) return undefined\n  const summary: Record<PropertyModifier, string[]> = { derived: [], snapshot: [], volatile: [] }\n  let any = false\n  for (const [property, def] of Object.entries(props)) {\n    const m = def?.modifier\n    if (!m) continue\n    summary[m].push(property)\n    any = true\n  }\n  return any ? summary : undefined\n}\n\n// ─── The record-vs-definition governance line ─────────────────────────────────\n//\n// The property-fit audit's cleanest governance principle: *definition entities\n// describe what is designed/configured; live readings, rolling metrics, and\n// execution outcomes live on `metric` nodes (by edge) or on dedicated\n// execution/record entities.* The smell (Pattern A) is live data on a\n// *definition* entity — NOT on a *record* entity, which is supposed to hold live\n// figures. This is the curated allowlist of entities that legitimately carry\n// live/aggregate values, so the runtime-state guardrail exempts them.\n//\n// Grow this set when a genuine record/execution entity is added — never to\n// launder live state onto a definition entity (the fix there is an edge to a\n// `metric` node or a `@snapshot` modifier, not membership here).\nexport const RECORD_ENTITY_TYPES: ReadonlySet<string> = new Set<string>([\n  'ai_cost_tracker',\n  'eval_run',\n  'test_result',\n  'agent_session',\n  'cohort',\n  'ai_trace',\n  'workflow_run',\n])\n\n/** Whether an entity legitimately holds live/aggregate values (a record, not a definition). */\nexport function isRecordEntity(entityType: string): boolean {\n  return RECORD_ENTITY_TYPES.has(entityType)\n}\n\n// ─── Shape detectors (consumed by the spec guardrails + future validate_graph) ─\n//\n// These are intentionally tight, structurally-unambiguous name shapes — not a\n// kitchen sink. They power baseline-FREEZE guardrails (the count of untagged\n// matches may not grow), so a narrow detector under-counts harmlessly while a\n// loose one would inflate the frozen baseline with false positives. The broad\n// bulk cleanup of the ~85 audit findings is Wave 2 (UPG-688 / UPG-689); these\n// detectors guard the dominant cases and forbid NEW ones.\n\n/**\n * Aggregate shape (Pattern B): a numeric count/rollup derivable from edges or\n * children. Tight signal: a `number`-typed property whose name ends in `_count`\n * (or is `headcount`). Such a value should be `@derived`, not stored.\n */\nexport function isAggregateShapedProperty(name: string, def: PropertyDefinition): boolean {\n  if (def?.type !== 'number') return false\n  return name.endsWith('_count') || name === 'headcount'\n}\n\n/**\n * Runtime-state shape (Pattern A): a numeric live reading — a rate, percentage,\n * current value, remaining budget, latency percentile, monthly figure, or\n * per-unit rate. On a definition entity such a value should live on a `metric`\n * node (by edge) or be marked `@snapshot`. `*_status` enums are intentionally\n * left to the T1.1 status-shadows-phase guardrail; this detector owns the\n * numeric live readings.\n */\nexport function isRuntimeStateShapedProperty(name: string, def: PropertyDefinition): boolean {\n  if (def?.type !== 'number') return false\n  return (\n    /_rate$/.test(name) ||\n    /_pct$/.test(name) ||\n    /^current_/.test(name) ||\n    /_remaining$/.test(name) ||\n    /_p\\d+_/.test(name) ||\n    /^monthly_/.test(name) ||\n    /_per_/.test(name)\n  )\n}\n","/**\n * Edge `properties` validation against a carries-properties edge's\n * `property_schema` (0.10.4). Shared by the writers (create_cross_product_edge,\n * batch_create_cross_product_edges, create_classification_edge) and by\n * validate_graph, so \"what a classification edge may carry\" has one source of\n * truth: the catalog `property_schema`.\n *\n * Edge types with no `property_schema` return no errors here — they accept an\n * unvalidated bag (the pre-0.10.4 behaviour, e.g. feature_rivals_competitor_feature).\n */\nimport type { PropertyDefinition } from './property-schema.js'\nimport { getEdgePropertySchema } from '../catalog/edge-catalog.js'\nimport { getScale } from '../grammar/scales.js'\n\n/**\n * Validate an edge's `properties` bag against its catalog `property_schema`.\n * Returns human-readable error strings (empty array = valid). Unknown keys are\n * rejected; typed values are checked; an `assessment` is range-checked against\n * its scale and must carry its required keys.\n */\nexport function validateEdgeProperties(\n  edgeType: string,\n  properties: Record<string, unknown> | undefined,\n): string[] {\n  const schema = getEdgePropertySchema(edgeType)\n  if (!schema || !properties) return []\n\n  const errors: string[] = []\n  const allowed = Object.keys(schema)\n\n  for (const key of Object.keys(properties)) {\n    if (!allowed.includes(key)) {\n      errors.push(`unknown property \"${key}\" for edge type \"${edgeType}\" (allowed: ${allowed.join(', ')})`)\n    }\n  }\n\n  for (const [key, def] of Object.entries(schema)) {\n    const val = properties[key]\n    if (val === undefined || val === null) continue\n    errors.push(...validateValue(key, def, val))\n  }\n\n  return errors\n}\n\nfunction validateValue(key: string, def: PropertyDefinition, val: unknown): string[] {\n  const errors: string[] = []\n  switch (def.type) {\n    case 'string':\n      if (typeof val !== 'string') errors.push(`property \"${key}\" must be a string`)\n      break\n    case 'number':\n      if (typeof val !== 'number') errors.push(`property \"${key}\" must be a number`)\n      break\n    case 'boolean':\n      if (typeof val !== 'boolean') errors.push(`property \"${key}\" must be a boolean`)\n      break\n    case 'assessment': {\n      if (typeof val !== 'object' || Array.isArray(val)) {\n        errors.push(`property \"${key}\" must be an assessment object with value and label`)\n        break\n      }\n      const a = val as Record<string, unknown>\n      for (const r of def.required ?? ['value', 'label']) {\n        if (a[r] === undefined || a[r] === null) errors.push(`assessment \"${key}\" is missing required \"${r}\"`)\n      }\n      if (a.value !== undefined && a.value !== null) {\n        if (typeof a.value !== 'number') {\n          errors.push(`assessment \"${key}\".value must be a number`)\n        } else {\n          const scaleId = (typeof a.scale_id === 'string' ? a.scale_id : undefined) ?? def.scale_id\n          const scale = scaleId ? getScale(scaleId) : undefined\n          if (scale && (a.value < scale.min || a.value > scale.max)) {\n            errors.push(`assessment \"${key}\".value ${a.value} is out of range ${scale.min}-${scale.max} for scale ${scaleId}`)\n          }\n        }\n      }\n      if (typeof a.scale_id === 'string' && def.scale_id !== undefined && a.scale_id !== def.scale_id) {\n        errors.push(`assessment \"${key}\".scale_id \"${a.scale_id}\" must be \"${def.scale_id}\"`)\n      }\n      break\n    }\n    case 'string[]': {\n      // 0.30.0: `present_under` is exactly this shape, and the write path used\n      // to accept a bare string for it. A single string is not a one-element\n      // list to any reader: the projection operator ignores it, so the surface\n      // silently reverts to invariant and appears in every configuration. The\n      // write path must not admit what the read path cannot honour.\n      if (!Array.isArray(val)) {\n        errors.push(`property \"${key}\" must be an array of strings`)\n        break\n      }\n      if (val.some((v) => typeof v !== 'string')) {\n        errors.push(`property \"${key}\" must contain only strings`)\n      }\n      if (val.length === 0) {\n        errors.push(`property \"${key}\" must not be empty`)\n      }\n      break\n    }\n    case 'object': {\n      if (typeof val !== 'object' || val === null || Array.isArray(val)) {\n        errors.push(`property \"${key}\" must be an object`)\n        break\n      }\n      const obj = val as Record<string, unknown>\n      // Required keys, then each declared sub-property. An `active_when`\n      // missing its `values` reads as ABSENT to the projection operator, which\n      // makes the edge invariant rather than conditional: the write silently\n      // means the opposite of what the author intended.\n      for (const req of def.required ?? []) {\n        if (obj[req] === undefined || obj[req] === null) {\n          errors.push(`property \"${key}\" is missing required key \"${req}\"`)\n        }\n      }\n      for (const [subKey, subDef] of Object.entries(def.properties ?? {})) {\n        const subVal = obj[subKey]\n        if (subVal === undefined || subVal === null) continue\n        errors.push(...validateValue(`${key}.${subKey}`, subDef, subVal))\n      }\n      for (const presentKey of Object.keys(obj)) {\n        if (def.properties && !(presentKey in def.properties)) {\n          errors.push(\n            `property \"${key}\" has unknown key \"${presentKey}\" (allowed: ${Object.keys(def.properties).join(', ')})`,\n          )\n        }\n      }\n      break\n    }\n    // object[]: no edge property schema declares one today.\n  }\n  return errors\n}\n","/**\n * UPG entity emoji glyphs: one distinct, relevant glyph per active entity type.\n *\n * The canonical, Captain-reviewed emoji set (icon-uniqueness pass). Single source\n * of truth, surfaced live via `get_type_label({type}).emoji` and\n * `list_type_labels()`, and consumed by the UPG site docs generator. Keep this\n * the ONLY place an entity emoji is authored, so renderers stop hardcoding.\n *\n * A type without an entry falls back to `DEFAULT_ENTITY_EMOJI` (the builder in\n * labels.ts applies the fallback), so the `emoji` field always resolves.\n *\n * https://unifiedproductgraph.org | MIT\n */\n\n/** Fallback glyph for any active type without an explicit entry. */\nexport const DEFAULT_ENTITY_EMOJI = \"📦\" as const\n\n/** Canonical emoji per entity type id (snake_case). */\nexport const ENTITY_EMOJI: Record<string, string> = {\n  a11y_annotation: \"🦻\",\n  a11y_audit: \"♿\",\n  a11y_guideline: \"🦯\",\n  a11y_issue: \"🚫\",\n  a11y_standard: \"📏\",\n  acceptance_criterion: \"✅\",\n  access_policy: \"🔑\",\n  account: \"🏦\",\n  acquisition_channel: \"🎣\",\n  ad_creative: \"🖌️\",\n  affinity_cluster: \"🧲\",\n  agent_definition: \"🦾\",\n  agent_hook: \"🧷\",\n  agent_session: \"🧑‍💻\",\n  agent_skill: \"🪄\",\n  agent_task: \"🎫\",\n  aggregate: \"🫙\",\n  ai_cost_tracker: \"💸\",\n  ai_dataset: \"🪆\",\n  ai_experiment: \"👾\",\n  ai_guardrail: \"🚦\",\n  ai_model: \"🤖\",\n  ai_trace: \"🪡\",\n  alert_rule: \"🛎️\",\n  annotation: \"🗯️\",\n  api_contract: \"🤝\",\n  api_ecosystem: \"🕸️\",\n  api_endpoint: \"🔌\",\n  approval_record: \"🔏\",\n  assumption: \"🤔\",\n  attribution_model: \"🕵️\",\n  audit_log_policy: \"🪵\",\n  behavioral_segment: \"🐾\",\n  beta_program: \"🐣\",\n  bounded_context: \"🔲\",\n  brand_asset: \"🗂️\",\n  brand_colour: \"🌈\",\n  brand_identity: \"💠\",\n  brand_imagery: \"🖼️\",\n  brand_logo: \"🔷\",\n  brand_typography: \"🔤\",\n  brand_voice: \"🎙️\",\n  bug: \"🐛\",\n  build_artifact: \"🏺\",\n  business_model: \"💰\",\n  capability: \"💪\",\n  capacity_plan: \"🗓️\",\n  ceremony: \"🔔\",\n  certification: \"🏵️\",\n  change_request: \"✏️\",\n  changelog: \"🕰️\",\n  churn_reason: \"💔\",\n  ci_pipeline: \"🚇\",\n  classification_axis: \"↔️\",\n  classification_value: \"📍\",\n  code_repository: \"💾\",\n  cohort: \"👥\",\n  command: \"⌨️\",\n  community_initiative: \"🌍\",\n  competitive_analysis: \"📊\",\n  competitive_battle_card: \"⚔️\",\n  competitor: \"🥊\",\n  competitor_feature: \"🔬\",\n  competitor_signal: \"📡\",\n  compliance_framework: \"🏟️\",\n  compliance_requirement: \"⛲\",\n  capture: \"📸\",\n  composition: \"🖼️\",\n  constraint: \"🔒\",\n  contact: \"📇\",\n  content_calendar: \"📅\",\n  content_piece: \"🗒️\",\n  content_strategy: \"✍️\",\n  content_theme: \"💡\",\n  contract: \"📑\",\n  contract_clause: \"§\",\n  cost_structure: \"🧮\",\n  cultural_adaptation: \"🌏\",\n  customer_feedback: \"🔶\",\n  customer_health_score: \"💚\",\n  customer_journey_stage: \"🚏\",\n  customer_relationship: \"🫶\",\n  dashboard: \"🎛️\",\n  data_classification: \"🍃\",\n  data_contract: \"🔣\",\n  data_domain: \"🏷️\",\n  data_flow: \"↕️\",\n  data_lineage: \"🌳\",\n  data_model: \"🗃️\",\n  data_pipeline: \"🪣\",\n  data_product: \"🎁\",\n  data_quality_rule: \"🧹\",\n  data_source: \"🛢️\",\n  database_schema: \"🗄️\",\n  deal: \"💼\",\n  decision: \"⚖️\",\n  deliverable: \"🎀\",\n  demand_gen_program: \"📣\",\n  department: \"🏬\",\n  dependency: \"⛓️\",\n  deployment: \"📤\",\n  design_component: \"🧱\",\n  design_concept: \"🌱\",\n  design_guideline: \"📌\",\n  design_pattern: \"🧩\",\n  design_question: \"💭\",\n  design_sprint: \"🏃\",\n  design_system: \"🧰\",\n  design_token: \"🪙\",\n  desired_outcome: \"🌟\",\n  developer_portal: \"🎑\",\n  discount_strategy: \"✂️\",\n  distribution_channel: \"🚚\",\n  document: \"📃\",\n  documentation_template: \"🖊️\",\n  domain_entity: \"📦\",\n  domain_event: \"📡\",\n  education_program: \"🏫\",\n  email_sequence: \"📧\",\n  epic: \"📜\",\n  error_budget: \"⏳\",\n  eval_benchmark: \"🎖️\",\n  eval_run: \"🎟️\",\n  event: \"🎈\",\n  event_schema: \"🔠\",\n  evidence: \"🔎\",\n  experiment: \"🧫\",\n  experiment_plan: \"📐\",\n  experiment_run: \"▶️\",\n  external_api: \"🌐\",\n  feasibility_study: \"🏗️\",\n  feature: \"⭐\",\n  feature_area: \"📁\",\n  feature_flag: \"🎌\",\n  feature_request: \"🙏\",\n  feedback_program: \"🎤\",\n  feedback_theme: \"📎\",\n  feedback_vote: \"👍\",\n  fix: \"🪛\",\n  forecast: \"🔮\",\n  framework_exercise: \"📋\",\n  funnel: \"⬇️\",\n  funnel_step: \"🔽\",\n  glossary_term: \"📖\",\n  growth_campaign: \"📢\",\n  growth_loop: \"♾️\",\n  gtm_strategy: \"🏹\",\n  hallucination_report: \"👻\",\n  help_video: \"🎬\",\n  hypothesis: \"🧪\",\n  ideal_customer_profile: \"👤\",\n  incident: \"🚨\",\n  infrastructure_component: \"🖧\",\n  initiative: \"🚀\",\n  insight: \"🔦\",\n  integration_partner: \"🗿\",\n  integration_pattern: \"🔗\",\n  interaction_spec: \"🖱️\",\n  interview_guide: \"📋\",\n  investigation: \"🔍\",\n  invoice: \"💳\",\n  ip_asset: \"©️\",\n  job: \"🔨\",\n  job_step: \"👣\",\n  journey_action: \"⚡\",\n  journey_phase: \"🔖\",\n  journey_step: \"🪜\",\n  key_activity: \"🛠️\",\n  key_resource: \"🏭\",\n  key_result: \"📈\",\n  knowledge_base_article: \"📓\",\n  launch: \"🛸\",\n  lead: \"🌿\",\n  learning: \"🧠\",\n  learning_path: \"🥾\",\n  legal_entity: \"🏢\",\n  library_dependency: \"📚\",\n  locale: \"🌎\",\n  locale_config: \"🗾\",\n  market_segment: \"🎯\",\n  market_trend: \"📉\",\n  marketing_campaign_plan: \"📆\",\n  marketing_channel: \"📻\",\n  marketing_strategy: \"🔱\",\n  marketplace_listing: \"🛒\",\n  messaging: \"✉️\",\n  metric: \"🔢\",\n  metric_quality_assessment: \"🩺\",\n  milestone: \"⛳\",\n  mission: \"🧭\",\n  model_comparison: \"🔄\",\n  monitor: \"📺\",\n  need: \"🫀\",\n  nps_campaign: \"😊\",\n  objection: \"🚧\",\n  objective: \"🏁\",\n  observation: \"👁️\",\n  on_call_rotation: \"🏕️\",\n  opportunity: \"🚪\",\n  organization: \"🏙️\",\n  outcome: \"🏆\",\n  participant: \"🙋\",\n  partner_program: \"🎗️\",\n  partner_revenue_share: \"🤲\",\n  partner_tier: \"🥈\",\n  partnership: \"🫱🏻‍🫲🏼\",\n  paywall: \"🛂\",\n  penetration_test: \"🗡️\",\n  person: \"🧑\",\n  persona: \"🎭\",\n  pipeline_sales: \"🪈\",\n  pipeline_stage: \"🧽\",\n  planning_cycle: \"🗓️\",\n  configuration_axis: \"🎚️\",\n  playbook: \"📒\",\n  portfolio: \"🧸\",\n  positioning: \"🎪\",\n  postmortem: \"🩻\",\n  press_release: \"🗞️\",\n  pricing_strategy: \"💱\",\n  pricing_tier: \"🥉\",\n  primitive: \"📋\",\n  operating_lifecycle: \"🔄\",\n  operating_stage: \"🔹\",\n  privacy_policy: \"🛡️\",\n  product: \"🧬\",\n  product_area: \"🪀\",\n  program: \"🛋️\",\n  project: \"🧳\",\n  prompt_template: \"✒️\",\n  prompt_version: \"🗨️\",\n  proof_point: \"🧾\",\n  prototype: \"📱\",\n  qa_session: \"🐞\",\n  queue_topic: \"📬\",\n  quote: \"🗣️\",\n  quote_document: \"💲\",\n  read_model: \"🪟\",\n  rebuttal: \"↩️\",\n  regional_pricing: \"💴\",\n  regression_test: \"♻️\",\n  release: \"🚢\",\n  release_strategy: \"🪂\",\n  report: \"📰\",\n  research_plan: \"🗺️\",\n  research_question: \"❓\",\n  research_study: \"🧑‍🔬\",\n  resource_allocation: \"🥧\",\n  retrospective: \"🪞\",\n  revenue_stream: \"💵\",\n  review_gate: \"🚥\",\n  risk: \"🎲\",\n  risk_register: \"🧯\",\n  roadmap: \"🛣️\",\n  roadmap_item: \"🚩\",\n  roadmap_theme: \"🎨\",\n  role: \"🪪\",\n  root_cause: \"🪝\",\n  runbook: \"📘\",\n  sales_motion: \"🔁\",\n  screen: \"🖥️\",\n  screen_state: \"🔳\",\n  surface: \"🪟\",\n  security_audit: \"🛃\",\n  security_control: \"🎚️\",\n  security_policy: \"🔐\",\n  security_review: \"🧐\",\n  seo_keyword: \"#️⃣\",\n  service: \"⚙️\",\n  service_blueprint: \"🟣\",\n  service_level_agreement: \"⏱️\",\n  service_level_indicator: \"🌡️\",\n  service_level_objective: \"🥅\",\n  skill: \"🎓\",\n  social_post: \"🐦\",\n  solution: \"🔧\",\n  specification: \"📋\",\n  stakeholder: \"🧑‍💼\",\n  status_report: \"📄\",\n  strategic_pillar: \"🏛️\",\n  strategic_question: \"❔\",\n  strategic_theme: \"🧵\",\n  subscription: \"🔂\",\n  success_milestone: \"🎉\",\n  support_ticket: \"🆘\",\n  survey_response: \"📨\",\n  switching_cost: \"⚓\",\n  symptom: \"⚠️\",\n  task: \"☑️\",\n  team: \"🫂\",\n  team_okr: \"🏅\",\n  technical_debt_item: \"🪤\",\n  territory: \"🏴\",\n  test_case: \"🌵\",\n  test_coverage_report: \"🎏\",\n  test_environment: \"⚗️\",\n  test_plan: \"📝\",\n  test_result: \"🎰\",\n  test_suite: \"📂\",\n  threat: \"☠️\",\n  threat_model: \"🏴‍☠️\",\n  touchpoint: \"👆\",\n  translation_bundle: \"🈂️\",\n  translation_key: \"🗝️\",\n  trial_config: \"🆓\",\n  tutorial: \"🧑‍🏫\",\n  unit_economics: \"💹\",\n  user_advisory_board: \"🫵\",\n  user_flow: \"🔀\",\n  user_journey: \"🛤️\",\n  user_story: \"💬\",\n  value_object: \"💎\",\n  value_proposition: \"✨\",\n  value_stream: \"🌊\",\n  variant: \"🆎\",\n  vision: \"🔭\",\n  vulnerability: \"🔓\",\n  walkthrough: \"🚶\",\n  webinar: \"🎥\",\n  wireframe: \"▭\",\n  workflow_artifact: \"🗳️\",\n  workflow_run: \"⏯️\",\n  workflow_template: \"🎻\",\n  workspace: \"🏠\",\n}\n","/**\n * UPG Labels: framework-vocabulary Rosetta Stone. Each entity type maps to a\n * canonical label, alt labels, and framework-specific labels. Answers \"what\n * does framework X call this concept?\"\n *\n * Registry-driven: derived from `UPG_ACTIVE_TYPES` and `UPG_MIGRATIONS`.\n */\n\nimport { UPG_ACTIVE_TYPES } from '../registry/entity-meta.js'\nimport { UPG_MIGRATIONS } from '../grammar/migrations.js'\nimport { UPG_FRAMEWORKS } from '../frameworks/canonical.js'\nimport { ENTITY_EMOJI, DEFAULT_ENTITY_EMOJI } from './entity-emoji.js'\n\n/** Seed shape for hand-authored label entries: every field of UPGTypeLabel except\n * `emoji`, which the assembly step below attaches from `ENTITY_EMOJI`. */\ntype UPGTypeLabelSeed = Omit<UPGTypeLabel, 'emoji'>\n\n// ─── Interface ──────────────────────────────────────────────────────────────────\n\nexport interface UPGTypeLabel {\n  /** Matches the NodeType string (canonical, post-consolidation) */\n  id: string\n  /** Default display name */\n  canonical_label: string\n  /**\n   * One distinct, relevant emoji glyph for the type (the canonical, Captain-reviewed\n   * set in `entity-emoji.ts`). Always resolves: a type without an explicit glyph\n   * falls back to `DEFAULT_ENTITY_EMOJI`. This is THE live emoji source, surfaced\n   * by `get_type_label` + `list_type_labels`, so renderers stop hardcoding.\n   */\n  emoji: string\n  /** All known synonyms across frameworks + common usage (lowercase for matching) */\n  alt_labels: string[]\n  /** Framework-specific labels: { framework_id: \"what that framework calls it\" } */\n  framework_labels: Record<string, string>\n  /** Only for types that use the designation pattern */\n  designations?: Record<string, string>\n}\n\n// ─── Priority entries (high framework coverage) ─────────────────────────────────\n\n/**\n * Hand-authored label entries for types that appear across multiple frameworks.\n * These are the \"Rosetta Stone\" entries, the ones users will encounter across views.\n */\nconst PRIORITY_LABELS: UPGTypeLabelSeed[] = [\n\n  // ── need (CONSOLIDATED: replaces pain_point + user_need) ─────────────────────\n\n  {\n    id: 'need',\n    canonical_label: 'Need',\n    alt_labels: [\n      'pain point', 'pain', 'user need', 'customer need',\n      'problem', 'struggle', 'customer pain', 'frustration',\n      'gap', 'unmet need', 'user problem',\n    ],\n    framework_labels: {\n      lean_canvas: 'Problem',\n      design_thinking: 'Pain Point',\n      ost: 'Opportunity (need)',\n      jtbd: 'Struggle',\n      vpc: 'Customer Pain',\n    },\n    designations: {\n      pain: 'Pain Point',\n      gap: 'Need',\n      desire: 'Desire',\n      constraint: 'Constraint',\n    },\n  },\n\n  // ── opportunity ──────────────────────────────────────────────────────────────\n\n  {\n    id: 'opportunity',\n    canonical_label: 'Opportunity',\n    alt_labels: ['product opportunity', 'market opportunity', 'user opportunity'],\n    framework_labels: {\n      ost: 'Opportunity',\n    },\n  },\n\n  // ── solution ─────────────────────────────────────────────────────────────────\n\n  {\n    id: 'solution',\n    canonical_label: 'Solution',\n    // 'concept' stripped (P-B / UPG-670): bare \"concept\" was shared with the\n    // distinct `design_concept` type. `design_concept` keeps it; here a search\n    // for a solution uses \"approach\" / \"proposed solution\".\n    alt_labels: ['proposed solution', 'solution idea', 'approach'],\n    framework_labels: {\n      ost: 'Solution',\n      design_thinking: 'Solution',\n      lean_canvas: 'Solution',\n      rice: 'Scored Solution',\n    },\n  },\n\n  // ── experiment (CONSOLIDATED: absorbs ab_test, growth_experiment, pricing_experiment) ──\n\n  {\n    id: 'experiment',\n    canonical_label: 'Experiment',\n    // V6 (UPG-664): dropped 'test' (too generic; collides) and 'validation'\n    // (the domain name). The deprecated growth/pricing/ab experiment types\n    // redirect to `experiment` (V2), so their labels stay here.\n    alt_labels: [\n      'ab test', 'a/b test', 'split test',\n      'growth experiment', 'pricing experiment', 'usability test',\n      'discovery experiment',\n    ],\n    framework_labels: {\n      ost: 'Experiment',\n      design_thinking: 'Test',\n      lean_startup: 'Experiment',\n    },\n    designations: {\n      discovery: 'Discovery Experiment',\n      ab_test: 'A/B Test',\n      growth: 'Growth Experiment',\n      pricing: 'Pricing Experiment',\n      usability: 'Usability Test',\n    },\n  },\n\n  // ── hypothesis ───────────────────────────────────────────────────────────────\n\n  {\n    id: 'hypothesis',\n    canonical_label: 'Hypothesis',\n    alt_labels: ['bet', 'testable assumption', 'leap of faith'],\n    framework_labels: {\n      lean_startup: 'Hypothesis',\n      running_lean: 'Riskiest Assumption',\n      lean_canvas: 'Riskiest Assumption',\n    },\n  },\n\n  // ── metric (CONSOLIDATED: absorbs kpi, north_star_metric, input_metric, metric_definition) ──\n\n  {\n    id: 'metric',\n    canonical_label: 'Metric',\n    alt_labels: [\n      'kpi', 'key performance indicator', 'north star metric', 'nsm',\n      'input metric', 'output metric', 'metric definition',\n      'measure', 'indicator', 'signal', 'counter metric', 'guardrail metric',\n    ],\n    framework_labels: {\n      aarrr: 'Pirate Metric',\n      dora: 'DORA Metric',\n      lean_canvas: 'Key Metric',\n      okr_tree: 'Key Result Metric',\n    },\n    designations: {\n      north_star: 'North Star',\n      kpi: 'KPI',\n      driver: 'Driver',\n      input: 'Input',\n      guardrail: 'Guardrail',\n      proxy: 'Proxy',\n      health: 'Health',\n      vanity: 'Vanity',\n      metric: 'Metric',\n    },\n  },\n\n  // ── user_journey ─────────────────────────────────────────────────────────────\n\n  {\n    id: 'user_journey',\n    canonical_label: 'User Journey',\n    alt_labels: ['journey map', 'customer journey', 'experience map', 'journey'],\n    framework_labels: {\n      design_thinking: 'Journey Map',\n      lean_canvas: 'Customer Journey',\n    },\n    designations: {\n      current_state: 'Current State',\n      future_state: 'Future State',\n      day_in_the_life: 'Day in the Life',\n      service_blueprint: 'Service Blueprint',\n    },\n  },\n\n  // ── persona ──────────────────────────────────────────────────────────────────\n\n  {\n    id: 'persona',\n    canonical_label: 'Persona',\n    alt_labels: ['user persona', 'buyer persona', 'customer persona', 'user type', 'archetype', 'actor'],\n    framework_labels: {\n      design_thinking: 'Persona',\n      lean_canvas: 'Customer Segment',\n      bmc: 'Customer Archetype',\n    },\n  },\n\n  // ── desired_outcome ──────────────────────────────────────────────────────────\n\n  {\n    id: 'desired_outcome',\n    canonical_label: 'Desired Outcome',\n    alt_labels: ['gain', 'user gain', 'customer gain', 'expected outcome'],\n    framework_labels: {\n      ost: 'Desired Outcome',\n      jtbd: 'Desired Outcome',\n      vpc: 'Customer Gain',\n    },\n  },\n\n  // ── insight (CONSOLIDATED: absorbs research_insight, finding, ux_insight) ────\n\n  {\n    id: 'insight',\n    canonical_label: 'Insight',\n    alt_labels: [\n      'research insight', 'finding', 'ux insight', 'user insight',\n      'discovery', 'key finding', 'research finding', 'design insight',\n      'analytics insight', 'feedback insight',\n    ],\n    framework_labels: {\n      design_thinking: 'Finding',\n      ost: 'Insight',\n    },\n    designations: {\n      atomic: 'Atomic Insight',\n      composite: 'Composite Insight',\n      strategic: 'Strategic Insight',\n    },\n  },\n\n  // ── job ──────────────────────────────────────────────────────────────────────\n\n  {\n    id: 'job',\n    canonical_label: 'Job',\n    alt_labels: ['job to be done', 'jtbd', 'job', 'customer job', 'user job', 'functional job', 'social job', 'emotional job'],\n    framework_labels: {\n      ost: 'Opportunity (job)',\n      design_thinking: 'Task',\n      jtbd: 'Job',\n      vpc: 'Customer Job',\n    },\n  },\n\n  // ── outcome ──────────────────────────────────────────────────────────────────\n\n  {\n    id: 'outcome',\n    canonical_label: 'Outcome',\n    // 'desired outcome' stripped (P-B / UPG-670): it was the canonical label of\n    // the distinct `desired_outcome` (Ulwick JTBD) type. The OST framework_label\n    // below still surfaces \"Desired Outcome\" in OST context, framework-scoped.\n    alt_labels: ['product outcome', 'business outcome', 'target outcome'],\n    framework_labels: {\n      ost: 'Desired Outcome',\n      okr_tree: 'Outcome',\n    },\n  },\n\n  // ── objective ────────────────────────────────────────────────────────────────\n\n  {\n    id: 'objective',\n    canonical_label: 'Objective',\n    alt_labels: ['goal', 'strategic goal', 'team goal'],\n    framework_labels: {\n      okr_tree: 'Objective',\n    },\n  },\n\n  // ── key_result ───────────────────────────────────────────────────────────────\n\n  {\n    id: 'key_result',\n    canonical_label: 'Key Result',\n    alt_labels: ['kr', 'measurable result', 'target'],\n    framework_labels: {\n      okr_tree: 'Key Result',\n    },\n  },\n\n  // ── feature ──────────────────────────────────────────────────────────────────\n\n  {\n    id: 'feature',\n    canonical_label: 'Feature',\n    // 'capability' stripped (P-B / UPG-670): it is the canonical label of the\n    // distinct `capability` type (Wardley / DDD). A search for \"capability\" must\n    // resolve there, not to a feature.\n    alt_labels: ['product feature', 'functionality'],\n    framework_labels: {\n      rice: 'Scored Item',\n      moscow: 'Prioritised Item',\n      kano: 'Classified Feature',\n    },\n  },\n\n  // ── user_story ───────────────────────────────────────────────────────────────\n\n  {\n    id: 'user_story',\n    canonical_label: 'User Story',\n    alt_labels: ['story', 'requirement', 'as a... i want... so that...'],\n    framework_labels: {\n      moscow: 'Prioritised Story',\n    },\n  },\n\n  // ── Business Model Canvas types ──────────────────────────────────────────────\n\n  {\n    id: 'value_proposition',\n    canonical_label: 'Value Proposition',\n    alt_labels: ['value prop', 'vp', 'unique value proposition', 'uvp', 'unfair advantage'],\n    framework_labels: {\n      bmc: 'Value Proposition',\n      lean_canvas: 'Unique Value Proposition',\n      vpc: 'Value Map',\n    },\n  },\n  {\n    id: 'partnership',\n    canonical_label: 'Partnership',\n    alt_labels: ['key partner', 'partner', 'key partners', 'strategic partner'],\n    framework_labels: {\n      bmc: 'Key Partner',\n    },\n  },\n  {\n    id: 'key_resource',\n    canonical_label: 'Key Resource',\n    alt_labels: ['resource', 'key asset', 'critical resource'],\n    framework_labels: {\n      bmc: 'Key Resource',\n    },\n  },\n  {\n    id: 'key_activity',\n    canonical_label: 'Key Activity',\n    alt_labels: ['activity', 'core activity', 'critical activity'],\n    framework_labels: {\n      bmc: 'Key Activity',\n    },\n  },\n  {\n    id: 'target_customer_segment',\n    canonical_label: 'Target Customer Segment',\n    alt_labels: ['customer segment', 'segment', 'target segment', 'audience'],\n    framework_labels: {\n      bmc: 'Customer Segment',\n      lean_canvas: 'Customer Segment',\n    },\n  },\n  {\n    id: 'customer_relationship',\n    canonical_label: 'Customer Relationship',\n    alt_labels: ['relationship', 'engagement model', 'customer engagement'],\n    framework_labels: {\n      bmc: 'Customer Relationship',\n    },\n  },\n  {\n    id: 'distribution_channel',\n    canonical_label: 'Distribution Channel',\n    // bare 'channel' stripped (P-B / UPG-670): shared 3-way with\n    // `acquisition_channel` and `marketing_channel`. BMC/Lean-Canvas framework\n    // contexts still surface \"Channel\" via framework_labels below.\n    alt_labels: ['distribution channel', 'sales channel', 'delivery channel', 'distribution'],\n    framework_labels: {\n      bmc: 'Channel',\n      lean_canvas: 'Channel',\n    },\n  },\n  {\n    id: 'revenue_stream',\n    canonical_label: 'Revenue Stream',\n    alt_labels: ['revenue', 'income stream', 'monetization'],\n    framework_labels: {\n      bmc: 'Revenue Stream',\n      lean_canvas: 'Revenue Stream',\n    },\n  },\n  {\n    id: 'cost_structure',\n    canonical_label: 'Cost Structure',\n    alt_labels: ['costs', 'expense', 'cost base', 'operating cost'],\n    framework_labels: {\n      bmc: 'Cost Structure',\n      lean_canvas: 'Cost Structure',\n    },\n  },\n\n  // ── Design Thinking types ────────────────────────────────────────────────────\n\n  {\n    id: 'observation',\n    canonical_label: 'Observation',\n    alt_labels: ['field note', 'user observation', 'behavioural note', 'ethnographic note'],\n    framework_labels: {\n      design_thinking: 'Observation',\n    },\n  },\n  {\n    id: 'design_question',\n    canonical_label: 'Design Question',\n    alt_labels: ['hmw', 'how might we', 'design challenge', 'problem reframe', 'opportunity question'],\n    framework_labels: {\n      design_thinking: 'How Might We',\n    },\n  },\n  {\n    id: 'design_concept',\n    canonical_label: 'Design Concept',\n    alt_labels: ['concept', 'design idea', 'concept sketch'],\n    framework_labels: {\n      design_thinking: 'Concept',\n    },\n  },\n  {\n    id: 'prototype',\n    canonical_label: 'Prototype',\n    alt_labels: ['mockup', 'mock', 'poc', 'proof of concept', 'lo-fi', 'hi-fi'],\n    framework_labels: {\n      design_thinking: 'Prototype',\n    },\n  },\n\n  // ── AARRR types ──────────────────────────────────────────────────────────────\n\n  {\n    id: 'funnel',\n    canonical_label: 'Funnel',\n    alt_labels: ['conversion funnel', 'user funnel', 'marketing funnel', 'sales funnel'],\n    framework_labels: {\n      aarrr: 'AARRR Funnel',\n    },\n  },\n  {\n    id: 'funnel_step',\n    canonical_label: 'Funnel Step',\n    alt_labels: ['funnel stage', 'conversion stage', 'lifecycle stage'],\n    framework_labels: {\n      aarrr: 'Pirate Metric Stage',\n    },\n  },\n\n  // ── DORA types ───────────────────────────────────────────────────────────────\n\n  {\n    id: 'deployment',\n    canonical_label: 'Deployment',\n    alt_labels: ['deploy', 'release deployment', 'ship event'],\n    framework_labels: {\n      dora: 'Deployment',\n    },\n  },\n  {\n    id: 'ci_pipeline',\n    canonical_label: 'CI Pipeline',\n    alt_labels: ['pipeline', 'ci/cd', 'build pipeline', 'github actions workflow'],\n    framework_labels: {\n      dora: 'Deployment Pipeline',\n    },\n  },\n  {\n    id: 'service_level_indicator',\n    canonical_label: 'Service Level Indicator',\n    alt_labels: ['sli', 'reliability indicator'],\n    framework_labels: {\n      dora: 'SLI',\n    },\n  },\n  {\n    id: 'service_level_objective',\n    canonical_label: 'Service Level Objective',\n    alt_labels: ['slo', 'reliability target'],\n    framework_labels: {\n      dora: 'SLO',\n    },\n  },\n\n  // ── Consolidated types (non-priority but have designations) ──────────────────\n\n  {\n    id: 'decision',\n    canonical_label: 'Decision',\n    alt_labels: ['product decision', 'strategic decision', 'team decision', 'adr', 'architecture decision record', 'tech decision', 'design decision'],\n    framework_labels: {},\n    designations: {\n      product: 'Product Decision',\n      architecture: 'Architecture Decision',\n      strategic: 'Strategic Decision',\n      operational: 'Operational Decision',\n    },\n  },\n  {\n    id: 'risk',\n    canonical_label: 'Risk',\n    alt_labels: ['risk item', 'project risk', 'programme risk'],\n    framework_labels: {},\n    designations: {\n      technical: 'Technical Risk',\n      business: 'Business Risk',\n      legal: 'Legal Risk',\n      security: 'Security Risk',\n      program: 'Program Risk',\n    },\n  },\n  {\n    id: 'incident',\n    canonical_label: 'Incident',\n    alt_labels: ['outage', 'service incident', 'security incident', 'production incident'],\n    framework_labels: {\n      dora: 'Incident',\n    },\n    designations: {\n      operational: 'Operational Incident',\n      security: 'Security Incident',\n      performance: 'Performance Incident',\n    },\n  },\n  {\n    id: 'user_flow',\n    canonical_label: 'User Flow',\n    alt_labels: ['flow', 'task flow', 'user path', 'navigation path', 'onboarding flow'],\n    framework_labels: {},\n    designations: {\n      onboarding: 'Onboarding Flow',\n      activation: 'Activation Flow',\n      checkout: 'Checkout Flow',\n      general: 'User Flow',\n    },\n  },\n  {\n    id: 'support_ticket',\n    canonical_label: 'Support Ticket',\n    alt_labels: [\n      'ticket', 'support case', 'customer issue', 'help request',\n      'defect report', 'bug report',\n    ],\n    framework_labels: {},\n    designations: {\n      question: 'Support Question',\n      bug: 'Bug Report',\n      feature_request: 'Feature Request',\n      defect: 'Defect Report',\n    },\n  },\n]\n\n// ─── Standard labels (canonical_label + alt_labels, no framework labels) ────────\n\n/**\n * Standard label entries for types that don't appear in major frameworks.\n * Most engineering, ops, security, and administrative types live here.\n * canonical_label is Title Case of the id; alt_labels are common synonyms.\n */\nconst STANDARD_LABELS: Record<string, Pick<UPGTypeLabel, 'alt_labels'>> = {\n  // Strategic layer\n  // 'service' stripped (P-B / UPG-670): canonical label of the distinct `service` type.\n  product: { alt_labels: ['offering', 'app', 'platform'] },\n  vision: { alt_labels: ['product vision', 'north star vision', 'long-term vision'] },\n  mission: { alt_labels: ['mission statement', 'purpose'] },\n  strategic_theme: { alt_labels: ['focus area', 'strategic focus area'] }, // N6: not 'theme'/'strategic pillar' (own types)\n  initiative: { alt_labels: ['strategic initiative', 'program initiative', 'workstream'] },\n  capability: { alt_labels: ['business capability', 'organizational capability'] },\n  value_stream: { alt_labels: ['value chain', 'stream'] },\n  strategic_pillar: { alt_labels: ['pillar', 'foundation'] },\n  assumption: { alt_labels: ['belief', 'working assumption', 'premise'] },\n  strategic_question: { alt_labels: ['open question', 'coordination question', 'ownership question'] },\n\n  // User layer\n  job_step: { alt_labels: ['job stage', 'job phase', 'job map step'] },\n  switching_cost: { alt_labels: ['lock-in', 'migration cost', 'switching barrier'] },\n\n  // Discovery layer\n  feasibility_study: { alt_labels: ['feasibility assessment', 'viability study', 'tech spike'] },\n  design_sprint: { alt_labels: ['sprint', 'gv sprint', 'google ventures sprint'] },\n\n  // Validation layer\n  learning: { alt_labels: ['validated learning', 'lesson learned', 'takeaway'] },\n  // test_plan re-homed validation → QA (UPG-678); its label entry now lives in\n  // the Quality Assurance & Testing layer below.\n  research_plan: { alt_labels: ['study plan', 'research brief'] },\n  evidence: { alt_labels: ['proof', 'supporting data', 'signal'] },\n  variant: { alt_labels: ['test variant', 'experiment arm', 'variation'] },\n\n  // Market layer\n  competitor: { alt_labels: ['rival', 'alternative', 'competitive product', 'competing product'] },\n  competitor_feature: { alt_labels: ['competitive feature', 'rival capability'] },\n  market_trend: { alt_labels: ['trend', 'industry trend', 'macro trend'] },\n  // bare 'segment' stripped (P-B / UPG-670): shared 2-way with `behavioral_segment`.\n  // 'market segment' is the qualified, unambiguous form.\n  market_segment: { alt_labels: ['market segment', 'market slice', 'tam segment', 'sam segment'] },\n  competitive_analysis: { alt_labels: ['competitor analysis', 'competitive landscape', 'market analysis'] },\n\n  // UX Research layer\n  research_study: { alt_labels: ['study', 'user study', 'research project', 'ux study'] },\n  participant: { alt_labels: ['research participant', 'interviewee', 'respondent', 'test subject'] },\n  quote: { alt_labels: ['user quote', 'verbatim', 'voice of customer'] },\n  affinity_cluster: { alt_labels: ['cluster', 'affinity group', 'theme cluster', 'affinity note'] },\n  research_question: { alt_labels: ['rq', 'study question', 'inquiry'] },\n  interview_guide: { alt_labels: ['discussion guide', 'interview script', 'moderator guide'] },\n  survey_response: { alt_labels: ['survey answer', 'questionnaire response'] },\n\n  // Design layer\n  // (UPG-663) alt_labels must not collide with other entity types' canonical\n  // names or alt_labels, or the string->type resolver is ambiguous.\n  // Dropped 'customer journey' (collides with customer_journey_stage),\n  // 'touchpoint' and 'journey phase' (both distinct entity surfaces: a\n  // touchpoint is the journey_step.touchpoint property, a phase is journey_phase).\n  user_journey: { alt_labels: ['journey map', 'experience map', 'journey'] },\n  journey_step: { alt_labels: ['journey moment', 'journey stage'] },\n  design_component: { alt_labels: ['component', 'ui component', 'design element'] },\n  design_token: { alt_labels: ['token', 'style token', 'css variable'] },\n  wireframe: { alt_labels: ['wireflow', 'lo-fi mockup', 'skeleton'] },\n  design_pattern: { alt_labels: ['ui pattern', 'ux pattern', 'interaction pattern'] },\n  design_guideline: { alt_labels: ['style guide', 'design rule', 'design standard'] },\n  annotation: { alt_labels: ['design annotation', 'spec note', 'callout'] },\n  interaction_spec: { alt_labels: ['interaction specification', 'motion spec', 'behaviour spec'] },\n  design_system: { alt_labels: ['component library', 'style system', 'ui kit'] },\n  screen: { alt_labels: ['page', 'view', 'route', 'ui state'] },\n  screen_state: { alt_labels: ['view state', 'empty state', 'loading state', 'error state'] },\n  surface: { alt_labels: ['slot', 'pane', 'region', 'zone', 'shell', 'panel', 'placement', 'ui surface'] },\n\n  // Brand layer\n  brand_identity: { alt_labels: ['brand', 'brand guidelines', 'brand book'] },\n  brand_imagery: { alt_labels: ['brand image', 'visual asset', 'brand photo'] },\n  brand_logo: { alt_labels: ['logo', 'logomark', 'wordmark', 'brand mark'] },\n  brand_colour: { alt_labels: ['brand color', 'colour palette', 'color palette'] },\n  brand_typography: { alt_labels: ['typeface', 'font family', 'type system'] },\n  brand_voice: { alt_labels: ['tone of voice', 'brand tone', 'writing style'] },\n\n  // Product Specification layer\n  // 'initiative' stripped (P-B / UPG-670): canonical label of the distinct `initiative` type.\n  epic: { alt_labels: ['large story', 'feature set'] },\n  feature_area: { alt_labels: ['feature group', 'capability area', 'module'] },\n  acceptance_criterion: { alt_labels: ['ac', 'done criterion', 'acceptance criteria', 'definition of done'] },\n  release: { alt_labels: ['version', 'ship', 'launch version', 'build'] },\n  task: { alt_labels: ['work item', 'todo', 'subtask', 'ticket'] },\n  bug: { alt_labels: ['defect', 'issue', 'regression'] },\n  fix: { alt_labels: ['bugfix', 'patch', 'remediation'] },\n  roadmap: { alt_labels: ['product roadmap', 'release plan', 'timeline'] },\n  roadmap_item: { alt_labels: ['roadmap entry', 'planned item'] },\n  roadmap_theme: { alt_labels: ['product theme', 'roadmap theme'] }, // UPG-660: renamed from bare 'theme' (N6 lineage)\n  planning_cycle: { alt_labels: ['sprint', 'iteration', 'cycle', 'program increment', 'pi', 'cadence', 'time-box', 'cooldown', 'quarter'] },\n  configuration_axis: { alt_labels: ['configuration', 'config axis', 'lever', 'variant axis', 'plan axis', 'flag axis', 'entitlement axis'] },\n\n  // Engineering layer\n  bounded_context: { alt_labels: ['context', 'domain boundary', 'module boundary'] },\n  service: { alt_labels: ['microservice', 'backend service', 'api service'] },\n  // 'event' stripped (P-B / UPG-670): canonical label of the distinct `event` type.\n  domain_event: { alt_labels: ['system event', 'business event'] },\n  // 'contract' stripped (P-B / UPG-670): canonical label of the distinct `contract` (legal) type.\n  api_contract: { alt_labels: ['api spec', 'api schema', 'openapi spec'] },\n  technical_debt_item: { alt_labels: ['tech debt', 'debt', 'tech debt item', 'cleanup'] },\n  feature_flag: { alt_labels: ['flag', 'toggle', 'feature toggle', 'release flag'] },\n  aggregate: { alt_labels: ['aggregate root', 'ddd aggregate'] },\n  domain_entity: { alt_labels: ['entity', 'ddd entity', 'domain object'] },\n  value_object: { alt_labels: ['vo', 'ddd value object'] },\n  command: { alt_labels: ['cqrs command', 'write command', 'mutation'] },\n  read_model: { alt_labels: ['projection', 'query model', 'cqrs read model'] },\n  api_endpoint: { alt_labels: ['endpoint', 'route', 'api route'] },\n  database_schema: { alt_labels: ['schema', 'db schema', 'table definition'] },\n  queue_topic: { alt_labels: ['topic', 'message queue', 'event bus topic', 'pubsub topic'] },\n  build_artifact: { alt_labels: ['artifact', 'binary', 'docker image', 'package'] },\n  code_repository: { alt_labels: ['repo', 'repository', 'git repo', 'codebase'] },\n  // 'dependency' stripped (P-B / UPG-670): canonical label of the distinct `dependency` type.\n  library_dependency: { alt_labels: ['package', 'library', 'npm package'] },\n  integration_pattern: { alt_labels: ['integration', 'pattern', 'middleware pattern'] },\n  external_api: { alt_labels: ['third-party api', 'vendor api', 'saas integration'] },\n  data_flow: { alt_labels: ['data movement', 'data transfer', 'pipeline flow'] },\n\n  // Growth layer\n  // bare 'channel' stripped (P-B / UPG-670): shared 3-way (see distribution_channel).\n  acquisition_channel: { alt_labels: ['acquisition channel', 'traffic source', 'user source'] },\n  growth_campaign: { alt_labels: ['campaign', 'marketing campaign', 'ad campaign', 'growth campaign'] },\n  cohort: { alt_labels: ['user cohort', 'retention cohort', 'signup cohort'] },\n  // bare 'segment' stripped (P-B / UPG-670): shared 2-way with `market_segment`.\n  // 'behavioral segment' / 'user segment' keep the affordance unambiguously.\n  behavioral_segment: { alt_labels: ['user segment', 'audience segment', 'behavioural segment'] },\n  growth_loop: { alt_labels: ['viral loop', 'referral loop', 'flywheel'] },\n  attribution_model: { alt_labels: ['attribution', 'marketing attribution', 'channel attribution'] },\n\n  // Business Model layer\n  business_model: { alt_labels: ['model', 'biz model'] },\n  pricing_tier: { alt_labels: ['plan', 'pricing plan', 'tier'] },\n  unit_economics: { alt_labels: ['unit econ', 'ltv/cac', 'economics'] },\n\n  // Go-To-Market layer\n  gtm_strategy: { alt_labels: ['go-to-market strategy', 'go to market', 'gtm plan', 'launch strategy'] },\n  ideal_customer_profile: { alt_labels: ['icp', 'target customer', 'ideal buyer'] },\n  positioning: { alt_labels: ['market positioning', 'positioning statement', 'brand position'] },\n  messaging: { alt_labels: ['messaging framework', 'value messaging', 'key messages'] },\n  launch: { alt_labels: ['product launch', 'go-live', 'ship date'] },\n  content_strategy: { alt_labels: ['editorial strategy', 'content plan'] },\n  sales_motion: { alt_labels: ['sales model', 'sales approach', 'plg', 'self-serve', 'sales-led'] },\n  competitive_battle_card: { alt_labels: ['battle card', 'competitive card', 'win/loss card'] },\n  demand_gen_program: { alt_labels: ['demand generation', 'demand gen', 'lead gen program'] },\n  territory: { alt_labels: ['sales territory', 'region', 'geo'] },\n  objection: { alt_labels: ['customer objection', 'sales objection', 'pushback'] },\n  rebuttal: { alt_labels: ['counter-argument', 'objection handler', 'response'] },\n  proof_point: { alt_labels: ['evidence point', 'case study reference', 'social proof'] },\n\n  // Team & Organisation layer\n  team: { alt_labels: ['squad', 'pod', 'tribe', 'team unit'] },\n  role: { alt_labels: ['position', 'job title', 'responsibility'] },\n  stakeholder: { alt_labels: ['sponsor', 'decision maker', 'approver'] },\n  team_okr: { alt_labels: ['team objective', 'team goal'] },\n  retrospective: { alt_labels: ['retro', 'sprint retro', 'team retro', 'post-mortem'] },\n  dependency: { alt_labels: ['team dependency', 'cross-team dependency', 'blocker'] },\n  department: { alt_labels: ['org unit', 'division', 'business unit'] },\n  // 'capability' stripped (P-B / UPG-670): canonical label of the distinct `capability` type.\n  skill: { alt_labels: ['competency', 'expertise'] },\n  ceremony: { alt_labels: ['ritual', 'meeting cadence', 'standup', 'retrospective meeting'] },\n  capacity_plan: { alt_labels: ['resourcing plan', 'staffing plan', 'headcount plan'] },\n\n  // Data & Analytics layer\n  data_source: { alt_labels: ['source', 'data origin', 'database'] },\n  event_schema: { alt_labels: ['tracking plan', 'event definition', 'analytics event'] },\n  dashboard: { alt_labels: ['analytics dashboard', 'report dashboard', 'monitoring dashboard'] },\n  data_model: { alt_labels: ['erd', 'entity relationship diagram', 'schema model'] },\n  data_quality_rule: { alt_labels: ['data rule', 'quality check', 'data validation'] },\n  data_product: { alt_labels: ['data asset', 'data offering'] },\n  // 'data flow' stripped (P-B / UPG-670): canonical label of the distinct `data_flow` type.\n  data_pipeline: { alt_labels: ['etl', 'elt', 'ingestion pipeline'] },\n  data_lineage: { alt_labels: ['lineage', 'data provenance', 'data trail'] },\n  glossary_term: { alt_labels: ['term', 'definition', 'business term'] },\n  data_domain: { alt_labels: ['data area', 'data subject area'] },\n  report: { alt_labels: ['analytics report', 'business report'] },\n\n  // Operations & Customer Success layer\n  customer_feedback: { alt_labels: ['feedback', 'user feedback', 'csat response'] },\n  churn_reason: { alt_labels: ['cancellation reason', 'churn driver', 'attrition cause'] },\n  customer_health_score: { alt_labels: ['health score', 'customer health', 'account health'] },\n  playbook: { alt_labels: ['cs playbook', 'success playbook', 'engagement playbook'] },\n  service_level_agreement: { alt_labels: ['sla', 'service agreement', 'support agreement', 'response time commitment'] },\n  customer_journey_stage: { alt_labels: ['journey stage', 'lifecycle stage', 'customer stage'] },\n  touchpoint: { alt_labels: ['interaction point', 'contact point', 'engagement point'] },\n  success_milestone: { alt_labels: ['cs milestone', 'onboarding milestone', 'adoption milestone'] },\n  service_blueprint: { alt_labels: ['blueprint', 'service map', 'service design'] },\n  nps_campaign: { alt_labels: ['nps survey', 'nps score', 'net promoter score', 'nps'] },\n\n  // Content & Knowledge layer\n  content_piece: { alt_labels: ['content', 'article', 'blog post', 'content asset'] },\n  document: { alt_labels: ['doc', 'general document', 'file'] },\n  knowledge_base_article: { alt_labels: ['kb article', 'help article', 'faq', 'support doc'] },\n  brand_asset: { alt_labels: ['asset', 'creative asset', 'marketing asset'] },\n  internal_doc: { alt_labels: ['internal document', 'wiki page', 'confluence page', 'notion doc'] },\n  prompt_template: { alt_labels: ['prompt', 'ai prompt', 'system prompt', 'template'] },\n  changelog: { alt_labels: ['release notes', \"what's new\", 'update log'] },\n  content_calendar: { alt_labels: ['editorial calendar', 'publishing schedule'] },\n  content_theme: { alt_labels: ['editorial theme', 'content pillar', 'topic cluster'] },\n  documentation_template: { alt_labels: ['doc template', 'template'] },\n\n  // Legal, Compliance & Risk layer\n  compliance_requirement: { alt_labels: ['regulation', 'compliance rule', 'regulatory requirement'] },\n  data_contract: { alt_labels: ['data agreement', 'data sharing agreement'] },\n  legal_entity: { alt_labels: ['company', 'subsidiary', 'legal body'] },\n  ip_asset: { alt_labels: ['intellectual property', 'patent', 'trademark', 'ip'] },\n  audit_log_policy: { alt_labels: ['audit policy', 'logging policy', 'retention policy'] },\n  contract: { alt_labels: ['agreement', 'legal contract'] },\n  contract_clause: { alt_labels: ['clause', 'term', 'provision'] },\n  privacy_policy: { alt_labels: ['privacy notice', 'data privacy policy'] },\n  compliance_framework: { alt_labels: ['regulatory framework', 'iso standard', 'soc2'] },\n  security_audit: { alt_labels: ['audit', 'compliance audit', 'security assessment'] },\n\n  // DevOps & Platform layer\n  error_budget: { alt_labels: ['reliability budget', 'downtime budget'] },\n  investigation: { alt_labels: ['incident investigation', 'root cause analysis', 'debugging'] },\n  postmortem: { alt_labels: ['post-mortem', 'incident review', 'rca', 'root cause analysis'] },\n  // 'playbook' stripped (P-B / UPG-670): canonical label of the distinct `playbook` type.\n  runbook: { alt_labels: ['operations guide', 'sop', 'standard operating procedure'] },\n  monitor: { alt_labels: ['health check', 'synthetic monitor', 'uptime check'] },\n  alert_rule: { alt_labels: ['alert', 'pager rule', 'notification rule'] },\n  release_strategy: { alt_labels: ['rollout strategy', 'deployment strategy', 'canary release'] },\n  root_cause: { alt_labels: ['root cause', 'underlying cause', 'origin'] },\n  symptom: { alt_labels: ['indicator', 'sign', 'manifestation'] },\n  on_call_rotation: { alt_labels: ['on-call schedule', 'pager rotation', 'incident rotation'] },\n  infrastructure_component: { alt_labels: ['infra', 'cloud resource', 'server', 'container'] },\n\n  // Security layer\n  threat_model: { alt_labels: ['threat analysis', 'stride model', 'attack surface'] },\n  threat: { alt_labels: ['attack vector', 'security threat', 'risk vector'] },\n  vulnerability: { alt_labels: ['vuln', 'cve', 'security flaw', 'weakness'] },\n  security_control: { alt_labels: ['control', 'safeguard', 'countermeasure', 'mitigation'] },\n  security_policy: { alt_labels: ['infosec policy', 'security standard'] },\n  penetration_test: { alt_labels: ['pentest', 'pen test', 'security test'] },\n  // bare 'audit' / 'security assessment' stripped (P-B / UPG-670): both owned by\n  // `security_audit`. A `security_review` is a code-review-scoped activity; the\n  // qualified 'security code review' keeps it findable without colliding.\n  security_review: { alt_labels: ['code review', 'security code review'] },\n  data_classification: { alt_labels: ['classification', 'sensitivity level', 'data label'] },\n  access_policy: { alt_labels: ['iam policy', 'rbac rule', 'permission', 'access control'] },\n\n  // Sales & Revenue layer\n  // 'organization' stripped (P-B / UPG-670): canonical label of the distinct `organization` type.\n  account: { alt_labels: ['customer account', 'client'] },\n  // 'person' stripped (P-B / UPG-670): canonical label of the distinct `person` type.\n  contact: { alt_labels: ['buyer', 'champion'] },\n  lead: { alt_labels: ['prospect', 'mql', 'sql', 'marketing lead'] },\n  // 'opportunity' stripped (P-B / UPG-670): canonical label of the distinct `opportunity` (OST) type.\n  deal: { alt_labels: ['sales opportunity', 'opp'] },\n  pipeline_sales: { alt_labels: ['sales pipeline', 'deal pipeline', 'revenue pipeline'] },\n  pipeline_stage: { alt_labels: ['deal stage', 'sales stage'] },\n  // bare 'quote' qualified to 'sales quote' (P-B / UPG-670): 'quote' is the\n  // canonical label of the distinct `quote` type. The qualified form keeps the\n  // sales-document search affordance without misresolving.\n  quote_document: { alt_labels: ['sales quote', 'proposal', 'estimate', 'quotation'] },\n  subscription: { alt_labels: ['recurring revenue', 'saas subscription', 'plan'] },\n  invoice: { alt_labels: ['bill', 'payment request'] },\n  forecast: { alt_labels: ['revenue forecast', 'sales forecast', 'projection'] },\n\n  // Program Management layer\n  program: { alt_labels: ['programme', 'initiative portfolio'] },\n  project: { alt_labels: ['workstream', 'work package'] },\n  milestone: { alt_labels: ['checkpoint', 'gate', 'deadline'] },\n  risk_register: { alt_labels: ['risk log', 'risk tracker'] },\n  change_request: { alt_labels: ['cr', 'rfc', 'scope change', 'change order'] },\n  deliverable: { alt_labels: ['output', 'work product', 'artifact'] },\n  resource_allocation: { alt_labels: ['allocation', 'assignment', 'staffing'] },\n  status_report: { alt_labels: ['sitrep', 'progress report', 'weekly update'] },\n\n  // Accessibility layer\n  a11y_standard: { alt_labels: ['accessibility standard', 'wcag', 'ada requirement'] },\n  a11y_guideline: { alt_labels: ['accessibility guideline', 'wcag guideline'] },\n  a11y_audit: { alt_labels: ['accessibility audit', 'a11y review'] },\n  a11y_issue: { alt_labels: ['accessibility issue', 'a11y bug', 'accessibility violation'] },\n  a11y_annotation: { alt_labels: ['accessibility annotation', 'aria note'] },\n\n  // Marketing & Communications layer\n  marketing_strategy: { alt_labels: ['marketing plan', 'growth strategy'] },\n  // bare 'channel' stripped (P-B / UPG-670): shared 3-way (see distribution_channel).\n  marketing_channel: { alt_labels: ['marketing channel', 'paid channel', 'organic channel'] },\n  marketing_campaign_plan: { alt_labels: ['campaign plan', 'launch campaign'] },\n  email_sequence: { alt_labels: ['drip campaign', 'nurture sequence', 'email flow'] },\n  social_post: { alt_labels: ['tweet', 'linkedin post', 'social media post'] },\n  seo_keyword: { alt_labels: ['keyword', 'search term', 'target keyword'] },\n  ad_creative: { alt_labels: ['ad', 'advertisement', 'creative'] },\n  press_release: { alt_labels: ['pr', 'media release', 'announcement'] },\n  event: { alt_labels: ['conference', 'meetup', 'webinar event', 'launch event'] },\n  community_initiative: { alt_labels: ['community program', 'community project', 'developer community'] },\n\n  // Localisation & i18n layer\n  locale: { alt_labels: ['language', 'region', 'l10n target'] },\n  translation_key: { alt_labels: ['i18n key', 'message key', 'string key'] },\n  translation_bundle: { alt_labels: ['language file', 'locale bundle', 'message bundle'] },\n  locale_config: { alt_labels: ['locale settings', 'regional config'] },\n  cultural_adaptation: { alt_labels: ['localization', 'cultural customization', 'market adaptation'] },\n  regional_pricing: { alt_labels: ['geo pricing', 'ppp pricing', 'local pricing'] },\n\n  // Customer Education & Training layer\n  education_program: { alt_labels: ['training program', 'onboarding program', 'academy'] },\n  tutorial: { alt_labels: ['how-to', 'guide', 'getting started'] },\n  walkthrough: { alt_labels: ['product tour', 'guided tour', 'interactive guide'] },\n  webinar: { alt_labels: ['live demo', 'online workshop', 'virtual event'] },\n  certification: { alt_labels: ['cert', 'credential', 'badge'] },\n  help_video: { alt_labels: ['tutorial video', 'screencast', 'how-to video'] },\n  learning_path: { alt_labels: ['curriculum', 'course track', 'learning journey'] },\n\n  // Quality Assurance & Testing layer\n  // test_plan re-homed validation → QA (UPG-678): QA-shaped labels only.\n  // 'validation plan' and 'experiment plan' stripped — those belong to the\n  // validation-side `experiment_plan` type.\n  test_plan: { alt_labels: ['test strategy', 'qa plan', 'master test plan'] },\n  test_suite: { alt_labels: ['test collection', 'test group'] },\n  test_case: { alt_labels: ['test', 'test scenario', 'verification step'] },\n  qa_session: { alt_labels: ['testing session', 'exploratory test', 'qa round'] },\n  regression_test: { alt_labels: ['regression', 'regression check'] },\n  test_coverage_report: { alt_labels: ['coverage report', 'coverage'] },\n  test_environment: { alt_labels: ['staging', 'qa environment', 'sandbox'] },\n  test_result: { alt_labels: ['test outcome', 'test run result', 'assertion result'] },\n\n  // Partner & Ecosystem Management layer\n  partner_program: { alt_labels: ['partnership program', 'channel program'] },\n  partner_tier: { alt_labels: ['partner level', 'partnership tier'] },\n  api_ecosystem: { alt_labels: ['platform ecosystem', 'developer ecosystem', 'integration ecosystem'] },\n  marketplace_listing: { alt_labels: ['listing', 'app store listing', 'marketplace entry'] },\n  developer_portal: { alt_labels: ['dev portal', 'api docs site', 'developer hub'] },\n  integration_partner: { alt_labels: ['tech partner', 'integration vendor'] },\n  partner_revenue_share: { alt_labels: ['rev share', 'commission', 'affiliate payout'] },\n\n  // Feedback & Voice of Customer layer\n  feedback_program: { alt_labels: ['voice of customer program', 'voc program'] },\n  feature_request: { alt_labels: ['request', 'product request', 'enhancement request'] },\n  feedback_vote: { alt_labels: ['upvote', 'vote', 'user vote'] },\n  user_advisory_board: { alt_labels: ['cab', 'customer advisory board', 'advisory council'] },\n  beta_program: { alt_labels: ['beta', 'early access', 'preview program'] },\n  feedback_theme: { alt_labels: ['feedback cluster', 'feedback category'] }, // N6: not bare 'theme'\n\n  // Pricing & Packaging layer\n  pricing_strategy: { alt_labels: ['pricing model', 'monetization strategy'] },\n  package: { alt_labels: ['product package', 'bundle', 'sku'] },\n  discount_strategy: { alt_labels: ['discount', 'promotion', 'coupon strategy'] },\n  trial_config: { alt_labels: ['free trial', 'trial settings', 'trial period'] },\n  paywall: { alt_labels: ['gate', 'upgrade wall', 'monetization gate'] },\n\n  // AI/ML Operations layer\n  ai_dataset: { alt_labels: ['training data', 'dataset', 'ml dataset'] },\n  ai_experiment: { alt_labels: ['ml experiment', 'model experiment'] },\n  ai_model: { alt_labels: ['model', 'ml model', 'llm', 'machine learning model'] },\n  prompt_version: { alt_labels: ['prompt revision', 'prompt iteration'] },\n  eval_benchmark: { alt_labels: ['benchmark', 'evaluation', 'eval suite'] },\n  eval_run: { alt_labels: ['evaluation run', 'benchmark run', 'eval result'] },\n  ai_cost_tracker: { alt_labels: ['llm cost', 'token usage', 'ai spend'] },\n  hallucination_report: { alt_labels: ['hallucination', 'factuality error', 'grounding failure'] },\n  ai_guardrail: { alt_labels: ['guardrail', 'safety rail', 'content filter'] },\n  ai_trace: { alt_labels: ['inference trace', 'llm trace', 'ai log'] },\n  model_comparison: { alt_labels: ['model eval', 'a/b model test', 'model benchmark'] },\n\n  // Agentic Workflows & Process layer\n  agent_task: { alt_labels: ['agent work item', 'automated task'] },\n  workflow_template: { alt_labels: ['workflow', 'process template', 'automation'] },\n  workflow_run: { alt_labels: ['run', 'execution', 'workflow execution'] },\n  agent_definition: { alt_labels: ['agent', 'ai agent', 'autonomous agent'] },\n  agent_session: { alt_labels: ['session', 'agent run', 'agent conversation'] },\n  review_gate: { alt_labels: ['approval gate', 'quality gate', 'stage gate'] },\n  approval_record: { alt_labels: ['approval', 'sign-off', 'authorization'] },\n  // bare 'skill' qualified to 'agent skill' (P-B / UPG-670): 'skill' is the\n  // canonical label of the distinct team_org `skill` type.\n  agent_skill: { alt_labels: ['agent skill', 'tool', 'agent capability'] },\n  agent_hook: { alt_labels: ['hook', 'trigger', 'callback'] },\n  workflow_artifact: { alt_labels: ['artifact', 'output artifact', 'generated artifact'] },\n\n  // Portfolio layer\n  organization: { alt_labels: ['org', 'company', 'enterprise', 'organisation'] },\n  portfolio: { alt_labels: ['product portfolio', 'product line', 'product suite'] },\n  product_area: { alt_labels: ['area', 'product domain', 'vertical'] },\n  workspace: { alt_labels: ['canvas', 'thinking space', 'working area'] },\n}\n\n// ─── Build the complete map ─────────────────────────────────────────────────────\n\n/**\n * Convert snake_case to Title Case, respecting known abbreviations.\n */\nfunction toTitleCase(id: string): string {\n  const UPPER = new Set([\n    'kpi', 'jtbd', 'okr', 'sli', 'slo', 'sla', 'api', 'ci', 'ip', 'qa',\n    'ai', 'ml', 'ab', 'bm', 'nps', 'seo', 'gtm', 'erd',\n  ])\n  return id\n    .split('_')\n    .map((w) => {\n      if (UPPER.has(w)) return w.toUpperCase()\n      if (w === 'a11y') return 'A11y'\n      return w.charAt(0).toUpperCase() + w.slice(1)\n    })\n    .join(' ')\n}\n\n/**\n * Collect old type names that migrate into a given canonical type.\n * These become additional alt_labels automatically.\n */\nfunction getMigrationAliases(canonicalType: string): string[] {\n  const aliases: string[] = []\n  for (const migrations of Object.values(UPG_MIGRATIONS)) {\n    for (const m of migrations) {\n      if (m.to === canonicalType) {\n        // Add the old type name as a Title Case alias\n        aliases.push(m.from.replace(/_/g, ' '))\n      }\n    }\n  }\n  return aliases\n}\n\n// ─── Reverse-generated framework labels from framework definitions ────────────\n\n/**\n * Reverse-generate framework_labels and alt_labels from the canonical framework\n * library. For each framework, each slot tells us \"this framework calls entity\n * type X by label Y\". Aggregating across all 346 frameworks gives us the\n * complete Rosetta Stone mapping.\n */\ninterface GeneratedLabelData {\n  framework_labels: Record<string, string>\n  slot_alt_labels: string[]\n}\n\nconst _generatedLabels: Map<string, GeneratedLabelData> = new Map()\n\nfor (const fw of UPG_FRAMEWORKS) {\n  if (!fw.slots) continue\n  for (const slot of fw.slots) {\n    const entityType = slot.entityTypeId\n    if (!entityType) continue\n\n    let entry = _generatedLabels.get(entityType)\n    if (!entry) {\n      entry = { framework_labels: {}, slot_alt_labels: [] }\n      _generatedLabels.set(entityType, entry)\n    }\n\n    // Map framework ID → slot label (e.g. \"lean-canvas\" → \"Revenue Streams\")\n    if (!entry.framework_labels[fw.id]) {\n      entry.framework_labels[fw.id] = slot.label\n    }\n\n    // Collect unique slot labels as potential alt_labels\n    const normalised = slot.label.toLowerCase()\n    if (!entry.slot_alt_labels.includes(normalised)) {\n      entry.slot_alt_labels.push(normalised)\n    }\n  }\n}\n\n// Index priority labels by id for O(1) lookup during assembly\nconst _priorityIndex = new Map(PRIORITY_LABELS.map((p) => [p.id, p]))\n\n/**\n * The complete Rosetta Stone: one UPGTypeLabel for every active type.\n *\n * Assembly logic:\n * 1. If a type has a PRIORITY_LABELS entry → use it (richest framework_labels)\n * 2. Else if a type has a STANDARD_LABELS entry → build from that\n * 3. Else → auto-generate from the type name (canonical_label only)\n *\n * In all cases, migration aliases are merged into alt_labels automatically.\n */\nexport const UPG_TYPE_LABELS: UPGTypeLabel[] = UPG_ACTIVE_TYPES.map((typeName) => {\n  const migrationAliases = getMigrationAliases(typeName)\n\n  const generated = _generatedLabels.get(typeName)\n\n  // 1. Priority entry (hand-authored with framework_labels)\n  const priority = _priorityIndex.get(typeName)\n  if (priority) {\n    // Merge migration aliases + generated slot labels into alt_labels\n    const existingSet = new Set(priority.alt_labels.map((a) => a.toLowerCase()))\n    const newAliases = migrationAliases.filter((a) => !existingSet.has(a.toLowerCase()))\n    const slotAliases = (generated?.slot_alt_labels ?? []).filter((a) => !existingSet.has(a) && !newAliases.some((n) => n.toLowerCase() === a))\n\n    // Merge generated framework_labels (hand-authored take priority)\n    const mergedFrameworkLabels = {\n      ...(generated?.framework_labels ?? {}),\n      ...priority.framework_labels, // hand-authored wins\n    }\n\n    return {\n      ...priority,\n      emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,\n      alt_labels: [...priority.alt_labels, ...newAliases, ...slotAliases],\n      framework_labels: mergedFrameworkLabels,\n    }\n  }\n\n  // 2. Standard entry (alt_labels only, enrich with generated framework_labels)\n  const standard = STANDARD_LABELS[typeName]\n  if (standard) {\n    const existingSet = new Set(standard.alt_labels.map((a) => a.toLowerCase()))\n    const newAliases = migrationAliases.filter((a) => !existingSet.has(a.toLowerCase()))\n    const slotAliases = (generated?.slot_alt_labels ?? []).filter((a) => !existingSet.has(a) && !newAliases.some((n) => n.toLowerCase() === a))\n\n    return {\n      id: typeName,\n      canonical_label: toTitleCase(typeName),\n      emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,\n      alt_labels: [...standard.alt_labels, ...newAliases, ...slotAliases],\n      framework_labels: generated?.framework_labels ?? {},\n    }\n  }\n\n  // 3. Auto-generated (enrich with generated data)\n  const slotAliases = (generated?.slot_alt_labels ?? []).filter((a) => !migrationAliases.some((m) => m.toLowerCase() === a))\n\n  return {\n    id: typeName,\n    canonical_label: toTitleCase(typeName),\n    emoji: ENTITY_EMOJI[typeName] ?? DEFAULT_ENTITY_EMOJI,\n    alt_labels: [...migrationAliases, ...slotAliases],\n    framework_labels: generated?.framework_labels ?? {},\n  }\n})\n\n// ─── Lookup helpers ─────────────────────────────────────────────────────────────\n\n/** O(1) lookup by entity type id */\nexport const UPG_TYPE_LABELS_MAP: ReadonlyMap<string, UPGTypeLabel> = new Map(\n  UPG_TYPE_LABELS.map((entry) => [entry.id, entry]),\n)\n\n/**\n * Resolve the display label for an entity type, with optional framework context.\n *\n * Priority:\n * 1. If frameworkId provided and a framework_labels entry exists → use it\n * 2. If designation provided and a designations entry exists → use it\n * 3. Fall back to canonical_label\n * 4. Fall back to Title Case of the id\n *\n * @example\n * resolveLabel('persona')                 // → 'Persona'       (canonical)\n * resolveLabel('need', 'lean_canvas')     // → 'Problem'       (framework-specific)\n * resolveLabel('need', undefined, 'pain') // → 'Pain Point'    (designation-specific)\n * resolveLabel('not_a_type')              // → 'Not A Type'    (Title Case fallback)\n */\nexport function resolveLabel(\n  entityType: string,\n  frameworkId?: string,\n  designation?: string,\n): string {\n  const entry = UPG_TYPE_LABELS_MAP.get(entityType)\n  if (!entry) {\n    // Unknown type: best-effort Title Case\n    return toTitleCase(entityType)\n  }\n\n  if (frameworkId && entry.framework_labels[frameworkId]) {\n    return entry.framework_labels[frameworkId]\n  }\n\n  if (designation && entry.designations?.[designation]) {\n    return entry.designations[designation]\n  }\n\n  return entry.canonical_label\n}\n\n// ─── Auto-generated TYPE_ALIASES ────────────────────────────────────────────────\n\n/**\n * Build the TYPE_ALIASES map from alt_labels.\n *\n * Replaces the hand-maintained TYPE_ALIASES in validation.ts.\n * Maps every alt_label (and its snake_case variant) → canonical entity type id.\n *\n * Collision rule: first entry wins (entries earlier in UPG_TYPE_LABELS take priority).\n *\n * @example\n * const aliases = buildTypeAliases()\n * aliases['jtbd']              // → 'job'        (JTBD alt-label → canonical)\n * aliases['job_to_be_done']    // → 'job'\n * aliases['problem']           // → 'need'       (Lean Canvas label → canonical)\n */\nexport function buildTypeAliases(): Record<string, string> {\n  const aliases: Record<string, string> = {}\n\n  for (const entry of UPG_TYPE_LABELS) {\n    for (const label of entry.alt_labels) {\n      // Normalise to snake_case for matching\n      const snaked = label.toLowerCase().replace(/[\\s\\-\\/]+/g, '_')\n\n      // First entry wins; don't overwrite existing aliases\n      if (!aliases[snaked]) {\n        aliases[snaked] = entry.id\n      }\n\n      // Also store the raw lowercase version (for natural-language matching)\n      const lower = label.toLowerCase()\n      if (lower !== snaked && !aliases[lower]) {\n        aliases[lower] = entry.id\n      }\n    }\n  }\n\n  return aliases\n}\n\n/** Pre-built alias map. Import this instead of calling buildTypeAliases() repeatedly. */\nexport const UPG_TYPE_ALIASES: Record<string, string> = buildTypeAliases()\n","/**\n * UPG canonical tree patterns: the named, server-owned shapes the `get_tree`\n * tool assembles (OST, OKR, user, product, validation, strategy, feature areas,\n * delivery, architecture, journey, design system, commercial, north star, org) —\n * one per tree-shaped region (or, for `architecture`/`commercial`/`org`, the\n * tree-shaped containment subset of a DAG/multi-hub region).\n *\n * A tree pattern is anchor + a TYPE-DRIVEN child map, NOT a list of edge names.\n * `get_tree` roots at `anchor_type` (falling back through `fallback_anchors` when\n * the anchor has no nodes or yields a childless tree) and walks the live graph:\n * at a node of type T, a neighbour whose type is in `child_map[T]` becomes a\n * child, whatever edge wired them. This is deliberate: the `/upg-show-tree` skill\n * drifted precisely because it hardcoded edge names (e.g. `vision_guides_strategic_theme`)\n * that a real graph did not use (its bets anchored on the product). Following to\n * the next TYPE, not a named edge, is drift-proof: a chain refinement in the edge\n * catalogue cannot rot the pattern. Polymorphic parentage is native: a child type\n * is simply listed under every parent type that can hold it (a `strategic_theme`\n * appears under `vision`, `product`, and `strategic_pillar`).\n *\n * Each child carries a `required` flag. Only a MISSING required child produces a\n * `gap`; optional children render when present and are silent when absent. This\n * is what separates a real structural hole (a bet with no initiative) from noise\n * (a feature with no epic, where the epic tier is optional).\n *\n * The chains here were authored by resolving every (parent, child) pair against\n * the live catalogue (2026-06-11), and corrected against a post-ship report from\n * field-testing on a real 304-node graph (G1-G7).\n *\n * https://unifiedproductgraph.org | MIT\n */\n\nimport { UPG_EDGE_CATALOG } from '../catalog/edge-catalog.js'\n\n/** One child slot in a pattern: a child entity type and whether it is gap-worthy. */\nexport interface UPGTreeChild {\n  /** The child entity type. */\n  type: string\n  /**\n   * When true, a parent of this slot's owning type that has NO child of `type`\n   * is reported as a structural gap. Optional (default false) children render\n   * when present and are silent when absent.\n   */\n  required?: boolean\n  /**\n   * The node property `get_tree` sorts this slot's children by (ascending,\n   * nodes lacking it last). Ordering is a property of the DATA, not the viewer,\n   * so the server returns children pre-sorted rather than leaving every client\n   * to re-sort (UPG-663 sequence scalars: `phase_order`, `step_order`,\n   * `action_order`, `state_order`). Omitted -> children keep declared slot order.\n   */\n  order_by?: string\n  /**\n   * Spine resolution for a DAG. When this slot reaches the SAME node redundantly\n   * with a path through a sibling type (e.g. `user_journey -> journey_step`\n   * directly AND `user_journey -> journey_phase -> journey_step`), name that\n   * sibling type here. A child also reachable as a grandchild through a\n   * `prefer_via`-typed child renders under that spine, NOT here -- collapsing the\n   * redundant path so the node is neither silently dropped (G5) nor\n   * double-counted (J1). A child not on the spine still renders here, so the\n   * direct path remains the fallback when the grouping layer is absent.\n   */\n  prefer_via?: string\n}\n\n/** How a pattern decides what counts as a structural gap. */\nexport type UPGTreeGapPolicy = 'required-children-only' | 'all-optional'\n\n/** A canonical tree shape for `get_tree`. */\nexport interface UPGTreePattern {\n  /** Stable id (the `pattern` argument to get_tree). */\n  id: string\n  /** Display name. */\n  label: string\n  /** One-line description of what the tree shows. */\n  description: string\n  /** The framework this pattern realises, where one maps (else undefined). */\n  framework_id?: string\n  /**\n   * The canonical region this pattern is the tree view of (ties pattern ->\n   * region -> its `shape`). A region may afford several patterns (e.g.\n   * `product_delivery` has product, feature_areas, and delivery).\n   */\n  region: string\n  /**\n   * `required-children-only`: a node missing a required child type is a gap.\n   * `all-optional`: a browse view; nothing is gap-flagged (heterogeneous wiring\n   * where gap-flagging would be noise). Descriptive; the assembler already\n   * derives gaps from the per-child `required` flags.\n   */\n  gap_policy: UPGTreeGapPolicy\n  /** Canonical root entity type. */\n  anchor_type: string\n  /**\n   * Root types tried, in order, when `anchor_type` has no nodes OR the assembled\n   * tree reaches no descendants (the \"wrong root, empty tree\" case). The anchor\n   * actually used is reported back in the get_tree metadata.\n   */\n  fallback_anchors: string[]\n  /**\n   * Type-driven adjacency: for a node of type `parent_type`, a graph neighbour\n   * whose type is one of `child_map[parent_type]`'s slots is a child. Omitted\n   * parent types are leaves. Branching is expressed by listing several slots; a\n   * child type listed under several parents is polymorphically parented.\n   */\n  child_map: Record<string, UPGTreeChild[]>\n  /** The pattern's natural rendering depth (default for get_tree's `depth`). */\n  natural_depth: number\n}\n\n/** Sugar for a required child slot (optionally ordered by a node scalar). */\nconst req = (type: string, order_by?: string): UPGTreeChild =>\n  order_by ? { type, required: true, order_by } : { type, required: true }\n/** Sugar for an optional child slot (optionally ordered by a node scalar). */\nconst opt = (type: string, order_by?: string): UPGTreeChild =>\n  order_by ? { type, order_by } : { type }\n\n/**\n * The canonical tree patterns. Every type referenced is an active UPG entity\n * type; integrity tests assert that and that each pattern is reachable from its\n * anchor. Append-only by convention (ids are a public surface).\n */\nexport const UPG_TREE_PATTERNS: readonly UPGTreePattern[] = [\n  {\n    id: 'ost',\n    label: 'Opportunity Solution Tree',\n    description: 'A desired outcome branching into the opportunities under it, the solutions that address them, and the hypotheses + experiment plans that validate them (Teresa Torres).',\n    framework_id: 'opportunity-solution-tree',\n    region: 'discovery_research_validation',\n    gap_policy: 'required-children-only',\n    anchor_type: 'outcome',\n    fallback_anchors: ['desired_outcome', 'opportunity'],\n    child_map: {\n      outcome: [req('opportunity')],\n      desired_outcome: [req('opportunity')],\n      opportunity: [req('solution')],\n      solution: [opt('hypothesis')],\n      hypothesis: [opt('experiment_plan')],\n    },\n    natural_depth: 5,\n  },\n  {\n    id: 'okr',\n    label: 'Objectives and Key Results',\n    description: 'Strategic themes containing objectives, each measured by its key results and the metric that quantifies them (John Doerr).',\n    framework_id: 'okr-framework',\n    region: 'strategy_outcomes',\n    gap_policy: 'required-children-only',\n    anchor_type: 'strategic_theme',\n    fallback_anchors: ['objective'],\n    child_map: {\n      strategic_theme: [req('objective')],\n      objective: [req('key_result')],\n      key_result: [opt('metric')],\n    },\n    natural_depth: 4,\n  },\n  {\n    id: 'user',\n    label: 'User chain',\n    description: 'A persona and the jobs it pursues, branching into the needs and desired outcomes behind them.',\n    region: 'users_needs',\n    gap_policy: 'required-children-only',\n    anchor_type: 'persona',\n    fallback_anchors: ['job'],\n    child_map: {\n      persona: [req('job'), opt('need'), opt('desired_outcome')],\n      job: [opt('need'), opt('desired_outcome')],\n    },\n    natural_depth: 3,\n  },\n  {\n    id: 'product',\n    label: 'Product breakdown',\n    description: 'The product organised into feature areas, then features, and the optional epic + user story tiers beneath them.',\n    region: 'product_delivery',\n    gap_policy: 'required-children-only',\n    anchor_type: 'product',\n    fallback_anchors: ['feature_area', 'feature'],\n    child_map: {\n      product: [opt('feature_area')],\n      feature_area: [req('feature')],\n      feature: [opt('epic')],\n      epic: [opt('user_story')],\n    },\n    natural_depth: 5,\n  },\n  {\n    id: 'validation',\n    label: 'Validation chain',\n    description: 'A hypothesis through its experiment plan, the experiment (or its runs), and the learning it produced.',\n    framework_id: 'build-measure-learn',\n    region: 'discovery_research_validation',\n    gap_policy: 'required-children-only',\n    anchor_type: 'hypothesis',\n    fallback_anchors: ['experiment_plan', 'experiment'],\n    child_map: {\n      hypothesis: [req('experiment_plan')],\n      experiment_plan: [req('experiment'), req('experiment_run')],\n      experiment: [opt('experiment_run'), opt('learning')],\n      experiment_run: [opt('learning')],\n    },\n    natural_depth: 5,\n  },\n  {\n    id: 'strategy',\n    label: 'Strategy cascade',\n    description: 'Vision and mission into the strategic themes (bets), the initiatives that pursue them, and the outcomes they drive. Themes are polymorphically parented: they hang off vision, the product, or a strategic pillar, whichever the graph wired.',\n    region: 'strategy_outcomes',\n    gap_policy: 'required-children-only',\n    anchor_type: 'vision',\n    fallback_anchors: ['product', 'strategic_theme'],\n    child_map: {\n      vision: [opt('mission'), opt('strategic_theme')],\n      mission: [opt('strategic_pillar')],\n      strategic_pillar: [opt('strategic_theme')],\n      product: [opt('strategic_theme')],\n      strategic_theme: [req('initiative')],\n      initiative: [opt('outcome')],\n    },\n    natural_depth: 5,\n  },\n  {\n    id: 'feature_areas',\n    label: 'Feature areas',\n    description: 'Feature areas and the features they contain.',\n    region: 'product_delivery',\n    gap_policy: 'all-optional',\n    anchor_type: 'feature_area',\n    fallback_anchors: ['feature'],\n    child_map: {\n      feature_area: [opt('feature')],\n    },\n    natural_depth: 2,\n  },\n  {\n    id: 'delivery',\n    label: 'Delivery roadmap',\n    description: 'How product work is scheduled and shipped: the roadmap and its themes/items, the releases they schedule, the features (and the changelog + bugs) those releases deliver, and the feature areas a theme spans. Optional epic + user story tiers appear on request.',\n    region: 'product_delivery',\n    gap_policy: 'all-optional',\n    anchor_type: 'roadmap',\n    // Fallback is the product alone: a graph with no roadmap roots at the\n    // product (product -> release -> feature), reported as anchor_resolved_from:\n    // roadmap. `release` is deliberately NOT a fallback root — a 32-release\n    // forest would out-node the product and shadow it under the most-nodes rule.\n    fallback_anchors: ['product'],\n    child_map: {\n      // product holds releases directly (the delivery axis without a roadmap),\n      // but NOT the roadmap: listing roadmap here made the product a superset of\n      // the roadmap, so the most-nodes anchor rule rooted delivery at the product\n      // even when a roadmap existed. Dropping it lets the roadmap win when present.\n      product: [opt('release')],\n      roadmap: [opt('roadmap_theme'), opt('roadmap_item'), opt('release')],\n      roadmap_theme: [opt('feature'), opt('feature_area')],\n      roadmap_item: [opt('feature')],\n      release: [opt('feature'), opt('changelog'), opt('bug')],\n      feature: [opt('epic')],\n      epic: [opt('user_story')],\n    },\n    // Default to 3 tiers (roadmap -> theme/item/release -> feature) for a\n    // readable overview on a many-release roadmap; `depth` extends into\n    // epic -> user_story.\n    natural_depth: 3,\n  },\n  {\n    id: 'architecture',\n    label: 'Architecture',\n    description: 'The engineering platform: services and the API contracts, endpoints, schemas, queues, deployments, and dependencies they own, grouped by bounded context, with domain aggregates and their members. A DAG (a schema or queue shared by several services renders once, then as a reference).',\n    region: 'engineering_platform',\n    gap_policy: 'all-optional',\n    anchor_type: 'service',\n    fallback_anchors: ['bounded_context'],\n    child_map: {\n      bounded_context: [\n        opt('service'), opt('external_api'), opt('data_flow'), opt('integration_pattern'),\n        opt('code_repository'), opt('api_contract'), opt('aggregate'), opt('domain_event'),\n      ],\n      service: [\n        opt('api_contract'), opt('api_endpoint'), opt('database_schema'), opt('queue_topic'),\n        opt('deployment'), opt('build_artifact'), opt('library_dependency'), opt('feature_flag'),\n      ],\n      aggregate: [opt('domain_entity'), opt('value_object'), opt('command'), opt('domain_event')],\n    },\n    natural_depth: 3,\n  },\n  {\n    id: 'journey',\n    label: 'User journey',\n    description: 'A user journey over time: its phases and steps, the actions within each step, and the screens those steps surface. Falls back to a user_flow when journeys are not yet mapped.',\n    region: 'experience_design_brand',\n    gap_policy: 'all-optional',\n    anchor_type: 'user_journey',\n    fallback_anchors: ['user_flow'],\n    child_map: {\n      // The phase is the grouping layer: a step reachable through a phase\n      // renders under the phase, not twice (J1). `prefer_via` collapses the\n      // redundant direct path; a step in NO phase still renders here. Children\n      // are returned in `*_order` sequence (J2), not storage order.\n      user_journey: [\n        opt('journey_phase', 'phase_order'),\n        { type: 'journey_step', prefer_via: 'journey_phase', order_by: 'step_order' },\n      ],\n      journey_phase: [opt('journey_step', 'step_order')],\n      journey_step: [opt('journey_action', 'action_order'), opt('screen')],\n      user_flow: [opt('screen')],\n      screen: [opt('screen_state', 'state_order')],\n    },\n    natural_depth: 3,\n  },\n  {\n    id: 'design_system',\n    label: 'Design system',\n    description: 'A design system broken into its components, their nested sub-components (atom to molecule to organism), and the design tokens they consume.',\n    region: 'experience_design_brand',\n    gap_policy: 'all-optional',\n    anchor_type: 'design_system',\n    fallback_anchors: ['design_component'],\n    child_map: {\n      design_system: [opt('design_component'), opt('design_token')],\n      design_component: [opt('design_component'), opt('design_token')],\n    },\n    natural_depth: 3,\n  },\n  {\n    id: 'commercial',\n    label: 'Commercial / money model',\n    description: 'The business-model spine: how the product captures value. The business model branches into its revenue streams, cost structure, and unit economics; a stream into its pricing tiers, the metrics that measure it, and the pricing strategy that prices it; and metrics decompose into their components (the MRR waterfall, NRR composition). A pricing tier reached from both its stream and its pricing strategy renders once, then as a shared reference.',\n    // The sustaining money-model captures value as a containment hierarchy, so it\n    // earns a tree even though business_gtm_growth is a multi-hub region: a pattern\n    // is a curated spanning tree over a SUBSET of a region (cf. `architecture` over\n    // the engineering_platform DAG). The GTM/value flow (positioning -> messaging\n    // -> funnel) is deliberately NOT here — a tree would misrepresent it; it wants\n    // sibling flow instruments. Company-grain financial metrics (CAC, LTV, runway)\n    // hang off the product, not a single stream/cost, so they live in the okr/\n    // strategy views, not this money-structure spine.\n    region: 'business_gtm_growth',\n    gap_policy: 'all-optional',\n    anchor_type: 'business_model',\n    // Fallback is the product alone, and product is deliberately NOT a child_map\n    // parent: were business_model listed under product, the product would be a\n    // superset of the money spine and the most-nodes anchor rule would root there\n    // (the same trap delivery hit with product -> roadmap). With product childless,\n    // business_model always out-nodes it and wins; a graph with no business_model\n    // falls back to a bare product root, reported anchor_resolved_from: business_model.\n    fallback_anchors: ['product'],\n    child_map: {\n      business_model: [opt('revenue_stream'), opt('cost_structure'), opt('unit_economics')],\n      revenue_stream: [opt('pricing_tier'), opt('metric'), opt('pricing_strategy')],\n      cost_structure: [opt('metric')],\n      pricing_strategy: [opt('pricing_tier')],\n      // Self-nesting: a metric decomposes into its component metrics (Net New MRR ->\n      // New/Expansion/Contraction/Churned). The assembler's `seen` set terminates\n      // the recursion for free (a metric met again becomes a shared reference).\n      metric: [opt('metric')],\n    },\n    // Default to 3 tiers (business_model -> stream/cost -> tier/metric) for a\n    // readable money-model overview; `depth` extends into the metric -> metric\n    // decomposition waterfall.\n    natural_depth: 3,\n  },\n  {\n    id: 'north_star',\n    label: 'North Star impact',\n    description: 'A north-star metric, the input/sub-metrics it decomposes into, and the outcomes it drives. The metric-rooted, leading-indicator view: outcomes hang off the metric by influence (the causal `drives` edge), distinct from the OKR view where the outcome sits on top and the metric measures it.',\n    framework_id: 'north-star-metric',\n    region: 'strategy_outcomes',\n    gap_policy: 'all-optional',\n    anchor_type: 'metric',\n    // A north-star tree roots at a metric by definition; no fallback (no metric =\n    // no north-star view, honestly empty rather than rooting elsewhere).\n    fallback_anchors: [],\n    child_map: {\n      // A metric decomposes into its input/sub-metrics (the `metric_decomposes_into_metric`\n      // hierarchy) AND drives the outcomes it predicts (the causal `metric_drives_outcome`).\n      // The outcome is a child by INFLUENCE, not containment — the leading-to-lagging chain.\n      // Following the causal edge by type-adjacency (cf. `strategy`'s initiative -> outcome)\n      // is how the metric-rooted view renders without re-creating the metric ⊃ outcome\n      // containment cycle removed in UPG-685 T0.4. The assembler's `seen` set terminates the\n      // metric -> metric recursion for free.\n      metric: [opt('metric'), opt('outcome')],\n    },\n    natural_depth: 3,\n  },\n  {\n    id: 'org',\n    label: 'Org chart',\n    description: 'Departments and the teams they contain, plus the sub-teams nested within those teams. The people-structure org chart, walked by containment (department_contains_team, then team_contains_team). Distinct from product_area, which is the product classification axis, not the org.',\n    region: 'operations_quality',\n    gap_policy: 'all-optional',\n    anchor_type: 'department',\n    // A graph with no department roots at the team (team -> sub-team), reported\n    // anchor_resolved_from: department. A sub-team also renders as a bare team\n    // root when its parent department is not modelled.\n    fallback_anchors: ['team'],\n    child_map: {\n      // department -> team (department_contains_team) is the first level; team ->\n      // team (team_contains_team, 0.17.2) is the second, so a sub-team nested one\n      // level deeper than department_contains_team renders under its parent team.\n      // Self-nesting: the assembler's `seen` set terminates a team -> team cycle\n      // for free (a team met again becomes a shared reference).\n      department: [opt('team')],\n      team: [opt('team')],\n    },\n    // Default to 3 tiers (department -> team -> sub-team); `depth` extends into\n    // deeper team_contains_team nesting.\n    natural_depth: 3,\n  },\n] as const\n\n/** O(1) lookup by pattern id. */\nexport const UPG_TREE_PATTERNS_BY_ID: Record<string, UPGTreePattern> = Object.fromEntries(\n  UPG_TREE_PATTERNS.map((p) => [p.id, p]),\n)\n\n/** Look up a tree pattern by id. */\nexport function getTreePattern(id: string): UPGTreePattern | undefined {\n  return UPG_TREE_PATTERNS_BY_ID[id]\n}\n\n/**\n * One resolved edge in a pattern's child map: the (parent -> child) pair plus\n * the canonical edge that wires it, resolved LIVE from the edge catalogue (not\n * stored on the pattern). `via`/`kind` are null only if the grammar has no edge\n * for the pair, which the drift-check forbids. A reader gets the real edge\n * without reverse-engineering it from behaviour.\n */\nexport interface UPGTreePatternEdge {\n  parent: string\n  child: string\n  /** Canonical edge type wiring parent -> child, or null if ungrounded. */\n  via: string | null\n  /** The edge's classification (hierarchy, semantic, cross-domain, ...), or null. */\n  kind: string | null\n  required: boolean\n  /** Node scalar this slot's children are sorted by, when declared (J2). */\n  order_by?: string\n  /** Sibling type whose path is the canonical spine for this child (J1), when declared. */\n  prefer_via?: string\n}\n\n/** A pattern with its child map resolved to concrete edges (for introspection). */\nexport interface UPGTreePatternDetail extends UPGTreePattern {\n  /** The child_map flattened to (parent, child, via, kind, required) rows. */\n  edges: UPGTreePatternEdge[]\n}\n\n/** A pattern summary row (no child_map) for list_tree_patterns. */\nexport interface UPGTreePatternSummary {\n  id: string\n  label: string\n  description: string\n  framework_id?: string\n  region: string\n  anchor_type: string\n  fallback_anchors: string[]\n  natural_depth: number\n  gap_policy: UPGTreeGapPolicy\n  /** Number of (parent -> child) slots in the child map. */\n  slot_count: number\n}\n\n/**\n * The canonical edge wiring `source -> target`, resolved from the edge\n * catalogue. Returns the FIRST catalogue edge whose endpoints match (a pair is\n * wired by at most one canonical within-product edge). null when the grammar\n * has no such edge.\n */\nfunction resolvePatternEdge(source: string, target: string): { via: string; kind: string } | null {\n  for (const [id, def] of Object.entries(UPG_EDGE_CATALOG)) {\n    if (def.source_type === source && def.target_type === target) {\n      return { via: id, kind: def.classification }\n    }\n  }\n  return null\n}\n\n/** Flatten a pattern's child_map to resolved (parent, child, via, kind) edges. */\nexport function resolveTreePatternEdges(pattern: UPGTreePattern): UPGTreePatternEdge[] {\n  const out: UPGTreePatternEdge[] = []\n  for (const [parent, children] of Object.entries(pattern.child_map)) {\n    for (const c of children) {\n      const e = resolvePatternEdge(parent, c.type)\n      const row: UPGTreePatternEdge = { parent, child: c.type, via: e?.via ?? null, kind: e?.kind ?? null, required: !!c.required }\n      if (c.order_by) row.order_by = c.order_by\n      if (c.prefer_via) row.prefer_via = c.prefer_via\n      out.push(row)\n    }\n  }\n  return out\n}\n\n/**\n * The full declarative record for one pattern: the pattern plus its child_map\n * resolved to concrete edges. The `via`/`kind` are derived from the live edge\n * catalogue at call time, so they cannot drift from the grammar.\n */\nexport function describeTreePattern(id: string): UPGTreePatternDetail | undefined {\n  const p = getTreePattern(id)\n  if (!p) return undefined\n  return { ...p, fallback_anchors: [...p.fallback_anchors], edges: resolveTreePatternEdges(p) }\n}\n\n/** Every pattern as a summary row (the list_tree_patterns surface). */\nexport function listTreePatternSummaries(): UPGTreePatternSummary[] {\n  return UPG_TREE_PATTERNS.map((p) => ({\n    id: p.id,\n    label: p.label,\n    description: p.description,\n    framework_id: p.framework_id,\n    region: p.region,\n    anchor_type: p.anchor_type,\n    fallback_anchors: [...p.fallback_anchors],\n    natural_depth: p.natural_depth,\n    gap_policy: p.gap_policy,\n    slot_count: Object.values(p.child_map).reduce((n, cs) => n + cs.length, 0),\n  }))\n}\n","/**\n * UPG area-taxonomy cross-walk (0.9.16). Three overlapping \"area\" groupings ship\n * across the stack, and skills repeatedly conflated them, computing coverage\n * against a stale denominator:\n *\n *   1. `get_graph_digest.coverage` -> 10 stage-oriented coverage keys\n *      (identity, understanding, discovery, validation, reaching, converting,\n *       building, sustaining, learning, operations). Source of truth:\n *      `BUSINESS_AREAS` in the SDK's lib/tools.ts.\n *   2. `list_regions` -> 11 canonical super-domain regions (this package's\n *      regions/catalog.ts: strategy_outcomes ... foundations).\n *   3. the shared docs' \"8 business areas\" (identity ... learning). Source of\n *      truth: `BusinessArea` / `BUSINESS_AREA_META` in the SDK's classification.ts.\n *\n * This table is the documented, introspectable correspondence between them, so a\n * skill can translate any direction instead of guessing. It is keyed by the 10\n * `digest.coverage` keys (the denominator skills hit most): each entry names the\n * matching \"8 business area\" (null for `validation` and `operations`, which the\n * 8-area grouping folds into discovery / omits) and the canonical region ids the\n * key's entities live in (primary first).\n *\n * Drift guard: a test in the SDK pins `coverage_key` against the live\n * `BUSINESS_AREAS` keys and `business_area` against `BUSINESS_AREA_META`, so this\n * table cannot silently fall out of step with the runtime denominators. Region\n * ids are validated against `UPG_REGIONS` by the test in this package.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n/** One row of the area-taxonomy cross-walk, keyed by a `digest.coverage` key. */\nexport interface UPGAreaTaxonomyEntry {\n  /** The `get_graph_digest.coverage` key (one of the 10). */\n  coverage_key: string\n  /** Human label. */\n  label: string\n  /**\n   * The matching \"8 business area\" id, or null when the 8-area grouping has no\n   * direct equivalent (`validation` folds into `discovery`; `operations` is not\n   * one of the 8).\n   */\n  business_area: string | null\n  /** Canonical region ids whose entities this coverage key draws from (primary first). */\n  regions: string[]\n}\n\n/**\n * The cross-walk. Append/edit in lockstep with the SDK `BUSINESS_AREAS` (coverage\n * keys) and `classification.ts` (business areas); the SDK drift test enforces it.\n */\nexport const UPG_AREA_TAXONOMY: readonly UPGAreaTaxonomyEntry[] = [\n  { coverage_key: 'identity',      label: 'Identity',      business_area: 'identity',      regions: ['strategy_outcomes'] },\n  { coverage_key: 'understanding', label: 'Understanding', business_area: 'understanding', regions: ['users_needs', 'discovery_research_validation'] },\n  { coverage_key: 'discovery',     label: 'Discovery',     business_area: 'discovery',     regions: ['discovery_research_validation', 'market_competitive'] },\n  { coverage_key: 'validation',    label: 'Validation',    business_area: null,            regions: ['discovery_research_validation'] },\n  { coverage_key: 'reaching',      label: 'Reaching',      business_area: 'reaching',      regions: ['business_gtm_growth'] },\n  { coverage_key: 'converting',    label: 'Converting',    business_area: 'converting',    regions: ['business_gtm_growth'] },\n  { coverage_key: 'building',      label: 'Building',      business_area: 'building',      regions: ['product_delivery', 'experience_design_brand'] },\n  { coverage_key: 'sustaining',    label: 'Sustaining',    business_area: 'sustaining',    regions: ['business_gtm_growth'] },\n  { coverage_key: 'learning',      label: 'Learning',      business_area: 'learning',      regions: ['strategy_outcomes', 'analytics_data', 'operations_quality'] },\n  { coverage_key: 'operations',    label: 'Operations',    business_area: null,            regions: ['operations_quality'] },\n] as const\n\n/** O(1) lookup by `digest.coverage` key. */\nexport const UPG_AREA_TAXONOMY_BY_COVERAGE_KEY: Readonly<Record<string, UPGAreaTaxonomyEntry>> =\n  Object.fromEntries(UPG_AREA_TAXONOMY.map((e) => [e.coverage_key, e]))\n\n/** The cross-walk row for a `digest.coverage` key, or undefined. */\nexport function getAreaTaxonomyEntry(coverageKey: string): UPGAreaTaxonomyEntry | undefined {\n  return UPG_AREA_TAXONOMY_BY_COVERAGE_KEY[coverageKey]\n}\n\n/** The `digest.coverage` keys whose entities live (partly) in a given region. */\nexport function getCoverageKeysForRegion(regionId: string): string[] {\n  return UPG_AREA_TAXONOMY.filter((e) => e.regions.includes(regionId)).map((e) => e.coverage_key)\n}\n\n/** The \"8 business area\" ids that map to a given region (deduped). */\nexport function getBusinessAreasForRegion(regionId: string): string[] {\n  const out: string[] = []\n  for (const e of UPG_AREA_TAXONOMY) {\n    if (e.regions.includes(regionId) && e.business_area && !out.includes(e.business_area)) {\n      out.push(e.business_area)\n    }\n  }\n  return out\n}\n","/**\n * Canonical playbook definitions.\n *\n * 12 playbooks across 10 regions:\n * - 10 canonical (one per region; W1 invariant).\n * - 2 specialised (business-growth-metric-driven, business-marketing-audience-first).\n *\n * UPG-585: no playbook is framework-anchored anymore; framework anchors now\n * live on the canonical playbooks' related_framework_ids.\n *\n * Every existing v0.2.x workflow maps here; cross-region lens workflows\n * (`product-journey`, `full-product-journey`) were dropped; their content\n * is already covered by the 10 canonical region playbooks.\n */\n\nimport type { UPGPlaybook } from '../types.js'\nimport type { Step } from '../../step-sequence.js'\n\n/**\n * Helper to keep entity-sequence step records compact.\n */\nfunction seqStep(\n  order: number,\n  phase: string,\n  entity_types: readonly string[],\n  prompt_hint: string,\n  options?: { next_sequence_on_gap?: string },\n): Step {\n  return {\n    kind: 'entity_sequence',\n    order,\n    phase,\n    name: phase,\n    prompt_hint,\n    entity_types,\n    ...(options?.next_sequence_on_gap\n      ? { next_sequence_on_gap: options.next_sequence_on_gap }\n      : {}),\n  }\n}\n\n/**\n * Helper for one-step domain-guide playbooks (the v0.2 domain-workflow shape).\n */\nfunction domainGuideStep(\n  domain_id: string,\n  phase: string,\n  name: string,\n  prompt_hint: string,\n  options?: { next_sequence_on_gap?: string },\n): Step {\n  return {\n    kind: 'domain_guide',\n    order: 1,\n    phase,\n    name,\n    prompt_hint,\n    domain_id,\n    ...(options?.next_sequence_on_gap\n      ? { next_sequence_on_gap: options.next_sequence_on_gap }\n      : {}),\n  }\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 1 - strategy_outcomes (anchor `objective`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const STRATEGY_OUTCOMES_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:strategy-outcomes',\n  name: 'Strategy & Outcomes',\n  version: '0.2.0',\n  description:\n    'Cascade vision through themes, outcomes, objectives, key results, and the bets you are making to get there.',\n  region: 'strategy_outcomes',\n  is_canonical: true,\n  related_framework_ids: ['okr-framework', 'three-horizons', 'north-star-metric', 'metrics-tree', 'wardley-map'],\n  // DT-PB-3: anchor is `outcome`, not `objective`. The creation_sequence\n  // creates outcome (step 3) before objective (step 4), and outcome is the\n  // strategy region's gravitational centre (objectives translate outcomes).\n  target_anchor_entity: 'outcome',\n  creation_sequence: [\n    seqStep(1, 'Vision & Mission',\n      ['vision', 'mission'],\n      'Name what you are building toward and how you will get there. Vision is the destination; mission is the orientation. One of each, no more.'),\n    seqStep(2, 'Themes',\n      ['strategic_theme', 'strategic_pillar'],\n      'Choose 2–4 strategic themes that focus the work. Past four, you have lost focus, not gained coverage.'),\n    seqStep(3, 'Outcomes',\n      ['outcome'],\n      'Frame the changes in the world the product is trying to cause: shifts in behavior, perception, or position. Not features shipped.'),\n    seqStep(4, 'Objectives',\n      ['objective'],\n      'Translate outcomes into directional bets the team commits to within a horizon. An objective is an ambition with a deadline attached.'),\n    seqStep(5, 'Key Results',\n      ['key_result', 'metric'],\n      'Give each objective 2–4 measurable key results. Without measurement, the objective is a wish.'),\n    seqStep(6, 'Initiatives & Capabilities',\n      ['initiative', 'capability'],\n      'Group features and work streams into initiatives the team will actually execute. Name the capabilities they build.'),\n    seqStep(7, 'Assumptions & Decisions',\n      ['assumption', 'decision'],\n      'Capture the bets you are making (assumptions) and the choices you have ratified (decisions). These guard the work against silent drift.',\n      { next_sequence_on_gap: 'playbook:discovery-research-validation' }),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 2 - users_needs (anchor `persona`)\n// ════════════════════════════════════════════════════════════════════════════\n\n/**\n * Canonical users_needs playbook: net-new authored content per Q.C of the\n * decision doc. Persona has 25 inbound cross-edges; the spec's gravitational\n * centre. Skeleton-only is not acceptable here.\n */\nexport const USERS_NEEDS_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:users-needs',\n  name: 'Users & Needs',\n  version: '0.1.0',\n  description:\n    'Bootstrap personas, jobs, needs, and desired outcomes: the user side of every product graph.',\n  region: 'users_needs',\n  is_canonical: true,\n  related_framework_ids: ['persona-canvas', 'empathy-map', 'value-proposition-canvas', 'kano-model'],\n  target_anchor_entity: 'persona',\n  creation_sequence: [\n    seqStep(\n      1,\n      'Anchor',\n      ['persona'],\n      'Capture 1–3 user archetypes you are building for. Keep the set small: one persona per distinct mental model.',\n    ),\n    seqStep(\n      2,\n      'Jobs',\n      ['job'],\n      'Name the jobs each persona is trying to get done. What progress are they trying to make?',\n    ),\n    seqStep(\n      3,\n      'Job steps',\n      ['job_step'],\n      'Decompose each job into the observable steps a persona walks through (when this is useful).',\n    ),\n    seqStep(\n      4,\n      'Needs',\n      ['need'],\n      'Capture what each persona requires to make progress on each job: the explicit asks and gaps.',\n    ),\n    seqStep(\n      5,\n      'Desired outcomes',\n      ['desired_outcome'],\n      'Frame measurable success criteria each persona would accept: the “done” signal for the job.',\n    ),\n    seqStep(\n      6,\n      'Switching costs',\n      ['switching_cost'],\n      'List what stops each persona from moving from their current solution: the friction to overcome.',\n    ),\n    seqStep(\n      7,\n      'Participants',\n      ['participant'],\n      'Optional, post-research: research-resolved instances of personas (real people you spoke with).',\n    ),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 3 - discovery_research_validation (anchor `opportunity`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:discovery-research-validation',\n  name: 'Discovery, Research & Validation',\n  version: '0.1.0',\n  description:\n    'Evidence-first discovery sequence: plan → recruit → observe → synthesize → insight → opportunity → hypothesis → test.',\n  region: 'discovery_research_validation',\n  is_canonical: true,\n  related_framework_ids: ['double-diamond', 'opportunity-solution-tree', 'build-measure-learn', 'hypothesis-board'],\n  target_anchor_entity: 'opportunity',\n  creation_sequence: [\n    seqStep(1, 'Plan',\n      ['research_plan', 'research_question', 'interview_guide', 'research_study'],\n      'Define what you need to learn: research questions, study design, interview guides.'),\n    seqStep(2, 'Recruit',\n      ['participant', 'persona', 'behavioral_segment'],\n      'Find the right participants. Who can teach you what you need to know?'),\n    seqStep(3, 'Observe',\n      ['observation', 'quote', 'survey_response'],\n      'Gather raw data: observations, quotes, survey responses, field notes.'),\n    seqStep(4, 'Synthesize',\n      ['affinity_cluster', 'feedback_theme'],\n      'Make sense of the data: cluster, pattern-match, extract themes.'),\n    seqStep(5, 'Insight',\n      ['insight', 'evidence', 'learning'],\n      'Crystallize learnings into actionable insights. What did you discover?'),\n    seqStep(6, 'Opportunity',\n      ['opportunity', 'need', 'desired_outcome'],\n      'Connect insights to opportunities. What should the product do about this?'),\n    seqStep(7, 'Hypothesis',\n      ['hypothesis', 'assumption'],\n      'Frame testable hypotheses from research. What assumptions need validation?'),\n    seqStep(8, 'Test',\n      // DT-PB-1: was `experiment` — which resolved to NO canonical edge with\n      // hypothesis, forcing an orphan. `experiment_run` is the hypothesis-linked\n      // test unit (experiment_run_validates_hypothesis, experiment_run_yields_evidence).\n      // (UPG-664) `test_plan` re-homed to QA (UPG-678); the validation plan is\n      // `experiment_plan`, which designs the experiment\n      // (experiment_plan_designs_experiment) and runs as experiment_run(s).\n      ['experiment_run', 'experiment_plan', 'evidence'],\n      'Validate with targeted experiment runs. Close the loop between research and action.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 4 - market_competitive (anchor `competitor`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const MARKET_COMPETITIVE_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:market-competitive',\n  name: 'Market & Competitive',\n  version: '0.2.0',\n  description:\n    'Map the competitive landscape: define the market, name the alternatives, read trends, find moves.',\n  region: 'market_competitive',\n  is_canonical: true,\n  related_framework_ids: ['porter-five-forces', 'swot-analysis', 'value-chain-analysis', 'wardley-map', 'bullseye-framework'],\n  target_anchor_entity: 'competitor',\n  creation_sequence: [\n    seqStep(1, 'Market',\n      ['market_segment', 'classification_axis', 'classification_value'],\n      'Frame the market you compete in. What axes distinguish segments: size, vertical, sophistication, urgency?'),\n    seqStep(2, 'Competitors',\n      ['competitor'],\n      'List the 3–7 closest alternatives, including DIY, status quo, and adjacent solutions. \"No competition\" is rarely true.'),\n    seqStep(3, 'Their offerings',\n      ['competitor_feature'],\n      'For the top 3–5 competitors, catalog what they actually ship, not their marketing claims.'),\n    seqStep(4, 'Trends',\n      ['market_trend'],\n      'Capture the shifts in technology, behavior, regulation, or economy that change the playing field underneath everyone.'),\n    seqStep(5, 'Analysis',\n      ['competitive_analysis'],\n      'Synthesize into structured comparisons: feature parity matrices, win/loss patterns, positioning maps.'),\n    seqStep(6, 'Moves',\n      ['competitor_signal', 'competitive_battle_card'],\n      'Capture rivals\\' dated moves as competitor_signals (launches, pricing changes, acquisitions) and map each onto the feature it threatens. Then look where competitors are weak and trends are strong: that intersection is where your moves live. Arm the team with battle cards that turn each competitor weakness into a position you can win. (Partnership moves belong in the business & GTM playbook, where `partnership` connects.)'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 5 - experience_design_brand (anchor `user_journey`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const EXPERIENCE_DESIGN_BRAND_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:experience-design-brand',\n  name: 'Experience, Design & Brand',\n  version: '0.1.0',\n  description:\n    'Journey-first design sequence: research → personas → journeys → define → ideate → prototype → test → design system.',\n  region: 'experience_design_brand',\n  is_canonical: true,\n  related_framework_ids: ['double-diamond', 'atomic-design', 'story-map'],\n  target_anchor_entity: 'user_journey',\n  creation_sequence: [\n    seqStep(1, 'Research',\n      ['research_study', 'participant', 'observation', 'quote', 'survey_response'],\n      'Understand the problem space: observe real users, gather evidence.'),\n    seqStep(2, 'Personas',\n      ['persona', 'job', 'need', 'desired_outcome'],\n      'Synthesize research into archetypes. Who are you designing for?'),\n    seqStep(3, 'Journeys',\n      ['user_journey', 'journey_step', 'user_flow', 'touchpoint'],\n      'Map how users move through the experience. Where is the friction?'),\n    seqStep(4, 'Define',\n      ['design_question', 'insight', 'affinity_cluster', 'opportunity'],\n      'Frame the design challenge: How Might We questions, insights, opportunities.'),\n    seqStep(5, 'Ideate',\n      ['design_concept', 'solution', 'screen', 'screen_state'],\n      'Generate solutions: concepts, screens, interaction ideas.'),\n    seqStep(6, 'Prototype',\n      ['wireframe', 'prototype', 'interaction_spec', 'design_component'],\n      'Build testable artifacts: wireframes, prototypes, interaction specs.'),\n    seqStep(7, 'Test',\n      ['experiment', 'learning', 'evidence', 'feedback_theme'],\n      'Put prototypes in front of users: observe, learn, iterate.'),\n    seqStep(8, 'Design System',\n      ['design_system', 'design_component', 'design_token', 'design_pattern', 'design_guideline'],\n      'Codify patterns: components, tokens, guidelines that scale.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 6 - product_delivery (anchor `feature`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const PRODUCT_DELIVERY_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:product-delivery',\n  name: 'Product Delivery',\n  version: '0.2.0',\n  description:\n    'Shape what gets built: features, epics, user stories, releases, milestones, and the dependencies between them.',\n  region: 'product_delivery',\n  is_canonical: true,\n  related_framework_ids: ['story-map', 'rice-scoring', 'moscow', 'now-next-later', 'shape-up', 'kano-model'],\n  target_anchor_entity: 'feature',\n  creation_sequence: [\n    seqStep(1, 'Features',\n      ['feature'],\n      'Name the units of value the product delivers. Each feature should be a thing a user can describe in plain language.'),\n    seqStep(2, 'Epics',\n      ['epic'],\n      'Group related features into epics that ship together. Epics are user-visible; tasks are not.'),\n    seqStep(3, 'Stories',\n      ['user_story', 'acceptance_criterion'],\n      'Write each feature from the user perspective. \"As [persona], I want [job], so that [outcome].\" Define acceptance criteria.'),\n    seqStep(4, 'Tasks & Dependencies',\n      ['task', 'dependency'],\n      'Decompose stories into the smallest unit of work an engineer can pick up. Surface the dependencies between them.'),\n    seqStep(5, 'Releases & Milestones',\n      ['release', 'milestone'],\n      'Bundle stories into releases. Milestones mark moments of strategic significance: first paying customer, first 1000 users.'),\n    seqStep(6, 'Roadmap Themes & Changelog',\n      ['roadmap_theme', 'changelog'],\n      'Group roadmap work into roadmap themes around the customer problem. Maintain a changelog the team and customers can read together.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 7 - engineering_platform (anchor `service`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const ENGINEERING_PLATFORM_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:engineering-platform',\n  name: 'Engineering & Platform',\n  version: '0.1.0',\n  description:\n    'Architecture-first engineering sequence: architecture → services → data → build → test → deploy → monitor → security.',\n  region: 'engineering_platform',\n  is_canonical: true,\n  related_framework_ids: ['c4-model', 'adr-log', 'dora-metrics'],\n  target_anchor_entity: 'service',\n  creation_sequence: [\n    seqStep(1, 'Architecture',\n      ['bounded_context', 'decision', 'service', 'aggregate'],\n      'Define the system shape: bounded contexts, services, key decisions.'),\n    seqStep(2, 'Services & APIs',\n      ['service', 'api_endpoint', 'api_contract', 'external_api', 'integration_pattern'],\n      'Map the service layer: endpoints, contracts, integrations.'),\n    seqStep(3, 'Data',\n      ['database_schema', 'domain_event', 'event_schema', 'data_model', 'data_pipeline', 'queue_topic'],\n      'Design the data layer: schemas, events, pipelines.'),\n    seqStep(4, 'Build',\n      ['feature', 'epic', 'user_story', 'task', 'technical_debt_item'],\n      'Scope the work: features, epics, stories, tasks.'),\n    seqStep(5, 'Test',\n      ['test_suite', 'test_case', 'qa_session', 'regression_test', 'test_coverage_report'],\n      'Verify the system: test suites, coverage, QA sessions.'),\n    seqStep(6, 'Deploy',\n      ['deployment', 'ci_pipeline', 'feature_flag', 'release', 'release_strategy'],\n      'Ship reliably: pipelines, feature flags, release strategy.'),\n    seqStep(7, 'Monitor',\n      ['service_level_indicator', 'service_level_objective', 'monitor', 'alert_rule', 'incident', 'runbook', 'on_call_rotation'],\n      'Keep it running: SLIs, monitors, alerts, incident response.'),\n    seqStep(8, 'Security',\n      ['threat_model', 'threat', 'vulnerability', 'security_control', 'security_policy', 'access_policy'],\n      'Keep it safe: threat models, controls, access policies.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 8 - business_gtm_growth (anchor `value_proposition`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const BUSINESS_GTM_GROWTH_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:business-gtm-growth',\n  name: 'Business, GTM & Growth',\n  version: '0.1.0',\n  description:\n    'Viability-first business sequence: value prop → customer → revenue → costs → unit economics → GTM → competitive advantage.',\n  region: 'business_gtm_growth',\n  is_canonical: true,\n  related_framework_ids: ['business-model-canvas', 'pirate-metrics-aarrr', 'north-star-metric', 'product-led-growth-framework', 'marketing-mix-4ps'],\n  target_anchor_entity: 'value_proposition',\n  creation_sequence: [\n    seqStep(1, 'Value Proposition',\n      ['value_proposition', 'product', 'need', 'desired_outcome'],\n      'Define the value you create. Why should someone pay for this?'),\n    seqStep(2, 'Customer',\n      ['persona', 'market_segment', 'ideal_customer_profile'],\n      'Know your customer: segments, ICPs, what they are willing to pay for.'),\n    seqStep(3, 'Revenue',\n      ['revenue_stream', 'pricing_tier', 'pricing_strategy', 'discount_strategy', 'trial_config', 'paywall'],\n      'Design the revenue engine: streams, pricing tiers, discounts.'),\n    seqStep(4, 'Cost Structure',\n      ['cost_structure', 'unit_economics', 'key_resource', 'key_activity'],\n      'Map the costs. What does it take to build, deliver, and support this?'),\n    seqStep(5, 'Unit Economics',\n      ['unit_economics', 'metric'],\n      'Prove the math works: LTV, CAC, margins, breakeven.'),\n    seqStep(6, 'Go-To-Market',\n      ['gtm_strategy', 'positioning', 'messaging', 'distribution_channel', 'launch'],\n      'Plan the path to customers: positioning, channels, launch strategy.'),\n    seqStep(7, 'Competitive Advantage',\n      ['competitor', 'competitive_analysis', 'market_trend', 'partnership'],\n      'Understand the landscape: competitors, differentiation, moats.'),\n  ],\n}\n\nexport const BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:business-growth-metric-driven',\n  name: 'Metric-Driven Growth',\n  version: '0.1.0',\n  description:\n    'Metric-driven growth sequence: north star → funnel → channels → segments → experiments → measure → iterate.',\n  region: 'business_gtm_growth',\n  creation_sequence: [\n    seqStep(1, 'North Star',\n      ['metric', 'outcome', 'objective'],\n      'Define the one metric that matters most: the number that captures the value you create.'),\n    seqStep(2, 'Funnel',\n      ['funnel', 'funnel_step', 'user_flow'],\n      'Map how users flow from awareness to value. Where are the drops?'),\n    seqStep(3, 'Channels',\n      ['acquisition_channel', 'growth_campaign', 'attribution_model'],\n      'Identify where users come from. Which channels are scalable and cost-effective?'),\n    seqStep(4, 'Segments',\n      ['cohort', 'behavioral_segment', 'persona', 'ideal_customer_profile'],\n      'Break users into cohorts. Who retains, who converts, who churns?'),\n    seqStep(5, 'Experiments',\n      ['experiment', 'variant', 'hypothesis', 'growth_loop'],\n      'Run experiments to move the numbers: A/B tests, pricing tests, growth loops.'),\n    seqStep(6, 'Measure',\n      ['metric', 'dashboard', 'event_schema', 'data_source'],\n      'Track results: dashboards, event schemas, metric definitions.'),\n    seqStep(7, 'Iterate',\n      ['learning', 'evidence', 'insight'],\n      'Learn and loop: what worked, what didn’t, what to try next.'),\n  ],\n}\n\nexport const BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:business-marketing-audience-first',\n  name: 'Audience-First Marketing',\n  version: '0.1.0',\n  description:\n    'Audience-first marketing sequence: positioning → messaging → audience → channels → content → launch → measure.',\n  region: 'business_gtm_growth',\n  creation_sequence: [\n    seqStep(1, 'Positioning',\n      ['positioning', 'competitive_analysis', 'competitor', 'market_segment'],\n      \"Define where you sit in the customer's mind. Who is this for, and why is it different?\"),\n    seqStep(2, 'Messaging',\n      ['messaging', 'value_proposition', 'proof_point', 'objection', 'rebuttal'],\n      'Craft the words that resonate: value props, taglines, proof points.'),\n    seqStep(3, 'Audience',\n      ['persona', 'ideal_customer_profile', 'market_segment', 'behavioral_segment'],\n      'Know who you are speaking to: personas, ICPs, segments.'),\n    seqStep(4, 'Channels',\n      ['acquisition_channel', 'distribution_channel', 'marketing_channel'],\n      'Choose where to show up. Which channels reach your audience cost-effectively?'),\n    seqStep(5, 'Content',\n      ['content_strategy', 'content_piece', 'content_calendar', 'content_theme', 'brand_asset'],\n      'Create what resonates: content strategy, calendar, individual pieces.'),\n    seqStep(6, 'Launch',\n      ['launch', 'growth_campaign', 'demand_gen_program', 'press_release', 'event'],\n      'Orchestrate the go-to-market: launch plans, campaigns, press.'),\n    seqStep(7, 'Measure',\n      ['metric', 'dashboard', 'attribution_model', 'funnel', 'nps_campaign'],\n      'Track what works: attribution, conversion, engagement metrics.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 9 - analytics_data (anchor `metric`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const ANALYTICS_DATA_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:analytics-data',\n  name: 'Analytics & Data',\n  version: '0.2.0',\n  description:\n    'Bootstrap the measurement plane: sources, schemas, pipelines, metrics, dashboards, and the rules that keep them honest.',\n  region: 'analytics_data',\n  is_canonical: true,\n  related_framework_ids: ['metrics-tree', 'north-star-metric', 'pirate-metrics-aarrr', 'dora-metrics'],\n  target_anchor_entity: 'metric',\n  creation_sequence: [\n    seqStep(1, 'Data Sources',\n      ['data_source'],\n      'List where the truth lives: the systems that emit events you can measure. Product, billing, support, CRM, external.'),\n    seqStep(2, 'Event Schemas',\n      ['event_schema'],\n      'Define the events you will instrument. Schema first; instrumentation second. Each event needs a name, properties, and emit conditions.'),\n    seqStep(3, 'Pipelines & Models',\n      ['data_pipeline', 'data_model'],\n      'Move data from source to warehouse. Define transformations and the resulting models the rest of the org consumes.'),\n    seqStep(4, 'Metrics',\n      ['metric'],\n      'Define the numbers the team will look at. Group into North Star, input metrics, guardrail metrics, and diagnostic metrics.'),\n    seqStep(5, 'Dashboards',\n      ['dashboard'],\n      'Compose metrics into dashboards by audience: leadership weekly, team daily, on-call always-on.'),\n    seqStep(6, 'Data Quality',\n      ['data_quality_rule'],\n      'Set the rules that guard against silent drift: freshness, completeness, accuracy, schema integrity.'),\n  ],\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// Region 10 - operations_quality (anchor `incident`)\n// ════════════════════════════════════════════════════════════════════════════\n\nexport const OPERATIONS_QUALITY_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:operations-quality',\n  name: 'Operations & Quality',\n  version: '0.2.0',\n  description:\n    'The operational backbone: pipelines, monitoring, incident response, security, quality gates, compliance, support. Specialised playbooks cover team rituals.',\n  region: 'operations_quality',\n  is_canonical: true,\n  related_framework_ids: ['raci-matrix', 'retrospective', 'team-health-check', 'raid-log'],\n  target_anchor_entity: 'incident',\n  creation_sequence: [\n    seqStep(1, 'DevOps Backbone',\n      ['deployment', 'ci_pipeline', 'runbook'],\n      'Establish the pipeline. How does code go from commit to production reliably and reversibly?'),\n    seqStep(2, 'Monitoring & SLOs',\n      ['service_level_indicator', 'service_level_objective', 'monitor', 'alert_rule'],\n      'Decide what you measure for availability, latency, and quality. Set targets. Wire alerts to people, not silence.'),\n    seqStep(3, 'Incident Response',\n      ['incident', 'postmortem', 'root_cause'],\n      'Define how you respond when things break. Every incident gets a postmortem; every postmortem identifies root causes; root causes drive change.'),\n    seqStep(4, 'Security',\n      ['threat_model', 'threat', 'vulnerability', 'security_control', 'access_policy'],\n      'Model what could go wrong. Catalog known threats. Wire controls and access policies that actually constrain risk.'),\n    seqStep(5, 'Quality Gates',\n      ['test_suite', 'test_case', 'regression_test', 'qa_session', 'feature', 'bug'],\n      'Establish what does not ship until tests pass. Define the test pyramid: unit, integration, end-to-end. Quality is a delivery concern: gates guard the features they cover and the bugs they catch, which is also where incidents trace back (a shipped defect becomes a production incident).'),\n    seqStep(6, 'Compliance & Accessibility',\n      ['compliance_framework', 'a11y_audit', 'security_policy'],\n      'Map the frameworks you must comply with: SOC 2, GDPR, HIPAA, WCAG. Surface controls and audit cadence.'),\n    seqStep(7, 'Customer Support',\n      ['support_ticket', 'knowledge_base_article'],\n      'Define how customers reach you when things break, and how you build collective memory from each interaction.'),\n  ],\n}\n\n// ─── Aggregate ──────────────────────────────────────────────────────────────\n\n/**\n * Every canonical playbook shipped with `@unified-product-graph/core`.\n *\n * Spans the ten canonical regions: one canonical playbook per region (the\n * W1 invariant) plus zero or more specialised playbooks per region, three\n * of which are framework-anchored (BMC, AARRR, build-measure-learn).\n *\n * Order: by region (1 → 10), canonical first within each region.\n */\nexport const FOUNDATIONS_PLAYBOOK: UPGPlaybook = {\n  id: 'playbook:foundations',\n  name: 'Foundations',\n  version: '0.9.12',\n  description:\n    'Register the specifications your products implement and expose, and the primitives those specs define, as canonical entities instead of scattered per-product features.',\n  region: 'foundations',\n  is_canonical: true,\n  related_framework_ids: [],\n  target_anchor_entity: 'specification',\n  creation_sequence: [\n    seqStep(1, 'Specifications',\n      ['specification'],\n      'Define each governed spec your products implement, expose, or conform to (a query language, protocol, or format) as one canonical specification, not a per-product feature.'),\n    seqStep(2, 'Primitives',\n      ['primitive'],\n      'Define the compositional units those specs define (a block, a reference, a query value) as primitives, each linked to its specification.'),\n  ],\n}\n\nexport const UPG_PLAYBOOKS: readonly UPGPlaybook[] = [\n  // Region 1 - strategy_outcomes\n  STRATEGY_OUTCOMES_PLAYBOOK,\n  // Region 2 - users_needs\n  USERS_NEEDS_PLAYBOOK,\n  // Region 3 - discovery_research_validation\n  DISCOVERY_RESEARCH_VALIDATION_PLAYBOOK,\n  // Region 4 - market_competitive\n  MARKET_COMPETITIVE_PLAYBOOK,\n  // Region 5 - experience_design_brand\n  EXPERIENCE_DESIGN_BRAND_PLAYBOOK,\n  // Region 6 - product_delivery\n  PRODUCT_DELIVERY_PLAYBOOK,\n  // Region 7 - engineering_platform\n  ENGINEERING_PLATFORM_PLAYBOOK,\n  // Region 8 - business_gtm_growth\n  BUSINESS_GTM_GROWTH_PLAYBOOK,\n  BUSINESS_GROWTH_METRIC_DRIVEN_PLAYBOOK,\n  BUSINESS_MARKETING_AUDIENCE_FIRST_PLAYBOOK,\n  // Region 9 - analytics_data\n  ANALYTICS_DATA_PLAYBOOK,\n  // Region 10 - operations_quality\n  OPERATIONS_QUALITY_PLAYBOOK,\n  // Region 11 - foundations\n  FOUNDATIONS_PLAYBOOK,\n]\n","/**\n * Step sequence machinery shared by `UPGPlaybook` and `UPGApproach`.\n *\n * A `sub_sequence` step references either a playbook or an approach by\n * namespace-prefixed id (`playbook:*` / `approach:*`).\n */\n\nimport type { IntelligenceCondition } from './intelligence/intelligence.js'\n\n// ─── Step kinds ─────────────────────────────────────────────────────────────\n\n/**\n * Discriminator for step behaviour.\n *\n * - `domain_guide`: resolve creation sequence from `DomainUsageGuide[domain_id]` at runtime\n * - `framework`:    apply a structured framework (BMC, RICE, OST)\n * - `entity_sequence`: explicit list of entity types to create\n * - `sub_sequence`: nest another playbook or approach at this step\n *\n * The `sub_sequence` kind references either a playbook or an approach by\n * namespace-prefixed id (`playbook:*` / `approach:*`).\n */\nexport type StepKind = 'domain_guide' | 'framework' | 'entity_sequence' | 'sub_sequence'\n\n/** How a playbook or technique is entered. */\nexport type EntryMode = 'domain' | 'stage' | 'gap' | 'framework'\n\n/** Fields every step carries, independent of kind. */\ninterface StepBase {\n  /** Position in the sequence (1-based) */\n  order: number\n  /** The phase label this step belongs to (e.g. \"Discovery\", \"Validation\") */\n  phase: string\n  /** Human-readable label for this step */\n  name?: string\n  /** Optional prompt shown to the user at this step. Structure only, no UI hints. */\n  prompt_hint?: string\n  /** Machine-evaluable condition that must hold before advancing to the next step */\n  transition_condition?: IntelligenceCondition\n  /** Sequence to chain into when a gap is detected at this step */\n  next_sequence_on_gap?: string\n}\n\n/** Step that defers to a domain's `DomainUsageGuide.creation_sequence`. */\nexport interface DomainGuideStep extends StepBase {\n  kind: 'domain_guide'\n  /** Domain whose `DomainUsageGuide.creation_sequence` the runtime reads at execution time */\n  domain_id: string\n}\n\n/** Step that applies a named framework. */\nexport interface FrameworkInvocationStep extends StepBase {\n  kind: 'framework'\n  /** ID of the framework to apply (matches an entry in UPG_FRAMEWORKS) */\n  framework_id: string\n}\n\n/** Step that creates entities of an explicit, fixed list of types. */\nexport interface EntitySequenceStep extends StepBase {\n  kind: 'entity_sequence'\n  /** Explicit list of entity types to create at this step */\n  entity_types: readonly string[]\n}\n\n/** Step that chains into a nested playbook or technique. */\nexport interface SubSequenceStep extends StepBase {\n  kind: 'sub_sequence'\n  /** ID of the nested sequence: `playbook:*` or `technique:*` */\n  sub_sequence_id: string\n}\n\n/**\n * A single step in a playbook or technique, discriminated by `kind`.\n *\n * @example { kind: 'domain_guide', order: 1, phase: 'Discovery', domain_id: 'user' }\n * @example { kind: 'framework', order: 2, phase: 'Prioritisation', framework_id: 'rice-scoring' }\n * @example { kind: 'entity_sequence', order: 3, phase: 'Personas', entity_types: ['persona', 'job'] }\n * @example { kind: 'sub_sequence', order: 4, phase: 'Discovery', sub_sequence_id: 'playbook:users-needs' }\n */\nexport type Step =\n  | DomainGuideStep\n  | FrameworkInvocationStep\n  | EntitySequenceStep\n  | SubSequenceStep\n\n// ─── Surface identifier ─────────────────────────────────────────────────────\n\n/**\n * Surface identifier. Known surfaces are typed; runtimes may register their own\n * identifiers (string fallback) without touching the spec.\n */\nexport type SurfaceId = 'cli' | 'entopo' | 'mcp_tool' | (string & {})\n\n// ─── Runtime context, output, and run record (shared) ───────────────────────\n\n/** Runtime context handed to `startRun`. Open-ended; each surface adds its own. */\nexport interface RunContext {\n  /** Path to the `.upg` file, for file-backed runtimes */\n  graph_path?: string\n  /** Product identifier for cloud-backed runtimes */\n  product_id?: string\n  /** Active user (if authenticated) */\n  user_id?: string\n  /** Runtime-specific session identifier */\n  session_id?: string\n  /** Surface-specific extensions */\n  [key: string]: unknown\n}\n\n/** What a step produced when recorded. */\nexport type StepOutputKind =\n  | 'entities_created'\n  | 'entities_updated'\n  | 'response'\n  | 'skipped'\n\n/** The runtime record of what a single step produced. */\nexport interface StepOutput {\n  /** What category of output the step produced */\n  kind: StepOutputKind\n  /** IDs of entities created or updated by this step */\n  entity_ids?: readonly string[]\n  /** Free-form user response captured at this step */\n  response_text?: string\n  /** Surface-specific metadata (e.g. timing, confidence) */\n  metadata?: Record<string, unknown>\n}\n\n// ─── Narrowing helpers ──────────────────────────────────────────────────────\n\nexport function isDomainGuideStep(step: Step): step is DomainGuideStep {\n  return step.kind === 'domain_guide'\n}\n\nexport function isFrameworkInvocationStep(step: Step): step is FrameworkInvocationStep {\n  return step.kind === 'framework'\n}\n\nexport function isEntitySequenceStep(step: Step): step is EntitySequenceStep {\n  return step.kind === 'entity_sequence'\n}\n\nexport function isSubSequenceStep(step: Step): step is SubSequenceStep {\n  return step.kind === 'sub_sequence'\n}\n","/**\n * playbooks/: UPG Playbook public API.\n *\n * Exports: `UPGPlaybook`, `PlaybookRuntime`, `PlaybookFilter`, `PlaybookRun`,\n * `PlaybookBinding`, `UPG_PLAYBOOKS`, and the lookup helpers\n * (`getCanonicalPlaybookForRegion`, `getPlaybooksForRegion`, `getPlaybookById`).\n */\n\nimport type { UPGPlaybook } from './types.js'\nimport type { UPGRegionId } from '../regions/types.js'\nimport { UPG_PLAYBOOKS } from './definitions/index.js'\n\nexport * from './types.js'\nexport * from './definitions/index.js'\n\n// Re-export shared step machinery so consumers (mcp-server, Entopo, future\n// runtimes) can construct and traverse steps.\nexport type {\n  Step,\n  StepKind,\n  EntryMode,\n  SurfaceId,\n  RunContext,\n  StepOutput,\n  StepOutputKind,\n  DomainGuideStep,\n  FrameworkInvocationStep,\n  EntitySequenceStep,\n  SubSequenceStep,\n} from '../step-sequence.js'\nexport {\n  isDomainGuideStep,\n  isFrameworkInvocationStep,\n  isEntitySequenceStep,\n  isSubSequenceStep,\n} from '../step-sequence.js'\n\nconst _playbookById = new Map<string, UPGPlaybook>(\n  UPG_PLAYBOOKS.map((p) => [p.id, p]),\n)\n\nconst _playbooksByRegion = new Map<UPGRegionId, UPGPlaybook[]>()\nfor (const p of UPG_PLAYBOOKS) {\n  const list = _playbooksByRegion.get(p.region) ?? []\n  list.push(p)\n  _playbooksByRegion.set(p.region, list)\n}\n\n/**\n * Look up a canonical playbook shipped with `@unified-product-graph/core` by id.\n * Returns `undefined` when the id is unknown (or namespaces a technique).\n */\nexport function getPlaybookById(id: string): UPGPlaybook | undefined {\n  return _playbookById.get(id)\n}\n\n/**\n * Return the single canonical playbook for a region (the \"start here\" path).\n * Returns `null` when the region has no canonical playbook (W1 invariant\n * violation, caught by `audit-playbook-coverage.ts`).\n */\nexport function getCanonicalPlaybookForRegion(\n  region: UPGRegionId,\n): UPGPlaybook | null {\n  const list = _playbooksByRegion.get(region) ?? []\n  return list.find((p) => p.is_canonical === true) ?? null\n}\n\n/**\n * Return every playbook (canonical + specialised) anchored at a region.\n * Order is the canonical `UPG_PLAYBOOKS` order, canonical entry first by\n * convention (catalog authoring discipline).\n */\nexport function getPlaybooksForRegion(\n  region: UPGRegionId,\n): readonly UPGPlaybook[] {\n  return _playbooksByRegion.get(region) ?? []\n}\n","/**\n * UPG Lenses: role-specific projections combining vocabulary, visibility,\n * workflow, and intelligence. Applied on read.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport { UPG_DOMAINS } from '../registry/domains.js'\nimport type { IntelligenceCondition } from '../intelligence/intelligence.js'\nimport type { UPGPlaybook } from '../playbooks/types.js'\nimport { getPlaybookById } from '../playbooks/index.js'\n\n// ─── Interface ──────────────────────────────────────────────────────────────────\n\n/**\n * A single context-sensitive nudge belonging to a lens's intelligence\n * layer. Surfaces a message when a trigger condition evaluates to `true`\n * over the current product graph.\n *\n * Runtimes evaluate `structured_condition`, the machine-readable form.\n * `condition` is a human-readable shadow kept for documentation, prompt\n * engineering, debug output, and grep-ability. The two should describe\n * the same intent; when they diverge (rare), `structured_condition` is\n * the source of truth.\n *\n * @example\n * // A simple \"missing thing\" nudge that fires when the product has no outcomes.\n * const noOutcomes: UPGLensIntelligencePrompt = {\n *   condition: 'outcomes.length === 0',\n *   structured_condition: {\n *     check: { type: 'entity_count', entity_type: 'outcome', comparison: 'zero' },\n *   },\n *   message: 'No outcomes defined yet. Start with what success looks like: what measurable result should this product drive?',\n * }\n *\n * @example\n * // A compound nudge: features exist but no hypotheses validate them.\n * const featuresWithoutHypotheses: UPGLensIntelligencePrompt = {\n *   condition: 'features.length > 0 && hypotheses.length === 0',\n *   structured_condition: {\n *     operator: 'and',\n *     checks: [\n *       { check: { type: 'entity_count', entity_type: 'feature', comparison: 'nonzero' } },\n *       { check: { type: 'entity_count', entity_type: 'hypothesis', comparison: 'zero' } },\n *     ],\n *   },\n *   message: 'Features without hypotheses means you are building on assumptions. What needs to be true for these features to matter?',\n * }\n */\nexport interface UPGLensIntelligencePrompt {\n  /**\n   * Human-readable shadow of `structured_condition`. Kept as documentary reference,\n   * useful for prompt engineering, debug output, and search. Not evaluated\n   * at runtime; if the two ever diverge, `structured_condition` wins.\n   */\n  condition: string\n  /** Machine-evaluable condition: when to surface this prompt. */\n  structured_condition: IntelligenceCondition\n  /** The message to show, in the lens's voice */\n  message: string\n}\n\n/**\n * A contextual projection of the product graph for a specific role,\n * framework, or mode of thinking.\n *\n * A lens combines four orthogonal layers: vocabulary (which labels to\n * use), visibility (which domains to show), workflow (which guided\n * sequence to follow), and intelligence (which nudges to surface). The\n * `.upg` file format is lens-unaware; lenses apply on read only.\n *\n * @example\n * const productLens: UPGLens = {\n *   id: 'product',\n *   name: 'Product',\n *   description: 'Full graph, PM vocabulary, outcome-driven workflow',\n *   icon: 'target',\n *   framework_id: 'ost',\n *   visible_domains: [], // empty = all visible\n *   playbook_id: 'playbook:product-delivery',\n *   benchmark_domains: ['strategy', 'user', 'discovery', 'validation'],\n *   intelligence_prompts: [\n *     {\n *       condition: 'outcomes.length === 0',\n *       structured_condition: {\n *         check: { type: 'entity_count', entity_type: 'outcome', comparison: 'zero' },\n *       },\n *       message: 'No outcomes defined yet. Start with what success looks like.',\n *     },\n *   ],\n *   audience: 'Product managers and founders making strategic decisions',\n *   perspective: 'Outcome-driven, evidence-aware, strategically oriented.',\n * }\n */\nexport interface UPGLens {\n  /** Unique identifier (e.g. 'product', 'ux_design', 'engineering') */\n  id: string\n  /** Human-readable name */\n  name: string\n  /** One-sentence description of what this lens shows */\n  description: string\n  /** Lucide icon name for UI rendering */\n  icon: string\n\n  // ── Vocabulary ──\n  /** Framework ID for label resolution (maps to type-labels.ts framework_labels) */\n  framework_id?: string\n  /** Custom label overrides (entity type → display label) for cases where no framework covers the translation */\n  label_overrides?: Record<string, string>\n\n  // ── Visibility ──\n  /** Domain IDs to show (from domains.ts). Empty array = show all. */\n  visible_domains: string[]\n  /** Specific entity types to always show even if their domain is hidden */\n  always_show_types?: string[]\n  /** Specific entity types to always hide even if their domain is visible */\n  always_hide_types?: string[]\n\n  // ── Playbook ──\n  /**\n   * Optional ID of the canonical `UPGPlaybook` that best matches this lens's\n   * mental model. Structure lives in the playbook registry; the lens owns\n   * only presentation (labels, visibility, intelligence).\n   *\n   * Lenses without a 1:1 region playbook (e.g. `product`, `full`, both\n   * cross-region) leave this field unset. Resolved via `getLensPlaybook`.\n   *\n   * Renamed from `workflow_id` (workflows → playbooks + techniques).\n   */\n  playbook_id?: string\n\n  // ── Intelligence ──\n  /** Which benchmark domain IDs to check */\n  benchmark_domains: string[]\n  /** Custom intelligence prompts scoped to this lens's perspective */\n  intelligence_prompts: UPGLensIntelligencePrompt[]\n\n  // ── Audience ──\n  /** Who this lens is designed for */\n  audience: string\n  /** Plain language description of the perspective this lens provides */\n  perspective: string\n}\n\n// ─── The 9 Lenses ────────────────────────────────────────────────────────────────\n\nexport const UPG_LENSES: readonly UPGLens[] = [\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 1. PRODUCT LENS - the strategic command view\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'product',\n    name: 'Product',\n    description: 'Full graph, PM vocabulary, outcome-driven workflow',\n    icon: 'target',\n    framework_id: 'ost',\n    label_overrides: {\n      experiment: 'Experiment',\n      learning: 'Validated Learning',\n    },\n    visible_domains: [], // all domains visible\n    // playbook_id intentionally unset: the product lens spans every region;\n    // no single canonical playbook captures the cross-region \"PM journey\"\n    // narrative that lived in the v0.2 lens-workflow `product-journey`.\n    benchmark_domains: [\n      'strategy', 'user', 'discovery', 'validation',\n      'market_intelligence', 'product_spec', 'growth',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'outcomes.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'outcome', comparison: 'zero' } },\n        message: 'No outcomes defined yet. Start with what success looks like: what measurable result should this product drive?',\n      },\n      {\n        condition: 'hypotheses.untested.length > 3',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'hypothesis', filter: { status: 'untested' }, comparison: 'gt', threshold: 3 } },\n        message: 'You have untested hypotheses stacking up. Pick the riskiest one and design an experiment before adding more.',\n      },\n      {\n        condition: 'features.length > 0 && hypotheses.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'hypothesis', comparison: 'zero' } },\n        ] },\n        message: 'Features without hypotheses means you are building on assumptions. What needs to be true for these features to matter?',\n      },\n      {\n        condition: 'personas.length > 0 && opportunities.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'persona', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'opportunity', comparison: 'zero' } },\n        ] },\n        message: 'You know who you are building for, but haven\\'t identified opportunities yet. What are the biggest unmet needs?',\n      },\n      {\n        condition: 'competitors.length === 0 && features.length > 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'competitor', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 3 } },\n        ] },\n        message: 'You are building without competitive context. Who else solves this problem, and how is your approach different?',\n      },\n    ],\n    audience: 'Product managers, founders making strategic decisions, and anyone thinking about what to build and why',\n    perspective: 'Sees the product as a system of outcomes, opportunities, and validated bets. Outcome-driven, evidence-aware, strategically oriented.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 2. DESIGN LENS - user-centric, journey-first\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'ux_design',\n    name: 'Design',\n    description: 'User-centric view with design vocabulary, journey-first workflow',\n    icon: 'pen-tool',\n    framework_id: 'design_thinking',\n    label_overrides: {\n      need: 'Pain Point',\n      insight: 'Finding',\n      opportunity: 'Design Opportunity',\n      solution: 'Design Concept',\n      experiment: 'Usability Test',\n      learning: 'Test Finding',\n      feature: 'Feature',\n    },\n    visible_domains: [\n      'ux_design', 'user', 'user_research', 'product_spec',\n      'feedback', 'accessibility', 'content',\n    ],\n    always_show_types: ['product', 'outcome'],\n    always_hide_types: [\n      'database_schema', 'queue_topic', 'build_artifact',\n      'ci_pipeline', 'service_level_indicator', 'service_level_objective', 'error_budget',\n    ],\n    playbook_id: 'playbook:experience-design-brand',\n    benchmark_domains: [\n      'ux_design', 'user', 'user_research', 'feedback', 'accessibility',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'personas.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'persona', comparison: 'zero' } },\n        message: 'No personas yet. Who are you designing for? Start with the person, not the screen.',\n      },\n      {\n        condition: 'user_journeys.length === 0 && screens.length > 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'user_journey', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'screen', comparison: 'nonzero' } },\n        ] },\n        message: 'You have screens but no user journeys. Without a journey, screens are disconnected pages. Map the experience first.',\n      },\n      {\n        condition: 'prototypes.length > 0 && experiments.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'prototype', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'experiment_run', comparison: 'zero' } },\n        ] },\n        message: 'You have prototypes that haven\\'t been tested. A prototype only validates when a real user touches it.',\n      },\n      {\n        condition: 'design_questions.length === 0 && needs.length > 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'design_question', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'need', comparison: 'gt', threshold: 3 } },\n        ] },\n        message: 'Plenty of needs identified, but no design questions. Reframe the problems as design opportunities.',\n      },\n      {\n        condition: 'a11y_audits.length === 0 && screens.length > 5',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'a11y_audit', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'screen', comparison: 'gt', threshold: 5 } },\n        ] },\n        message: 'Many screens designed but no accessibility audit. Inclusive design is not a polish step; it is a design constraint.',\n      },\n    ],\n    audience: 'Designers, UX researchers, and anyone focused on the user experience',\n    perspective: 'Sees the product through the eyes of the people using it. Journey-first, evidence-based, obsessed with friction and delight.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 3. ENGINEERING LENS - architecture-first, system-aware\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'engineering',\n    name: 'Engineering',\n    description: 'Architecture-first view of the product as a technical system',\n    icon: 'cpu',\n    framework_id: 'dora',\n    label_overrides: {\n      feature: 'Feature',\n      epic: 'Epic',\n      user_story: 'Story',\n      release: 'Release',\n      outcome: 'Product Goal',\n      experiment: 'Technical Spike',\n      need: 'Requirement',\n    },\n    visible_domains: [\n      'engineering', 'product_spec', 'devops', 'data_analytics',\n      'security', 'testing', 'ai', 'automation',\n    ],\n    always_show_types: ['product', 'outcome', 'persona', 'feature'],\n    always_hide_types: [\n      'brand_identity', 'brand_colour', 'brand_typography', 'brand_voice',\n      'positioning', 'messaging', 'content_piece', 'social_post',\n    ],\n    playbook_id: 'playbook:engineering-platform',\n    benchmark_domains: [\n      'engineering', 'product_spec', 'devops', 'security', 'testing', 'data_analytics',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'decisions.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'decision', comparison: 'zero' } },\n        message: 'No decisions recorded. Document the key technical choices; future you will thank present you.',\n      },\n      {\n        condition: 'services.length > 0 && api_contracts.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'service', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'api_contract', comparison: 'zero' } },\n        ] },\n        message: 'Services without API contracts. How do they talk to each other? Define the interfaces.',\n      },\n      {\n        condition: 'features.length > 5 && test_suites.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 5 } },\n          { check: { type: 'entity_count', entity_type: 'test_suite', comparison: 'zero' } },\n        ] },\n        message: 'Features shipping without test coverage. What happens when something breaks?',\n      },\n      {\n        condition: 'deployments.length > 0 && monitors.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'deployment', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'monitor', comparison: 'zero' } },\n        ] },\n        message: 'You are deploying but not monitoring. How will you know when something goes wrong in production?',\n      },\n      {\n        condition: 'technical_debt_items.length > 10',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'technical_debt_item', comparison: 'gt', threshold: 10 } },\n        message: 'Technical debt is piling up. Consider dedicating a percentage of each cycle to paying it down before it compounds.',\n      },\n    ],\n    audience: 'Developers, CTOs, and anyone building the technical system',\n    perspective: 'Sees the product as a system of services, data flows, and deployments. Architecture-first, reliability-aware, concerned with how things are built and how they stay running.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 4. GROWTH LENS - metrics-driven, experiment-focused\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'growth',\n    name: 'Growth',\n    description: 'Metrics-driven view focused on funnels, loops, and what moves the numbers',\n    icon: 'trending-up',\n    framework_id: 'aarrr',\n    label_overrides: {\n      metric: 'Growth Metric',\n      experiment: 'Growth Experiment',\n      outcome: 'North Star',\n      persona: 'User Segment',\n      hypothesis: 'Growth Bet',\n      learning: 'Experiment Result',\n      insight: 'Data Insight',\n    },\n    visible_domains: [\n      'growth', 'business_model', 'go_to_market', 'data_analytics',\n      'pricing', 'feedback', 'market_intelligence',\n    ],\n    always_show_types: ['product', 'outcome', 'persona'],\n    always_hide_types: [\n      'bounded_context', 'service', 'api_endpoint', 'database_schema',\n      'wireframe', 'design_component', 'design_token',\n    ],\n    playbook_id: 'playbook:business-growth-metric-driven',\n    benchmark_domains: [\n      'growth', 'business_model', 'data_analytics', 'pricing', 'go_to_market',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'metrics.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'metric', comparison: 'zero' } },\n        message: 'No metrics defined. What numbers best capture the value your product creates for users?',\n      },\n      {\n        condition: 'funnels.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'funnel', comparison: 'zero' } },\n        message: 'No funnels mapped. You can\\'t improve what you can\\'t see. Map the user journey from first touch to activation.',\n      },\n      {\n        condition: 'experiment_runs.length > 0 && metrics.length < 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'experiment_run', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'metric', comparison: 'lt', threshold: 3 } },\n        ] },\n        message: 'Running experiments without enough metrics to measure them. Define the input and output metrics before you test.',\n      },\n      {\n        condition: 'channels.length === 1',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'acquisition_channel', comparison: 'eq', threshold: 1 } },\n        message: 'Only one acquisition channel. Single-channel dependency is risky. What else could work?',\n      },\n      {\n        // The original second clause `users > 100` references a product-runtime\n        // count (real users), not a graph entity count, so it cannot be encoded\n        // in IntelligenceCondition. The structured form fires on the cohort\n        // gap alone; the string preserves the original intent.\n        condition: 'cohorts.length === 0 && users > 100',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'cohort', comparison: 'zero' } },\n        message: 'No cohort analysis yet. Not all users are the same. Segment by behaviour to find what drives retention.',\n      },\n    ],\n    audience: 'Growth marketers, data-driven founders, and anyone optimising acquisition and retention',\n    perspective: 'Sees the product as a system of funnels, loops, and numbers. Experiment-driven, metric-obsessed, always asking what moves the needle.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 5. BUSINESS LENS - viability-focused\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'business',\n    name: 'Business',\n    description: 'Viability-focused view of the product as a business that needs to sustain itself',\n    icon: 'briefcase',\n    framework_id: 'bmc',\n    label_overrides: {\n      outcome: 'Business Outcome',\n      persona: 'Customer Archetype',\n      need: 'Customer Problem',\n      feature: 'Product Capability',\n      opportunity: 'Market Opportunity',\n      experiment: 'Business Experiment',\n      metric: 'Business Metric',\n      hypothesis: 'Business Assumption',\n    },\n    visible_domains: [\n      'business_model', 'pricing', 'go_to_market', 'strategy',\n      'market_intelligence', 'growth',\n    ],\n    always_show_types: ['product', 'persona', 'feature', 'outcome'],\n    always_hide_types: [\n      'wireframe', 'design_component', 'design_token', 'prototype',\n      'bounded_context', 'service', 'api_endpoint', 'database_schema',\n      'test_suite', 'test_case', 'ci_pipeline',\n    ],\n    playbook_id: 'playbook:business-gtm-growth',\n    benchmark_domains: [\n      'business_model', 'pricing', 'go_to_market', 'strategy', 'market_intelligence', 'growth',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'value_propositions.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'value_proposition', comparison: 'zero' } },\n        message: 'No value proposition defined. Why would someone pay for this? That needs an answer before anything else.',\n      },\n      {\n        condition: 'revenue_streams.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'revenue_stream', comparison: 'zero' } },\n        message: 'No revenue streams. A product without revenue is a hobby. How will this make money?',\n      },\n      {\n        condition: 'revenue_streams.length > 0 && cost_structures.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'revenue_stream', comparison: 'nonzero' } },\n          { check: { type: 'entity_count', entity_type: 'cost_structure', comparison: 'zero' } },\n        ] },\n        message: 'Revenue modeled but no cost structure. You need both sides of the equation to know if this is viable.',\n      },\n      {\n        condition: 'unit_economics.length === 0 && revenue_streams.length > 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'unit_economics', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'revenue_stream', comparison: 'nonzero' } },\n        ] },\n        message: 'Revenue streams without unit economics. Does each customer generate more value than they cost to acquire and serve?',\n      },\n      {\n        condition: 'gtm_strategies.length === 0 && features.length > 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'gtm_strategy', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 3 } },\n        ] },\n        message: 'Building features without a go-to-market plan. Great products fail when nobody knows they exist.',\n      },\n    ],\n    audience: 'Business-minded founders, CFOs, and investors reviewing the product',\n    perspective: 'Sees the product as a business that needs to sustain itself. Viability-focused, cost-aware, always asking whether the math works.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 6. RESEARCH LENS - evidence-first\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'research',\n    name: 'Research',\n    description: 'Evidence-first view focused on what is known, assumed, and yet to be learned',\n    icon: 'microscope',\n    label_overrides: {\n      need: 'User Need',\n      opportunity: 'Research Opportunity',\n      solution: 'Proposed Solution',\n      feature: 'Product Concept',\n      hypothesis: 'Research Hypothesis',\n      experiment: 'Study',\n      learning: 'Finding',\n      insight: 'Research Insight',\n      evidence: 'Evidence',\n    },\n    visible_domains: [\n      'user_research', 'user', 'validation', 'discovery',\n      'feedback', 'market_intelligence',\n    ],\n    always_show_types: ['product', 'outcome', 'persona', 'opportunity'],\n    always_hide_types: [\n      'database_schema', 'service', 'api_endpoint', 'ci_pipeline',\n      'design_component', 'design_token', 'pricing_tier', 'revenue_stream',\n    ],\n    playbook_id: 'playbook:discovery-research-validation',\n    benchmark_domains: [\n      'user_research', 'user', 'validation', 'discovery', 'feedback',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'research_studies.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'research_study', comparison: 'zero' } },\n        message: 'No research studies yet. What do you need to learn? Start with the questions, not the answers.',\n      },\n      {\n        condition: 'observations.length > 10 && insights.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'observation', comparison: 'gt', threshold: 10 } },\n          { check: { type: 'entity_count', entity_type: 'insight', comparison: 'zero' } },\n        ] },\n        message: 'Lots of observations but no synthesized insights. Raw data is not knowledge. Cluster and extract patterns.',\n      },\n      {\n        condition: 'insights.length > 5 && opportunities.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'insight', comparison: 'gt', threshold: 5 } },\n          { check: { type: 'entity_count', entity_type: 'opportunity', comparison: 'zero' } },\n        ] },\n        message: 'Insights without opportunities. Research is powerful when it drives product decisions. What should the product do about what you learned?',\n      },\n      {\n        condition: 'hypothesiss.length > 3 && experiment_plans.length === 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'hypothesis', comparison: 'gt', threshold: 3 } },\n          { check: { type: 'entity_count', entity_type: 'experiment_plan', comparison: 'zero' } },\n        ] },\n        message: 'Hypothesis claims without experiment plans. The whole point of framing a claim is to test it. What is the cheapest way to learn?',\n      },\n      {\n        condition: 'participants.length < 5 && research_studies.length > 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'participant', comparison: 'lt', threshold: 5 } },\n          { check: { type: 'entity_count', entity_type: 'research_study', comparison: 'nonzero' } },\n        ] },\n        message: 'Very few participants. Qualitative research needs enough voices to reveal patterns. Aim for 5-8 per study minimum.',\n      },\n    ],\n    audience: 'User researchers, discovery coaches, and anyone in a research-heavy phase',\n    perspective: 'Sees the product through what is known, what is assumed, and what needs investigation. Evidence-first, synthesis-driven, allergic to untested assumptions.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 7. MARKETING LENS - audience-aware, message-focused\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'marketing',\n    name: 'Marketing',\n    description: 'Audience-aware view focused on reaching, resonating with, and converting people',\n    icon: 'megaphone',\n    label_overrides: {\n      persona: 'Target Audience',\n      need: 'Customer Problem',\n      outcome: 'Marketing Goal',\n      feature: 'Sellable Feature',\n      insight: 'Market Insight',\n      experiment: 'Campaign Test',\n      metric: 'Marketing Metric',\n      hypothesis: 'Messaging Hypothesis',\n      learning: 'Campaign Learning',\n    },\n    visible_domains: [\n      'go_to_market', 'content', 'growth', 'feedback',\n      'marketing', 'market_intelligence',\n    ],\n    always_show_types: ['product', 'persona', 'value_proposition', 'feature', 'outcome'],\n    always_hide_types: [\n      'bounded_context', 'service', 'api_endpoint', 'database_schema',\n      'test_suite', 'ci_pipeline', 'service_level_indicator', 'service_level_objective',\n      'wireframe', 'design_component', 'design_token',\n    ],\n    playbook_id: 'playbook:business-marketing-audience-first',\n    benchmark_domains: [\n      'go_to_market', 'content', 'growth', 'market_intelligence', 'feedback',\n    ],\n    intelligence_prompts: [\n      {\n        condition: 'positioning.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'positioning', comparison: 'zero' } },\n        message: 'No positioning defined. Before any marketing can work, you need to know: who is this for, what category is it in, and why is it different?',\n      },\n      {\n        condition: 'messaging.length === 0 && features.length > 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'messaging', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 3 } },\n        ] },\n        message: 'Features without messaging. Features don\\'t sell themselves. What is the message that makes someone care?',\n      },\n      {\n        condition: 'channels.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'marketing_channel', comparison: 'zero' } },\n        message: 'No channels mapped. Where does your audience spend time? That is where you need to be.',\n      },\n      {\n        condition: 'content_pieces.length === 0 && channels.length > 0',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'content_piece', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'marketing_channel', comparison: 'nonzero' } },\n        ] },\n        message: 'Channels without content. You know where to show up, but have nothing to say yet. Start with the content that matches your best channel.',\n      },\n      {\n        condition: 'launches.length === 0 && features.length > 5',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'entity_count', entity_type: 'launch', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 5 } },\n        ] },\n        message: 'Building features without a launch plan. Every feature release is a marketing opportunity. Plan the story before the ship date.',\n      },\n    ],\n    audience: 'Marketers, content creators, brand managers, and GTM leads',\n    perspective: 'Sees the product as something that needs to reach and resonate with people. Audience-aware, message-focused, always asking what makes someone care.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 8. COMPETITIVE LENS - rivals, their dated moves, and where we stand\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'competitive',\n    name: 'Competitive',\n    description: 'The competitive landscape: rivals, their offerings, dated moves, and where we stand',\n    icon: 'swords',\n    visible_domains: ['market_intelligence'],\n    // Parity (#38) and signal (#41) edges reach onto our side of the graph;\n    // surface those endpoints so a parity row or a mapped signal shows both ends.\n    always_show_types: ['feature', 'capability', 'opportunity'],\n    playbook_id: 'playbook:market-competitive',\n    benchmark_domains: ['market_intelligence'],\n    intelligence_prompts: [\n      {\n        condition: 'competitors.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'competitor', comparison: 'zero' } },\n        message: 'No competitors mapped yet. Name the 3 to 7 closest alternatives, including the status quo and DIY.',\n      },\n      {\n        condition: 'competitor_signals.length === 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'competitor_signal', comparison: 'zero' } },\n        message: 'No competitor signals captured. Log rivals\\' dated moves (launches, pricing changes) and map each onto the feature it threatens.',\n      },\n      {\n        condition: 'classification_axes.length > 0',\n        structured_condition: { check: { type: 'entity_count', entity_type: 'classification_axis', comparison: 'nonzero' } },\n        message: 'This portfolio has a classification landscape. Render it with get_portfolio_tree({ shape: \"landscape\" }) (axis to value to graded competitors), or one rival\\'s position with get_portfolio_tree({ shape: \"competitor_profile\", from_id }).',\n      },\n    ],\n    audience: 'Product marketers, strategists, and founders sizing up the field',\n    perspective: 'Sees the product through its rivals: who competes, what they ship, the dated moves they make, and where we lead or trail.',\n  },\n\n  // ═══════════════════════════════════════════════════════════════════════════════\n  // 9. FULL LENS - everything, canonical vocabulary (default)\n  // ═══════════════════════════════════════════════════════════════════════════════\n\n  {\n    id: 'full',\n    name: 'Full',\n    description: 'Complete graph with canonical UPG vocabulary: the whole picture',\n    icon: 'layout-grid',\n    // No framework_id; uses canonical UPG labels\n    // No label_overrides; everything stays canonical\n    visible_domains: [], // empty = show all\n    // playbook_id intentionally unset: the full lens spans every region;\n    // the v0.2 lens-workflow `full-product-journey` was a cross-region\n    // traversal whose content is now covered by the 10 canonical region\n    // playbooks at v0.3.0.\n    benchmark_domains: [], // empty = check all benchmark domains\n    intelligence_prompts: [\n      {\n        condition: 'total_entities < 5',\n        structured_condition: { check: { type: 'total_entity_count', comparison: 'lt', threshold: 5 } },\n        message: 'The graph is nearly empty. Start with the basics: a product, an outcome, and a persona.',\n      },\n      {\n        condition: 'domains_activated < 3',\n        structured_condition: { check: { type: 'domain_count', comparison: 'lt', threshold: 3 } },\n        message: 'Only a few domains active. A well-rounded product graph touches strategy, users, and at least one of validation, design, or engineering.',\n      },\n      {\n        condition: 'orphan_entities.length > 5',\n        structured_condition: { check: { type: 'orphan_count', comparison: 'gt', threshold: 5 } },\n        message: 'Several entities without connections. Every entity should relate to something; orphans are loose thoughts waiting to be placed.',\n      },\n      {\n        condition: 'validation_domain.length === 0 && features.length > 3',\n        structured_condition: { operator: 'and', checks: [\n          { check: { type: 'domain_population', domain_id: 'validation', comparison: 'zero' } },\n          { check: { type: 'entity_count', entity_type: 'feature', comparison: 'gt', threshold: 3 } },\n        ] },\n        message: 'Building without validating. The validation domain (hypotheses, experiments, evidence) exists to prevent building the wrong thing.',\n      },\n    ],\n    audience: 'Anyone who wants to see the complete picture without filtering',\n    perspective: 'The complete, unfiltered product graph using canonical UPG vocabulary. Every domain, every type, every connection.',\n  },\n\n] as const\n\n// ─── Lookup helpers ──────────────────────────────────────────────────────────────\n\n/** O(1) lens lookup by id */\nconst _lensIndex = new Map(UPG_LENSES.map((l) => [l.id, l]))\n\n/**\n * Get a lens by its id. Returns undefined if not found.\n *\n * @example\n * const lens = getLens('product')\n * // lens?.id === 'product'\n * // lens?.name === 'Product'\n * getLens('not_a_lens')   // → undefined\n */\nexport function getLens(id: string): UPGLens | undefined {\n  return _lensIndex.get(id)\n}\n\n/**\n * Get all lenses that include a given domain in their visible_domains.\n * Lenses with an empty `visible_domains` list match every domain.\n *\n * @example\n * const lenses = getLensesForDomain('user')\n * // includes 'product', 'research', and 'full' (the latter via empty-visible-domains rule)\n */\nexport function getLensesForDomain(domainId: string): UPGLens[] {\n  return UPG_LENSES.filter(\n    (l) => l.visible_domains.length === 0 || l.visible_domains.includes(domainId),\n  )\n}\n\n/**\n * Get all entity types visible through a given lens.\n *\n * Resolves the lens's visible_domains to concrete entity types from the\n * domain registry, then applies always_show_types and always_hide_types.\n *\n * If visible_domains is empty (show all), returns all types from all domains\n * minus always_hide_types.\n *\n * @example\n * const productLens = getLens('product')!\n * const types = getVisibleTypes(productLens)\n * // types.includes('persona')   → true\n * // types.includes('feature')   → true\n * // types.includes('api_endpoint') → false (filtered out for the product lens)\n */\nexport function getVisibleTypes(lens: UPGLens): string[] {\n  // Resolve base types from visible domains\n  let baseTypes: string[]\n\n  if (lens.visible_domains.length === 0) {\n    // Show all: collect every type from every domain\n    baseTypes = UPG_DOMAINS.flatMap((d) => [...d.types])\n  } else {\n    // Filter to lens's visible domains\n    baseTypes = UPG_DOMAINS\n      .filter((d) => lens.visible_domains.includes(d.id))\n      .flatMap((d) => [...d.types])\n  }\n\n  // Add always_show_types that aren't already in the set\n  const typeSet = new Set(baseTypes)\n  if (lens.always_show_types) {\n    for (const t of lens.always_show_types) {\n      typeSet.add(t)\n    }\n  }\n\n  // Remove always_hide_types\n  if (lens.always_hide_types) {\n    for (const t of lens.always_hide_types) {\n      typeSet.delete(t)\n    }\n  }\n\n  return [...typeSet]\n}\n\n/**\n * Get the default lens (Full).\n *\n * @example\n * const lens = getDefaultLens()\n * // lens.id   === 'full'\n * // lens.name === 'Full'   // shows every type across every domain\n */\nexport function getDefaultLens(): UPGLens {\n  return _lensIndex.get('full')!\n}\n\n/**\n * Get all lens IDs.\n *\n * @example\n * getLensIds()\n * // → ['product', 'ux_design', 'engineering', 'growth', 'business', 'research', 'marketing', 'full']\n */\nexport function getLensIds(): string[] {\n  return UPG_LENSES.map((l) => l.id)\n}\n\n/**\n * Resolve a lens to its associated `UPGPlaybook`. Returns undefined if the\n * lens has no `playbook_id` (cross-region lenses like `product` and `full`),\n * or if the id does not resolve in the canonical playbook registry.\n *\n * Renamed from `getLensWorkflow` (workflows → playbooks + techniques).\n *\n * @example\n * const lens = getLens('design')!\n * const playbook = getLensPlaybook(lens)\n * // playbook?.id matches lens.playbook_id, the bootstrap path for the\n * // experience_design_brand region.\n */\nexport function getLensPlaybook(lens: UPGLens): UPGPlaybook | undefined {\n  if (!lens.playbook_id) return undefined\n  return getPlaybookById(lens.playbook_id)\n}\n","/**\n * UPG Domain Rings: 7 concentric groupings of the 36 UPG domains.\n *\n * Defines the ring assignment for every domain and the canonical ring metadata.\n *\n * The rings radiate outward from the product nucleus:\n *   Nucleus → Understand → Define → Build → Grow → Operate → Extend\n *\n * This is the single source of truth for the OUTWARD ORDER and grouping of the\n * domains across every UPG surface (e.g. the /docs domain grid). The flattened\n * ring order — `ringOrderedDomainIds()` — replaces any hand-maintained domain\n * sequence. A module-init invariant asserts ring membership exactly covers the\n * canonical `UPG_DOMAINS` set, so a missing or extra domain fails loudly here\n * rather than silently dropping out of a downstream grid.\n */\n\nimport { UPG_DOMAINS } from '../registry/domains.js'\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface UPGDomainRing {\n  /** Machine-readable ring identifier */\n  id: string\n  /** Human-readable label */\n  label: string\n  /** The question this ring answers */\n  description: string\n  /** Domain IDs that belong to this ring */\n  domain_ids: readonly string[]\n}\n\n// ─── Data ───────────────────────────────────────────────────────────────────\n\nexport const UPG_DOMAIN_RINGS: readonly UPGDomainRing[] = [\n  {\n    id: 'nucleus',\n    label: 'Product',\n    description: 'The seed',\n    domain_ids: ['portfolio', 'workspace'],\n  },\n  {\n    id: 'understand',\n    label: 'Understand',\n    description: 'Who are we building for?',\n    domain_ids: ['user', 'user_research', 'market_intelligence', 'discovery', 'validation', 'feedback'],\n  },\n  {\n    id: 'define',\n    label: 'Define',\n    description: 'What are we building?',\n    // `business_model` lives in the `define` ring (foundational \"what are we\n    // building & how it sustains\"), not in `grow`. This is an intentional\n    // ring-vs-region divergence: UPG_REGIONS still groups business_model under\n    // `business_gtm_growth` (region membership is a separately-tracked decision).\n    domain_ids: ['strategy', 'product_spec', 'business_model', 'ux_design', 'design_system', 'brand', 'legal'],\n  },\n  {\n    id: 'build',\n    label: 'Build',\n    description: 'How do we construct it?',\n    domain_ids: ['engineering', 'foundations', 'ai', 'automation', 'data_analytics', 'testing', 'devops', 'security', 'accessibility'],\n  },\n  {\n    id: 'grow',\n    label: 'Grow',\n    description: 'How do we make money?',\n    domain_ids: ['pricing', 'go_to_market', 'sales', 'marketing', 'growth'],\n  },\n  {\n    id: 'operate',\n    label: 'Operate',\n    description: 'How do we serve?',\n    domain_ids: ['customer_success', 'content', 'education'],\n  },\n  {\n    id: 'extend',\n    label: 'Extend',\n    description: 'How do we scale?',\n    domain_ids: ['team_org', 'program_mgmt', 'ecosystem', 'localisation', 'compliance'],\n  },\n]\n\n// ─── Ring ↔ domain coverage invariant ─────────────────────────────────────────\n//\n// The rings are the single source of truth for domain order and grouping. That\n// only holds if every canonical domain appears in exactly one ring, and no ring\n// names a domain that does not exist. We assert it at module init so a drift —\n// a domain added to the registry but not slotted into a ring, a typo'd id, or a\n// duplicate — fails loudly the moment core is imported, instead of silently\n// dropping a domain from (or duplicating one in) every downstream grid.\nfunction assertRingsPartitionDomains(): void {\n  const ringDomainIds: string[] = UPG_DOMAIN_RINGS.flatMap((r) => [...r.domain_ids])\n  const canonical = new Set<string>(UPG_DOMAINS.map((d) => d.id))\n  const ringSet = new Set<string>(ringDomainIds)\n\n  const duplicates = ringDomainIds.filter((id, i) => ringDomainIds.indexOf(id) !== i)\n  const unknown = [...ringSet].filter((id) => !canonical.has(id))\n  const unassigned = [...canonical].filter((id) => !ringSet.has(id))\n\n  if (duplicates.length || unknown.length || unassigned.length) {\n    const parts: string[] = []\n    if (unassigned.length) parts.push(`domains in no ring: [${unassigned.join(', ')}]`)\n    if (unknown.length) parts.push(`ring domains not in UPG_DOMAINS: [${unknown.join(', ')}]`)\n    if (duplicates.length) parts.push(`domains in multiple rings: [${[...new Set(duplicates)].join(', ')}]`)\n    throw new Error(\n      `UPG_DOMAIN_RINGS must partition UPG_DOMAINS exactly: ${parts.join('; ')}. ` +\n        `Slot every domain into exactly one ring in domain-rings.ts.`,\n    )\n  }\n}\n\nassertRingsPartitionDomains()\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Look up which ring a domain belongs to.\n *\n * @example\n * const ring = getRingForDomain('user')\n * // ring?.id    === 'understand'\n * // ring?.label === 'Understand'\n *\n * @example\n * getRingForDomain('engineering')?.id   // → 'build'\n * getRingForDomain('not_a_domain')      // → undefined\n */\nexport function getRingForDomain(domainId: string): UPGDomainRing | undefined {\n  return UPG_DOMAIN_RINGS.find((ring) => ring.domain_ids.includes(domainId))\n}\n\n/**\n * Get all domain IDs in a given ring.\n *\n * @example\n * getDomainsInRing('understand')\n * // → ['user', 'user_research', 'market_intelligence', 'discovery', 'validation', 'feedback']\n *\n * @example\n * getDomainsInRing('not_a_ring')   // → []\n */\nexport function getDomainsInRing(ringId: string): string[] {\n  const ring = UPG_DOMAIN_RINGS.find((r) => r.id === ringId)\n  return ring ? [...ring.domain_ids] : []\n}\n\n/**\n * Every domain id in canonical ring order (nucleus outward, then within-ring\n * order). The single source of truth for the OUTWARD ORDER of the domains —\n * use this instead of a hand-maintained sequence. The coverage invariant above\n * guarantees this is a permutation of `UPG_DOMAINS` with no gaps or duplicates.\n *\n * @example\n * ringOrderedDomainIds().slice(0, 3)   // → ['portfolio', 'workspace', 'user']\n */\nexport function ringOrderedDomainIds(): string[] {\n  return UPG_DOMAIN_RINGS.flatMap((ring) => [...ring.domain_ids])\n}\n","/**\n * UPG Domain Usage Guides: operational knowledge for MCP agents.\n *\n * Each guide gives a domain's anchor entity, creation sequence, named\n * patterns (entity + edge chains), required cross-domain bridges, and\n * common mistakes. Surfaced via `get_entity_schema` and `get_product_context`.\n */\n\nimport type { UPGEntityType } from '../catalog/entity-catalog.js'\nimport type { UPGEdgeType } from '../shapes/edges.js'\nimport type { UPGDomainId } from '../registry/domains.js'\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface UPGDomainPattern {\n  /** Human-readable pattern name (no jargon, spell out acronyms) */\n  name: string\n  /** What this pattern accomplishes */\n  description: string\n  /** Entity types involved */\n  entity_types: UPGEntityType[]\n  /** Edge chain that connects them (in creation order) */\n  edge_chain: UPGEdgeType[]\n}\n\nexport interface UPGDomainBridge {\n  /** The edge type that crosses domain boundaries */\n  edge_type: UPGEdgeType\n  /** The target domain this edge connects to */\n  target_domain: UPGDomainId\n  /** When this bridge should be created */\n  when: string\n}\n\n/**\n * A common mistake agents make in a domain. Structured so MCP\n * consumers can proactively surface violations (e.g. \"you created a feature\n * without a persona, that's an anti-pattern\") instead of only rendering\n * prose. Migrated from `anti_patterns: string[]`; existing copy lives in\n * `description`, and `name` / `affected_entity` / `remediation` are\n * optional for backward migration but preferred for new entries.\n */\nexport interface UPGAntiPattern {\n  /** Short title. Enables compact display and cross-guide search. */\n  name?: string\n  /** The anti-pattern itself: prose explanation of the mistake. */\n  description: string\n  /** Which entity type is typically involved in this anti-pattern. */\n  affected_entity?: UPGEntityType\n  /** What the agent should do instead. */\n  remediation?: string\n}\n\nexport interface UPGDomainUsageGuide {\n  /** Domain ID this guide covers */\n  domain_id: UPGDomainId\n  /** The entity you create first. Everything else hangs from it. */\n  anchor_entity: UPGEntityType\n  /** Recommended creation sequence */\n  creation_sequence: UPGEntityType[]\n  /** Named patterns within this domain */\n  patterns: UPGDomainPattern[]\n  /** Cross-domain edges that should always be created */\n  required_bridges: UPGDomainBridge[]\n  /** Common mistakes agents make in this domain */\n  anti_patterns: UPGAntiPattern[]\n}\n\n// ─── Ring 1: Understand ─────────────────────────────────────────────────────\n\nconst USER_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'user',\n  anchor_entity: 'persona',\n  creation_sequence: ['persona', 'job', 'need', 'desired_outcome', 'job_step', 'switching_cost'],\n  patterns: [\n    {\n      name: 'Jobs to Be Done Tree',\n      description: 'Each persona pursues jobs, which surface needs and motivate desired outcomes',\n      entity_types: ['persona', 'job', 'need', 'desired_outcome'],\n      edge_chain: ['persona_pursues_job', 'job_surfaces_need', 'job_motivates_desired_outcome'],\n    },\n  ],\n  required_bridges: [\n    // product → persona is the canonical anchor. Every persona\n    // should attach to its product directly, not only via lateral\n    // ICP / positioning intermediaries.\n    { edge_type: 'product_targets_persona', target_domain: 'strategy', when: 'Every persona should attach directly to the product it targets' },\n    { edge_type: 'persona_experiences_user_journey', target_domain: 'ux_design', when: 'Every persona should have at least one journey mapped' },\n    { edge_type: 'opportunity_addresses_need', target_domain: 'discovery', when: 'Validated needs should feed into opportunity discovery' },\n  ],\n  anti_patterns: [\n    { description: 'Creating features before personas: define who you are building for first' },\n    { description: 'Personas without jobs: a persona without jobs to be done is a demographic profile, not actionable' },\n    { description: 'Needs without valence: always specify pain, gap, or constraint' },\n    // orphan personas attached only via ICP / positioning are a\n    // structural smell (those are downstream uses, not the anchor).\n    { description: 'Personas without a `product_targets_persona` edge: the persona is reachable laterally but not anchored to the product it serves' },\n  ],\n}\n\nconst USER_RESEARCH_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'user_research',\n  anchor_entity: 'research_study',\n  creation_sequence: ['research_study', 'research_question', 'interview_guide', 'participant', 'observation', 'quote', 'survey_response', 'affinity_cluster', 'insight'],\n  patterns: [\n    {\n      name: 'Research to Insight Pipeline',\n      description: 'Studies capture observations, observations cluster into themes, themes synthesise into insights',\n      entity_types: ['research_study', 'observation', 'quote', 'affinity_cluster', 'insight'],\n      edge_chain: ['research_study_captures_observation', 'observation_evidenced_by_quote', 'research_study_clusters_into_affinity_cluster', 'affinity_cluster_synthesises_insight'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'insight_informs_opportunity', target_domain: 'discovery', when: 'Every actionable insight should feed an opportunity' },\n    { edge_type: 'insight_characterises_persona', target_domain: 'user', when: 'Insights about user behaviour should enrich personas' },\n    { edge_type: 'insight_validates_need', target_domain: 'user', when: 'Research evidence should validate or refute identified needs' },\n  ],\n  anti_patterns: [\n    { description: 'Insights without evidence: every insight must trace back to observations and quotes' },\n    { description: 'Orphan quotes: quotes should belong to observations, not float independently' },\n    { description: 'Research studies without questions: always define what you want to learn before starting' },\n    {\n      name: 'Study conflation',\n      affected_entity: 'research_study',\n      description: 'Do not merge multiple research rounds with different stated goals into one `research_study` (or one participant pool) just because they were synthesized into the same downstream document. If two rounds have different research questions, they are different `research_study` nodes, even if an analyst wrote them up together.',\n      remediation: 'Verify against the *original* recording or session metadata, not the synthesis doc\\'s grouping.',\n    },\n  ],\n}\n\nconst MARKET_INTELLIGENCE_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'market_intelligence',\n  anchor_entity: 'competitive_analysis',\n  creation_sequence: ['competitive_analysis', 'competitor', 'competitor_feature', 'competitor_signal', 'market_trend', 'market_segment', 'classification_axis', 'classification_value'],\n  patterns: [\n    {\n      name: 'Competitive Landscape Map',\n      description: 'Analyses scope competitors, competitors offer features, features inspire or gap against yours',\n      entity_types: ['competitive_analysis', 'competitor', 'competitor_feature'],\n      edge_chain: ['competitive_analysis_analyses_competitor', 'competitor_offers_competitor_feature', 'competitor_feature_inspires_feature'],\n    },\n  ],\n  required_bridges: [\n    // product → competitive_analysis anchors the analysis to the\n    // product whose market it scopes; mirrors `product_targets_persona`\n    // for the user domain.\n    { edge_type: 'product_contains_competitive_analysis', target_domain: 'strategy', when: 'Every competitive_analysis should attach directly to the product that contains it' },\n    { edge_type: 'competitor_competes_for_persona', target_domain: 'user', when: 'Every competitor should link to the personas they compete for' },\n    { edge_type: 'market_trend_creates_opportunity', target_domain: 'discovery', when: 'Trends that create new opportunities should be connected' },\n    { edge_type: 'positioning_differentiates_from_competitor', target_domain: 'go_to_market', when: 'Positioning should reference specific competitors' },\n  ],\n  anti_patterns: [\n    { description: 'Building without competitive context. Differentiation needs to know who else solves the problem.' },\n    { description: 'Feature comparisons without parity status: always assess whether you are ahead, behind, or at parity' },\n    { description: 'Stale competitive data: competitive intelligence decays quickly, track analysis dates' },\n    // orphan competitive_analysis nodes, surfaced via chain validation.\n    { description: 'Competitive analyses without a `product_contains_competitive_analysis` edge: the analysis floats in market_intelligence space without an anchor to which product contains it' },\n  ],\n}\n\nconst DISCOVERY_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'discovery',\n  anchor_entity: 'opportunity',\n  creation_sequence: ['opportunity', 'solution', 'feasibility_study', 'design_sprint'],\n  patterns: [\n    {\n      name: 'Opportunity Solution Tree',\n      description: 'Outcomes reveal opportunities, opportunities drive solutions, solutions propose hypotheses',\n      entity_types: ['outcome', 'opportunity', 'solution', 'hypothesis'],\n      edge_chain: ['outcome_reveals_opportunity', 'opportunity_drives_solution', 'solution_proposes_hypothesis'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'opportunity_addresses_need', target_domain: 'user', when: 'Every opportunity should address at least one user need' },\n    { edge_type: 'solution_proposes_hypothesis', target_domain: 'validation', when: 'Solutions should be tested, not assumed to work' },\n    { edge_type: 'insight_informs_opportunity', target_domain: 'user_research', when: 'Opportunities should be grounded in research insights' },\n  ],\n  anti_patterns: [\n    { description: 'Solutions without opportunities: always articulate the problem before proposing solutions' },\n    { description: 'Opportunities without needs: if no user feels the pain, the opportunity is imagined' },\n    { description: 'Skipping validation. Test every solution before promoting it to a feature.' },\n  ],\n}\n\nconst VALIDATION_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'validation',\n  anchor_entity: 'hypothesis',\n  // (UPG-664) creation_sequence covers every entity registered to the\n  // `validation` domain along the canonical chain hypothesis → experiment_plan\n  // → experiment → experiment_run. `experiment` is the canonical structured\n  // test; experiment_run is its optional replication child. `test_plan`\n  // re-homed to the QA/testing domain (UPG-678).\n  creation_sequence: ['hypothesis', 'experiment_plan', 'experiment', 'experiment_run', 'evidence', 'learning', 'research_plan'],\n  patterns: [\n    {\n      name: 'Hypothesis Testing Loop',\n      description: 'A hypothesis requires a plan (the experiment design), the plan designs an experiment (the structured test), the experiment is executed as run(s) that produce evidence and learnings, and learnings update the hypothesis',\n      entity_types: ['hypothesis', 'experiment_plan', 'experiment', 'experiment_run', 'evidence', 'learning'],\n      edge_chain: ['hypothesis_requires_experiment_plan', 'experiment_plan_designs_experiment', 'experiment_executed_as_experiment_run', 'experiment_run_yields_evidence', 'experiment_run_produces_learning', 'learning_updates_hypothesis'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'assumption_becomes_hypothesis', target_domain: 'strategy', when: 'Strategic assumptions should be formalised as testable hypotheses' },\n    { edge_type: 'learning_validates_opportunity', target_domain: 'discovery', when: 'Experiment results should validate or invalidate the opportunity' },\n    { edge_type: 'learning_informs_feature', target_domain: 'product_spec', when: 'Validated learnings should inform what gets built' },\n  ],\n  anti_patterns: [\n    { description: 'Hypotheses without experiments. An untested hypothesis is an opinion.' },\n    { description: 'Experiments without success criteria: define what would change your mind before running the test' },\n    { description: 'Building features from unvalidated hypotheses: the most expensive way to learn you were wrong' },\n  ],\n}\n\nconst FEEDBACK_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'feedback',\n  anchor_entity: 'feedback_program',\n  creation_sequence: ['feedback_program', 'feature_request', 'feedback_vote', 'nps_campaign', 'feedback_theme', 'beta_program', 'user_advisory_board'],\n  patterns: [\n    {\n      name: 'Voice of Customer Pipeline',\n      description: 'Programs collect requests, requests accumulate votes, themes emerge from patterns across requests',\n      entity_types: ['feedback_program', 'feature_request', 'feedback_vote', 'feedback_theme'],\n      edge_chain: ['feedback_program_collects_feature_request', 'feature_request_voted_on_by_feedback_vote', 'feedback_program_identifies_feedback_theme'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'feature_request_creates_opportunity', target_domain: 'discovery', when: 'High-demand requests should become discovery opportunities' },\n    { edge_type: 'feedback_theme_validates_need', target_domain: 'user', when: 'Recurring themes validate that a user need is real' },\n    { edge_type: 'nps_campaign_tracks_metric', target_domain: 'strategy', when: 'NPS scores should connect to the metrics they track' },\n  ],\n  anti_patterns: [\n    { description: 'Building what the loudest customer asks for: weight by segment, revenue impact, and strategic alignment' },\n    { description: 'Feature requests without provenance: always track where a request came from and who asked' },\n    { description: 'Ignoring detractor feedback: negative NPS responses are the highest-signal input you have' },\n  ],\n}\n\n// ─── Ring 2: Define ─────────────────────────────────────────────────────────\n\nconst STRATEGY_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'strategy',\n  anchor_entity: 'outcome',\n  // creation_sequence covers every entity registered to the `strategy`\n  // domain (UPG-516, kept in sync with `UPG_DOMAINS.strategy.types` and\n  // enforced by `creation-sequence-matches-registry.test.ts`). Trailing\n  // entries are later additions appended in chronological-introduction\n  // order. Placement reflects the order in which they would naturally be\n  // authored after the canonical strategy spine.\n  creation_sequence: ['product', 'vision', 'mission', 'outcome', 'objective', 'key_result', 'metric', 'metric_quality_assessment', 'strategic_theme', 'strategic_pillar', 'initiative', 'capability', 'value_stream', 'assumption', 'strategic_question', 'decision', 'constraint'],\n  patterns: [\n    {\n      name: 'Strategic Cascade',\n      description: 'Vision grounds mission, product pursues outcomes and targets objectives, objectives achieved through key results measured by metrics',\n      entity_types: ['vision', 'mission', 'outcome', 'objective', 'key_result', 'metric'],\n      edge_chain: ['product_guided_by_vision', 'product_fulfils_mission', 'vision_realised_through_mission', 'product_pursues_outcome', 'product_targets_objective', 'objective_achieved_through_key_result', 'outcome_measured_by_metric'],\n    },\n    {\n      name: 'Rendering the company spine',\n      description: 'The company OKR / strategy / north-star spine already renders with get_tree, no new pattern needed: switch to the org_rollup member (the company rollup graph) and run the okr, strategy, or north_star tree pattern there. In a portfolio the spine can span files, a rollup theme laddering into product-graph objectives through the cross-product strategic_theme_contains_objective edge; get_tree walks the active member, so render the rollup for the whole-company view and a product for its slice.',\n      entity_types: ['strategic_theme', 'objective', 'key_result', 'metric'],\n      edge_chain: ['strategic_theme_contains_objective', 'objective_achieved_through_key_result', 'key_result_quantified_by_metric'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'outcome_reveals_opportunity', target_domain: 'discovery', when: 'Outcomes should connect to the opportunities that deliver them' },\n    { edge_type: 'outcome_delivered_by_feature', target_domain: 'product_spec', when: 'Strategic outcomes should decompose into shipped features' },\n    { edge_type: 'assumption_becomes_hypothesis', target_domain: 'validation', when: 'Risky assumptions should become testable hypotheses' },\n    { edge_type: 'objective_depends_on_dependency', target_domain: 'team_org', when: 'An objective that hinges on cross-team work should name the dependency it is exposed to' },\n    { edge_type: 'objective_defers_feature', target_domain: 'product_spec', when: 'Work an objective explicitly puts out of scope for now should point at the deferred feature with a deferred_to period, not silently vanish from the quarter' },\n  ],\n  anti_patterns: [\n    { description: 'Outcomes without metrics. Measurement is the signal an outcome happened.' },\n    { description: 'Objectives without key results: an objective without measurement is a wish' },\n    { description: 'Too many strategic themes: focus beats breadth, aim for 2-4 active themes' },\n    { description: 'Constraints without an origin: a qualitative guardrail lives on a constraint, so set constraint_origin to say where it comes from. internal marks a self-imposed principle or operating tenet the team commits to; external marks a limit, requirement, or ceiling imposed from outside (a regulation, a budget cap, a platform bound).' },\n    { description: 'Overloading assumption for open questions: an assumption is a premise the plan is built on and resolves by being tested (assumption_becomes_hypothesis). An unresolved coordination or ownership question the plan is exposed to (who owns a capability across teams, where a boundary falls after a reorg) is a strategic_question, raised under the objective or initiative it hangs off. Do not force one into the other.' },\n  ],\n}\n\nconst PRODUCT_SPEC_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'product_spec',\n  anchor_entity: 'feature',\n  // story_task removed (v0.4.0, collapsed into canonical `task`, see\n  // UPG_MIGRATIONS['0.4.0']). theme + changelog appended (UPG-516, were\n  // registered to product_spec but missing from the navigation order).\n  // `changelog` lives here because it is a structural product-shipping\n  // artefact; content domain references it only via cross-domain bridges.\n  creation_sequence: ['feature_area', 'feature', 'epic', 'user_story', 'acceptance_criterion', 'task', 'bug', 'release', 'roadmap', 'roadmap_item', 'roadmap_theme', 'changelog', 'planning_cycle', 'configuration_axis'],\n  patterns: [\n    {\n      name: 'Feature Decomposition',\n      description: 'Features group into areas, decompose into epics, epics specify user stories (the templated promise), and tasks implement them as the engineering work',\n      entity_types: ['feature_area', 'feature', 'epic', 'user_story', 'task'],\n      edge_chain: ['feature_area_contains_feature', 'feature_decomposed_into_epic', 'epic_specified_by_user_story', 'task_implements_user_story'],\n    },\n    {\n      name: 'Epic Work Items',\n      description: 'A bug or a pure engineering/infra task that belongs to one specific epic (not the feature as a whole) attaches directly to that epic, mirroring how task and bug attach at the feature level. Use this when importing a real tracker (Linear/Jira) whose tickets are heterogeneous: keep genuine stories as user_story, but let bugs, spikes, and engineering tasks nest under their epic with their true type instead of being mislabelled to preserve the grouping.',\n      entity_types: ['epic', 'task', 'bug'],\n      edge_chain: ['epic_decomposes_into_task', 'epic_affected_by_bug'],\n    },\n    {\n      name: 'Planning Cadence',\n      description: 'The cadence axis. Create a planning_cycle (a sprint, iteration, quarter, or PI), nest finer cycles inside a coarse one, schedule the work that flows through it (a task, story, epic, feature or bug), and scope the objectives the cycle serves. Scheduling and scoping are deliberate links, not containment: the scheduled item keeps its feature/epic parent.',\n      entity_types: ['planning_cycle', 'task', 'user_story', 'objective'],\n      edge_chain: ['planning_cycle_contains_planning_cycle', 'planning_cycle_schedules_work_item', 'objective_scoped_to_planning_cycle'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'feature_tests_hypothesis', target_domain: 'validation', when: 'Features should trace back to validated hypotheses' },\n    { edge_type: 'outcome_delivered_by_feature', target_domain: 'strategy', when: 'Every feature should connect to a strategic outcome' },\n    { edge_type: 'test_case_covers_user_story', target_domain: 'testing', when: 'User stories should have acceptance tests' },\n  ],\n  anti_patterns: [\n    { description: 'Features without outcomes. Features serve strategic outcomes; the rest is waste.' },\n    { description: 'Long-running epics. Split any epic that runs over a month.' },\n    { description: 'Roadmap items without owners: every committed item needs a team' },\n  ],\n}\n\nconst UX_DESIGN_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'ux_design',\n  anchor_entity: 'user_journey',\n  // (UPG-663) creation order follows containment: a journey_action is a child\n  // of a journey_step, so the step must precede the action. The journey is the\n  // anchor; phases are the band overlay; steps are the timeline; actions\n  // decompose a step into service-blueprint rows.\n  creation_sequence: ['user_journey', 'journey_phase', 'journey_step', 'journey_action', 'screen', 'screen_state', 'surface', 'user_flow', 'wireframe', 'prototype', 'design_question', 'design_concept'],\n  patterns: [\n    {\n      name: 'Journey to Screen Flow',\n      description: 'Journeys map the experience, journey steps are shown on screens, prototypes simulate screens so the design can be tested',\n      entity_types: ['user_journey', 'journey_step', 'screen', 'prototype'],\n      edge_chain: ['persona_experiences_user_journey', 'user_journey_contains_journey_step', 'journey_step_shown_on_screen', 'prototype_simulates_screen'],\n    },\n    {\n      name: 'Surface Contention',\n      description: 'A screen renders surfaces, features occupy them, and the surface records the rule that settles who wins. Nest the place (shell, pane, region, slot), list the occupants, then write the arbitration rule down once so it is not re-argued at the next feature.',\n      entity_types: ['screen', 'surface', 'feature'],\n      edge_chain: ['screen_renders_surface', 'surface_contains_surface', 'feature_occupies_surface', 'surface_serves_job'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'persona_experiences_user_journey', target_domain: 'user', when: 'Every journey must be anchored to a persona' },\n    { edge_type: 'feature_occupies_surface', target_domain: 'product_spec', when: 'A surface should list the features that occupy it; the guest list is what makes contention visible' },\n    { edge_type: 'prototype_tests_hypothesis', target_domain: 'validation', when: 'Prototypes should test design hypotheses before building' },\n    { edge_type: 'screen_surfaces_feature', target_domain: 'product_spec', when: 'Screens should connect to the features they surface' },\n  ],\n  anti_patterns: [\n    { description: 'Screens without journeys: isolated screens miss the experience context' },\n    { description: 'Surfaces without an arbitration rule: a place two features both want, with no recorded answer for who wins, is a decision that gets made again every time it comes up. Fill `arbitration_rule`, or link the design guideline that already answers it via surface_governed_by_design_guideline.' },\n    { description: 'Prototypes without testing: if nobody tests the prototype, it is just art' },\n    { description: 'Design questions left open: exploration status should progress to resolved or parked' },\n    { description: 'Touchpoints stuffed in the deprecated journey_step.touchpoint string (UPG-675). Touchpoints belong in one of two layers: journey_action is the in-product blueprint layer (the finest band of a journey_step), and the touchpoint entity is the cross-channel customer-success layer (touchpoint_occurs_in_journey_step). Pick the layer; do not duplicate the touch as a free-text string.' },\n  ],\n}\n\nconst DESIGN_SYSTEM_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'design_system',\n  anchor_entity: 'design_system',\n  creation_sequence: ['design_system', 'design_component', 'design_token', 'design_pattern', 'design_guideline', 'annotation', 'interaction_spec'],\n  patterns: [\n    {\n      name: 'Token to Component Stack',\n      description: 'Tokens define primitives, components compose tokens, components follow patterns, guidelines codify rules',\n      entity_types: ['design_token', 'design_component', 'design_pattern', 'design_guideline'],\n      edge_chain: ['design_system_defines_design_token', 'design_system_contains_design_component', 'design_component_follows_design_pattern'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'screen_renders_design_component', target_domain: 'ux_design', when: 'Components should link to the screens that render them' },\n    { edge_type: 'design_token_reflects_brand_colour', target_domain: 'brand', when: 'Tokens should trace back to brand definitions' },\n  ],\n  anti_patterns: [\n    { description: 'Components without tokens: hard-coded values bypass the design system' },\n    { description: 'Patterns without guidelines: document when and how to use each pattern' },\n    { description: 'One-off components: if it is used once, it might not belong in the system' },\n  ],\n}\n\nconst BRAND_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'brand',\n  anchor_entity: 'brand_identity',\n  creation_sequence: ['brand_identity', 'brand_voice', 'brand_colour', 'brand_typography', 'brand_logo', 'brand_imagery', 'brand_asset'],\n  patterns: [\n    {\n      name: 'Brand Identity System',\n      description: 'Brand identity anchors all visual and verbal elements: voice, colour, type, logo, imagery',\n      entity_types: ['brand_identity', 'brand_voice', 'brand_colour', 'brand_typography', 'brand_logo'],\n      edge_chain: ['brand_identity_speaks_with_brand_voice', 'brand_identity_coloured_with_brand_colour', 'brand_identity_typeset_with_brand_typography', 'brand_identity_signed_with_brand_logo'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'design_token_reflects_brand_colour', target_domain: 'design_system', when: 'Brand colours should be encoded as design tokens' },\n    { edge_type: 'messaging_aligns_with_brand_voice', target_domain: 'go_to_market', when: 'GTM messaging should follow brand voice guidelines' },\n  ],\n  anti_patterns: [\n    { description: 'Brand elements without the identity root: everything should hang from brand_identity' },\n    { description: 'Orphan brand assets: every asset should link to the brand element it represents' },\n    { description: 'Voice without examples: brand voice needs concrete dos and don\\'ts' },\n  ],\n}\n\nconst LEGAL_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'legal',\n  anchor_entity: 'contract',\n  creation_sequence: ['contract', 'contract_clause', 'legal_entity', 'ip_asset', 'privacy_policy'],\n  patterns: [\n    {\n      name: 'Contract Structure',\n      description: 'Contracts contain clauses, legal entities are bound by contracts, legal entities protect intellectual property',\n      entity_types: ['contract', 'contract_clause', 'legal_entity', 'ip_asset'],\n      edge_chain: ['contract_contains_contract_clause', 'legal_entity_bound_by_contract', 'legal_entity_protects_ip_asset'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'privacy_policy_governs_data_source', target_domain: 'data_analytics', when: 'Privacy policies should connect to the data they govern' },\n    { edge_type: 'contract_governs_partnership', target_domain: 'business_model', when: 'Partnership contracts should link to the partnership entity' },\n  ],\n  anti_patterns: [\n    { description: 'IP assets without ownership: every piece of IP must be assigned to a legal entity' },\n    { description: 'Contracts without clauses: the detail lives in the clauses, not the contract description' },\n    { description: 'Privacy policies without scope: specify which data sources and processing activities are covered' },\n  ],\n}\n\n// ─── Ring 3: Build ──────────────────────────────────────────────────────────\n\nconst ENGINEERING_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'engineering',\n  anchor_entity: 'service',\n  // creation_sequence covers every entity registered to `engineering`\n  // (UPG-516, kept in sync with `UPG_DOMAINS.engineering.types` and\n  // enforced by `creation-sequence-matches-registry.test.ts`). The trailing\n  // RCA quartet (`investigation`, `root_cause`, `symptom`, `fix`) was\n  // anchored to engineering at v0.2.0 (entity_meta `ent_315 → ent_318`)\n  // because the work product is structurally engineering (code fixes,\n  // technical analysis). The devops domain guide intentionally references\n  // these entities cross-domain in its \"Incident Response Chain\" pattern\n  // and via the `required_bridges` declarations. Devops is the operator\n  // surface; engineering owns the RCA artefacts. Earlier devops\n  // creation_sequence entries (`root_cause`, `symptom`) were drift, not\n  // ownership, and have been removed from there.\n  creation_sequence: ['service', 'bounded_context', 'domain_event', 'api_contract', 'api_endpoint', 'database_schema', 'technical_debt_item', 'feature_flag', 'aggregate', 'domain_entity', 'value_object', 'command', 'read_model', 'queue_topic', 'build_artifact', 'code_repository', 'library_dependency', 'integration_pattern', 'external_api', 'data_flow', 'deployment', 'investigation', 'root_cause', 'symptom', 'fix'],\n  patterns: [\n    {\n      name: 'Domain-Driven Service Map',\n      description: 'Bounded contexts deploy services, contexts emit domain events, services publish to queue topics',\n      entity_types: ['bounded_context', 'service', 'domain_event', 'queue_topic'],\n      edge_chain: ['bounded_context_deploys_service', 'bounded_context_emits_domain_event', 'service_publishes_to_queue_topic'],\n    },\n    {\n      name: 'API Contract Chain',\n      description: 'Services expose API contracts, contracts contain their endpoints, endpoints serve features',\n      entity_types: ['service', 'api_contract', 'api_endpoint', 'feature'],\n      edge_chain: ['service_exposes_api_contract', 'api_contract_contains_api_endpoint', 'api_endpoint_serves_feature'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'service_powers_feature', target_domain: 'product_spec', when: 'Every service should link to the features it powers' },\n    { edge_type: 'monitor_watches_service', target_domain: 'devops', when: 'Production services should have monitoring connected' },\n    { edge_type: 'technical_debt_item_blocks_feature', target_domain: 'product_spec', when: 'Tech debt that blocks delivery should be visible to product' },\n  ],\n  anti_patterns: [\n    { description: 'Services without bounded contexts: every service should own a clear domain boundary' },\n    { description: 'API contracts without versioning: always track contract status (draft, published, deprecated)' },\n    { description: 'Technical debt without severity: prioritise debt by impact on velocity and reliability' },\n  ],\n}\n\nconst DEVOPS_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'devops',\n  anchor_entity: 'monitor',\n  // creation_sequence covers every entity registered to `devops`\n  // (UPG-516). Previous drift removed: `deployment`, `root_cause`,\n  // `symptom` belong to the engineering domain per the registry; they\n  // remain referenced from the \"Incident Response Chain\" pattern below as\n  // intentional cross-domain hops (the operator surface walks into\n  // engineering for the RCA tail). SLI/SLO/CI-pipeline now appear in the\n  // sequence (they were registered but unsurfaced).\n  creation_sequence: ['monitor', 'alert_rule', 'incident', 'postmortem', 'service_level_indicator', 'service_level_objective', 'runbook', 'error_budget', 'on_call_rotation', 'infrastructure_component', 'ci_pipeline', 'release_strategy'],\n  patterns: [\n    {\n      name: 'Incident Response Chain',\n      description: 'Monitors detect symptoms, symptoms trigger incidents, incidents are analysed in postmortems, postmortems identify root causes and produce runbook updates',\n      entity_types: ['monitor', 'symptom', 'incident', 'postmortem', 'root_cause', 'runbook'],\n      edge_chain: ['monitor_detects_symptom', 'symptom_triggers_incident', 'incident_analysed_in_postmortem', 'postmortem_identifies_root_cause', 'postmortem_produces_runbook'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'product_ships_via_release', target_domain: 'product_spec', when: 'Deployments should link through the product to the release they ship' },\n    { edge_type: 'monitor_watches_service', target_domain: 'engineering', when: 'Incidents connect to services through the monitors that watch them' },\n    { edge_type: 'root_cause_manifests_as_technical_debt_item', target_domain: 'engineering', when: 'Systemic root causes should become tech debt items' },\n  ],\n  anti_patterns: [\n    { description: 'Incidents without postmortems: every significant incident should produce learnings' },\n    { description: 'Monitors without alert rules. A monitor that does not alert is logging.' },\n    { description: 'Runbooks without triggers: define when each runbook should be activated' },\n  ],\n}\n\nconst TESTING_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'testing',\n  anchor_entity: 'test_suite',\n  // (UPG-678) test_plan re-homed validation → QA: the verification-approach\n  // plan that the suites execute. Listed first as the QA planning layer.\n  creation_sequence: ['test_plan', 'test_suite', 'test_case', 'qa_session', 'regression_test', 'test_coverage_report', 'test_environment', 'test_result'],\n  patterns: [\n    {\n      name: 'Test Pyramid',\n      description: 'Suites contain cases, cases validate acceptance criteria and cover user stories, suites are measured by coverage reports',\n      entity_types: ['test_suite', 'test_case', 'acceptance_criterion', 'test_coverage_report'],\n      edge_chain: ['test_suite_contains_test_case', 'test_case_validates_acceptance_criterion', 'test_suite_measured_by_test_coverage_report'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'test_case_covers_user_story', target_domain: 'product_spec', when: 'Test cases should trace back to user stories (which in turn trace to features via epics)' },\n    { edge_type: 'test_case_validates_acceptance_criterion', target_domain: 'product_spec', when: 'Acceptance criteria define what \"done\" means and must be validated by tests' },\n  ],\n  anti_patterns: [\n    { description: 'Tests without traceability: every test should link to a requirement or story' },\n    { description: 'Test environments without status: track whether environments are available or in use' },\n    { description: 'QA sessions without findings: document what was explored and what was found' },\n  ],\n}\n\nconst SECURITY_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'security',\n  anchor_entity: 'threat_model',\n  creation_sequence: ['threat_model', 'threat', 'vulnerability', 'security_control', 'security_policy', 'penetration_test', 'security_review', 'data_classification', 'access_policy'],\n  patterns: [\n    {\n      name: 'Threat to Control Chain',\n      description: 'Threat models identify threats, controls mitigate threats, penetration tests assess the services those controls protect',\n      entity_types: ['threat_model', 'threat', 'security_control', 'penetration_test'],\n      edge_chain: ['threat_model_identifies_threat', 'security_control_mitigates_threat', 'security_control_protects_service', 'penetration_test_assesses_service'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'penetration_test_assesses_service', target_domain: 'engineering', when: 'Every critical service should be assessed by a penetration test' },\n    { edge_type: 'security_policy_defines_access_policy', target_domain: 'compliance', when: 'Security policies should define the access policies they enforce' },\n  ],\n  anti_patterns: [\n    { description: 'Threats without controls: every identified threat needs a mitigation plan' },\n    { description: 'Controls without testing: untested controls may not work when needed' },\n    { description: 'Threat models that go stale: review when the system architecture changes' },\n  ],\n}\n\nconst ACCESSIBILITY_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'accessibility',\n  anchor_entity: 'a11y_audit',\n  creation_sequence: ['a11y_standard', 'a11y_guideline', 'a11y_audit', 'a11y_issue', 'a11y_annotation'],\n  patterns: [\n    {\n      name: 'Audit to Resolution',\n      description: 'Standards contain guidelines, standards are verified by audits, audits discover issues and carry annotations back to design',\n      entity_types: ['a11y_standard', 'a11y_guideline', 'a11y_audit', 'a11y_issue', 'a11y_annotation'],\n      edge_chain: ['a11y_standard_contains_a11y_guideline', 'a11y_standard_verified_by_a11y_audit', 'a11y_audit_discovers_a11y_issue', 'a11y_standard_annotated_with_a11y_annotation'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'a11y_issue_affects_design_component', target_domain: 'design_system', when: 'Accessibility issues should link to the design components they affect (which in turn render in screens)' },\n  ],\n  anti_patterns: [\n    { description: 'Audits without standards: specify which WCAG level you are auditing against' },\n    { description: 'Issues without severity: not all violations are equal, prioritise by impact' },\n    { description: 'Accessibility as an afterthought: annotate designs before building, not after' },\n  ],\n}\n\nconst DATA_ANALYTICS_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'data_analytics',\n  anchor_entity: 'data_source',\n  creation_sequence: ['data_source', 'event_schema', 'data_pipeline', 'data_model', 'data_quality_rule', 'data_product', 'data_lineage', 'data_domain', 'glossary_term', 'dashboard', 'report'],\n  patterns: [\n    {\n      name: 'Data Pipeline Flow',\n      description: 'Sources feed pipelines, pipelines feed data products, data domains model entities and surface them in dashboards',\n      entity_types: ['data_source', 'data_pipeline', 'data_product', 'data_domain', 'data_model', 'dashboard'],\n      edge_chain: ['data_pipeline_reads_from_data_source', 'data_pipeline_feeds_data_product', 'data_domain_modelled_in_data_model', 'data_domain_visualised_in_dashboard'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'funnel_step_tracks_event_schema', target_domain: 'growth', when: 'Analytics events should link to the funnel steps they track (which trace back to features)' },\n    { edge_type: 'dashboard_tracks_metric', target_domain: 'strategy', when: 'Dashboards should track the strategic metrics they display' },\n  ],\n  anti_patterns: [\n    { description: 'Events without schemas: every tracked event needs a defined payload structure' },\n    { description: 'Dashboards without audience: specify who needs this data and why' },\n    { description: 'Data pipelines without quality rules: validate data at ingestion, not after analysis' },\n  ],\n}\n\nconst AI_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'ai',\n  anchor_entity: 'ai_model',\n  creation_sequence: ['ai_model', 'prompt_template', 'prompt_version', 'eval_benchmark', 'eval_run', 'ai_experiment', 'ai_dataset', 'ai_cost_tracker', 'ai_guardrail', 'hallucination_report', 'model_comparison', 'ai_trace'],\n  patterns: [\n    {\n      name: 'Model Evaluation Loop',\n      description: 'Models benchmarked against eval benchmarks, benchmarks executed as eval runs, models compared across runs',\n      entity_types: ['ai_model', 'eval_benchmark', 'eval_run', 'model_comparison'],\n      edge_chain: ['ai_model_benchmarked_by_eval_benchmark', 'eval_benchmark_executed_as_eval_run', 'ai_model_compared_in_model_comparison'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'ai_dataset_sourced_from_data_source', target_domain: 'data_analytics', when: 'AI datasets should trace provenance to the data sources they draw from' },\n    { edge_type: 'ai_guardrail_enforces_security_policy', target_domain: 'security', when: 'AI guardrails should map to the security policies that constrain them' },\n  ],\n  anti_patterns: [\n    { description: 'Models without evaluation: always benchmark before deploying' },\n    { description: 'Prompts without versioning: track prompt iterations like code versions' },\n    { description: 'Cost tracking as an afterthought: monitor spend from day one' },\n  ],\n}\n\nconst AUTOMATION_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'automation',\n  anchor_entity: 'workflow_template',\n  creation_sequence: ['workflow_template', 'workflow_run', 'agent_definition', 'agent_session', 'agent_skill', 'agent_hook', 'agent_task', 'review_gate', 'approval_record', 'workflow_artifact'],\n  patterns: [\n    {\n      name: 'Agent Workflow',\n      description: 'Agents orchestrate workflow templates, templates execute as runs, templates are gated by review gates for quality',\n      entity_types: ['agent_definition', 'workflow_template', 'workflow_run', 'review_gate'],\n      edge_chain: ['agent_definition_orchestrates_workflow_template', 'workflow_template_executed_as_workflow_run', 'workflow_template_gated_by_review_gate'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'agent_skill_extends_feature', target_domain: 'product_spec', when: 'Agent capabilities should map to product features they extend' },\n    { edge_type: 'review_gate_approved_via_approval_record', target_domain: 'program_mgmt', when: 'Quality gates should connect to approval workflows' },\n  ],\n  anti_patterns: [\n    { description: 'Agents without skills: define what each agent can do explicitly' },\n    { description: 'Workflows without gates: autonomous processes need human checkpoints' },\n    { description: 'Sessions without outcomes: track what each agent run accomplished' },\n  ],\n}\n\n// ─── Ring 4: Grow ───────────────────────────────────────────────────────────\n\nconst BUSINESS_MODEL_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'business_model',\n  anchor_entity: 'business_model',\n  creation_sequence: ['business_model', 'value_proposition', 'revenue_stream', 'cost_structure', 'unit_economics', 'partnership', 'key_resource', 'key_activity', 'customer_relationship', 'distribution_channel'],\n  patterns: [\n    {\n      name: 'Business Model Canvas',\n      description: 'The nine building blocks: value proposition, segments, channels, relationships, revenue, resources, activities, partners, costs',\n      entity_types: ['business_model', 'value_proposition', 'revenue_stream', 'cost_structure'],\n      edge_chain: ['product_monetised_via_business_model', 'business_model_delivers_value_proposition', 'business_model_earns_via_revenue_stream', 'business_model_costs_via_cost_structure'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'value_proposition_targets_persona', target_domain: 'user', when: 'Every value proposition should target specific personas' },\n    { edge_type: 'revenue_stream_tiered_as_pricing_tier', target_domain: 'pricing', when: 'Revenue streams should connect to pricing tiers' },\n    { edge_type: 'business_model_targets_market_segment', target_domain: 'market_intelligence', when: 'The business model should specify which market segments it serves' },\n  ],\n  anti_patterns: [\n    { description: 'Business models without unit economics: know your LTV/CAC ratio' },\n    { description: 'Value propositions without persona links: who specifically benefits?' },\n    { description: 'Revenue streams without pricing: how does the money actually flow?' },\n  ],\n}\n\nconst GROWTH_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'growth',\n  anchor_entity: 'funnel',\n  creation_sequence: ['funnel', 'funnel_step', 'acquisition_channel', 'growth_campaign', 'cohort', 'behavioral_segment', 'growth_loop', 'variant', 'attribution_model'],\n  patterns: [\n    {\n      name: 'Pirate Metrics Funnel',\n      description: 'Product measures funnels, funnels contain steps, acquisition channels run campaigns that reach segments, cohorts track retention through experiments',\n      entity_types: ['funnel', 'funnel_step', 'acquisition_channel', 'growth_campaign', 'cohort'],\n      edge_chain: ['product_measures_funnel', 'funnel_contains_funnel_step', 'acquisition_channel_runs_growth_campaign', 'cohort_exposed_to_experiment_run'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'funnel_step_maps_to_journey_step', target_domain: 'ux_design', when: 'Funnel steps should map to user journey touchpoints' },\n    { edge_type: 'growth_campaign_targets_behavioral_segment', target_domain: 'user', when: 'Campaigns should target specific user segments' },\n    { edge_type: 'acquisition_channel_drives_outcome', target_domain: 'strategy', when: 'Channels should connect to the strategic outcomes they drive' },\n  ],\n  anti_patterns: [\n    { description: 'Funnels without steps: define the stages users pass through' },\n    { description: 'Growth without retention: acquiring users who churn is expensive waste' },\n    { description: 'Campaigns without attribution. Attribution is what makes optimisation possible.' },\n  ],\n}\n\nconst GTM_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'go_to_market',\n  anchor_entity: 'gtm_strategy',\n  creation_sequence: ['gtm_strategy', 'ideal_customer_profile', 'positioning', 'messaging', 'launch', 'content_strategy', 'sales_motion', 'competitive_battle_card', 'demand_gen_program', 'territory', 'objection', 'rebuttal', 'proof_point'],\n  patterns: [\n    {\n      name: 'Positioning Cascade',\n      description: 'Strategy defines positioning, positioning spawns messaging variants, messaging addresses objections with rebuttals backed by proof points',\n      entity_types: ['positioning', 'messaging', 'objection', 'rebuttal', 'proof_point'],\n      edge_chain: ['gtm_strategy_positions_via_positioning', 'positioning_communicated_via_messaging', 'positioning_challenged_by_objection', 'objection_countered_by_rebuttal', 'rebuttal_evidenced_by_proof_point'],\n    },\n    {\n      name: 'Audience Projection Lattice',\n      description: 'One feature approaching launch needs many faces: what the internal field org (SE/PMM/SA) needs to know differs from what an enterprise champion needs at beta versus GA. Model the atoms, not the rendered pages. A feature is communicated_via messaging variants; each variant targets a persona (an internal field-ops persona or a customer persona) and is used_in a staged launch (beta, then GA); the launch is coordinated_via a project (the readiness checklist: demo env, SE training, by when). The projection itself is a query over these atoms, rendered by the product, never a stored copy that drifts.',\n      entity_types: ['feature', 'messaging', 'persona', 'launch', 'project'],\n      edge_chain: ['feature_communicated_via_messaging', 'messaging_targets_persona', 'launch_ships_feature', 'launch_coordinated_via_project'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'positioning_differentiates_via_value_proposition', target_domain: 'business_model', when: 'Positioning should reference your value propositions' },\n    { edge_type: 'positioning_differentiates_from_competitor', target_domain: 'market_intelligence', when: 'Positioning should explicitly differentiate from competitors' },\n    { edge_type: 'ideal_customer_profile_maps_to_persona', target_domain: 'user', when: 'ICP should link to the personas it represents' },\n  ],\n  anti_patterns: [\n    { description: 'Positioning without competitors. Differentiation requires a comparison frame.' },\n    { description: 'Messaging without channel variants. Each channel needs its own variant.' },\n    { description: 'Objections without rebuttals: if you know the objection, prepare the answer' },\n  ],\n}\n\nconst PRICING_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'pricing',\n  anchor_entity: 'pricing_strategy',\n  creation_sequence: ['pricing_strategy', 'pricing_tier', 'discount_strategy', 'trial_config', 'paywall'],\n  patterns: [\n    {\n      name: 'Pricing Tier Structure',\n      description: 'Strategy offers tiers, tiers include features, tiers gated by paywalls, tiers trialed via trial configs',\n      entity_types: ['pricing_strategy', 'pricing_tier', 'paywall', 'trial_config'],\n      edge_chain: ['pricing_strategy_offers_pricing_tier', 'pricing_tier_includes_feature', 'pricing_tier_gated_by_paywall', 'pricing_tier_trialed_via_trial_config'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'pricing_tier_includes_feature', target_domain: 'product_spec', when: 'Every tier should specify which features it includes' },\n    { edge_type: 'pricing_tier_targets_behavioral_segment', target_domain: 'growth', when: 'Tiers should map to user segments (free users, power users, teams)' },\n  ],\n  anti_patterns: [\n    { description: 'Pricing without tiers: even a single price point is a tier' },\n    { description: 'Tiers without feature differentiation: users need to understand what they get at each level' },\n    { description: 'Trials without conversion tracking: measure how many trial users convert to paid' },\n  ],\n}\n\nconst SALES_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'sales',\n  anchor_entity: 'pipeline_sales',\n  creation_sequence: ['pipeline_sales', 'pipeline_stage', 'lead', 'deal', 'account', 'contact', 'quote_document', 'subscription', 'invoice', 'forecast'],\n  patterns: [\n    {\n      name: 'Sales Pipeline',\n      description: 'Pipelines qualify leads, leads become accounts, accounts negotiate deals that progress through pipeline stages and convert to subscriptions',\n      entity_types: ['pipeline_sales', 'lead', 'account', 'deal', 'pipeline_stage', 'subscription'],\n      edge_chain: ['pipeline_sales_qualifies_lead', 'lead_becomes_account', 'account_negotiates_deal', 'deal_at_pipeline_stage', 'pipeline_sales_converts_to_subscription'],\n    },\n    {\n      name: 'Enterprise Buying Committee',\n      description: 'An enterprise deal is a months-long coordination effort, not a forecast row. Attach the decision-making unit directly to the deal (each contact carries a buying_role: champion, economic buyer, technical evaluator, procurement, detractor), then wire the gauntlet the deal must clear: objections it faces, the security review that gates it, and the contract it closes via. A deal with no champion and no economic buyer mapped is single-threaded and at risk.',\n      entity_types: ['deal', 'contact', 'objection', 'security_review', 'contract'],\n      edge_chain: ['account_negotiates_deal', 'deal_involves_contact', 'deal_challenged_by_objection', 'deal_gated_by_security_review', 'deal_closed_via_contract'],\n    },\n    {\n      name: 'Win/Loss Learning Loop',\n      description: 'Close the pre-sale learning loop the way the post-sale one already closes (support_ticket reveals need). A deal is armed with a competitive battlecard; when it is lost to a competitor, a win/loss research_study analyses it. This gives competitive_battle_card.win_rate a derivation path (nothing could compute it before) and turns lost deals into structured competitive intelligence rather than a note in a closed record.',\n      entity_types: ['deal', 'competitive_battle_card', 'competitor', 'research_study'],\n      edge_chain: ['deal_armed_with_competitive_battle_card', 'deal_lost_to_competitor', 'research_study_analyzes_deal'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'lead_sourced_from_acquisition_channel', target_domain: 'growth', when: 'Track where leads come from for attribution' },\n    { edge_type: 'subscription_subscribes_to_pricing_tier', target_domain: 'pricing', when: 'Subscriptions should link to the tier purchased' },\n    { edge_type: 'account_partners_via_partnership', target_domain: 'business_model', when: 'Partner accounts should link to the partnership entity' },\n    { edge_type: 'deal_blocked_by_feature', target_domain: 'product_spec', when: 'When a roadmap gap holds up pipeline, link the deal to the blocking feature so \"which features unblock how much revenue\" is queryable' },\n    { edge_type: 'account_implements_via_project', target_domain: 'program_mgmt', when: 'Post-sale onboarding/implementation reuses the program-management machinery (project/milestone/deliverable), scoped to the account' },\n  ],\n  anti_patterns: [\n    { description: 'Deals without pipeline stages: every deal needs a current position in the pipeline' },\n    { description: 'Leads without source attribution. Attribution drives channel optimisation.' },\n    { description: 'Forecasts without probability: weight deals by likelihood to close' },\n    { name: 'Single-threaded enterprise deal', description: 'An enterprise deal with no contacts attached (deal_involves_contact) or no champion/economic_buyer among their buying_role values is single-threaded: the whole relationship rests on one unmapped person. Attach the buying committee and map at least the champion and economic buyer.', affected_entity: 'deal', remediation: 'Create deal_involves_contact edges to the committee and set each contact\\'s buying_role.' },\n    { name: 'Won/lost recorded only as a phase', description: 'The deal outcome (won/lost/no_decision) is an Event-axis fact and belongs on deal_outcome, not conflated with the lifecycle status. A lost deal with no deal_lost_to_competitor edge also strands the competitive signal that competitive_battle_card.win_rate depends on.', affected_entity: 'deal', remediation: 'Set deal_outcome, and on a loss create deal_lost_to_competitor plus a win/loss research_study via research_study_analyzes_deal.' },\n  ],\n}\n\nconst MARKETING_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'marketing',\n  anchor_entity: 'marketing_strategy',\n  creation_sequence: ['marketing_strategy', 'marketing_channel', 'marketing_campaign_plan', 'email_sequence', 'social_post', 'ad_creative', 'seo_keyword', 'press_release', 'event', 'community_initiative'],\n  patterns: [\n    {\n      name: 'Campaign Execution Chain',\n      description: 'Strategy activates channels, channels run campaigns, campaigns publish creative across formats',\n      entity_types: ['marketing_strategy', 'marketing_channel', 'marketing_campaign_plan', 'ad_creative'],\n      edge_chain: ['marketing_strategy_activates_marketing_channel', 'marketing_channel_runs_marketing_campaign_plan', 'marketing_campaign_plan_runs_ad_creative'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'marketing_strategy_pursues_outcome', target_domain: 'strategy', when: 'Marketing strategy should connect to strategic outcomes' },\n    { edge_type: 'marketing_channel_feeds_acquisition_channel', target_domain: 'growth', when: 'Marketing channels should feed growth acquisition channels' },\n    { edge_type: 'marketing_campaign_plan_targets_behavioral_segment', target_domain: 'growth', when: 'Campaigns should target specific user segments' },\n  ],\n  anti_patterns: [\n    { description: 'Campaigns without channels: every campaign runs on specific channels' },\n    { description: 'Channels without budget: allocate and track spend per channel' },\n    { description: 'Marketing without growth connection: marketing feeds the funnel, connect them' },\n  ],\n}\n\n// ─── Ring 5: Operate ────────────────────────────────────────────────────────\n\nconst CUSTOMER_SUCCESS_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'customer_success',\n  anchor_entity: 'customer_health_score',\n  // `nps_campaign` previously appeared here but is registered to the\n  // `feedback` domain. Customer success references NPS via cross-domain\n  // bridges, not direct ownership. (UPG-516)\n  creation_sequence: ['customer_health_score', 'playbook', 'service_level_agreement', 'support_ticket', 'customer_feedback', 'churn_reason', 'customer_journey_stage', 'touchpoint', 'success_milestone', 'service_blueprint'],\n  patterns: [\n    {\n      name: 'Health-Driven Playbook Activation',\n      description: 'Health scores trigger playbooks that target customer journey stages, customer feedback reveals churn reasons that inform the next playbook',\n      entity_types: ['customer_health_score', 'playbook', 'customer_journey_stage', 'customer_feedback', 'churn_reason'],\n      edge_chain: ['playbook_triggered_by_customer_health_score', 'playbook_targets_customer_journey_stage', 'customer_feedback_reveals_churn_reason'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'customer_health_score_composed_of_metric', target_domain: 'strategy', when: 'Health scores should be composed of measurable metrics' },\n    { edge_type: 'service_level_agreement_measures_metric', target_domain: 'strategy', when: 'SLAs should connect to the metrics they measure' },\n    { edge_type: 'customer_feedback_becomes_feature_request', target_domain: 'feedback', when: 'Feedback signals should flow into feature requests where they can be prioritised' },\n  ],\n  anti_patterns: [\n    { description: 'Health scores without components: define which metrics compose the score' },\n    { description: 'Playbooks without triggers: specify what conditions activate each playbook' },\n    { description: 'Churn reasons without analysis: understand patterns, not just individual cases' },\n    { description: 'Conflating the two journey models (UPG-675). customer_journey_stage models the post-sale AARRR lifecycle (a customer-success timeline; use stage_order to sequence stages); journey_phase models in-product experience phases of a single user_journey. They are different lenses, not duplicates. Likewise, the touchpoint entity is the cross-channel customer-success layer, distinct from the in-product journey_action.' },\n  ],\n}\n\nconst CONTENT_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'content',\n  anchor_entity: 'content_piece',\n  // `changelog` previously appeared here but is registered to the\n  // `product_spec` domain (it is a release artefact). Content references\n  // it only via cross-domain links; the canonical home is product_spec.\n  // (UPG-516)\n  creation_sequence: ['content_piece', 'knowledge_base_article', 'document', 'content_calendar', 'content_theme', 'documentation_template'],\n  patterns: [\n    {\n      name: 'Editorial Pipeline',\n      description: 'Strategy is themed, calendars organise themes and schedule pieces, pieces support messaging',\n      entity_types: ['content_strategy', 'content_theme', 'content_calendar', 'content_piece', 'messaging'],\n      edge_chain: ['content_strategy_themed_by_content_theme', 'content_calendar_contains_content_theme', 'content_calendar_schedules_content_piece', 'content_piece_supports_messaging'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'content_piece_supports_messaging', target_domain: 'go_to_market', when: 'Content should reinforce GTM messaging (which in turn ladders up to positioning)' },\n    { edge_type: 'knowledge_base_article_documents_feature', target_domain: 'product_spec', when: 'Help articles should link to the features they explain' },\n  ],\n  anti_patterns: [\n    { description: 'Content without themes. Authority compounds when content stays on theme.' },\n    { description: 'Knowledge bases without feature links: help articles must stay current with the product' },\n    { description: 'Documents without types: always classify the document purpose (RFC, guide, spec, etc.)' },\n  ],\n}\n\nconst EDUCATION_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'education',\n  anchor_entity: 'education_program',\n  creation_sequence: ['education_program', 'tutorial', 'walkthrough', 'webinar', 'certification', 'help_video', 'learning_path'],\n  patterns: [\n    {\n      name: 'Learning Path',\n      description: 'Programs structure via learning paths, paths contain tutorials and include certifications',\n      entity_types: ['education_program', 'learning_path', 'tutorial', 'certification'],\n      edge_chain: ['education_program_structures_via_learning_path', 'learning_path_contains_tutorial', 'learning_path_includes_certification'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'education_program_targets_persona', target_domain: 'user', when: 'Programs should target specific user personas' },\n    { edge_type: 'tutorial_explains_feature', target_domain: 'product_spec', when: 'Tutorials should link to the features they explain' },\n  ],\n  anti_patterns: [\n    { description: 'Programs without audience: define who this education is for' },\n    { description: 'Tutorials without the feature they teach: keep learning content connected to the product' },\n    { description: 'Certifications without assessment: verify learning, do not just award badges' },\n  ],\n}\n\n// ─── Ring 6: Extend ─────────────────────────────────────────────────────────\n\nconst TEAM_ORG_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'team_org',\n  anchor_entity: 'team',\n  creation_sequence: ['team', 'role', 'stakeholder', 'person', 'team_okr', 'retrospective', 'dependency', 'department', 'skill', 'ceremony', 'capacity_plan'],\n  patterns: [\n    {\n      name: 'Team Structure',\n      description: 'Teams are staffed with roles, target OKRs, reflect in retrospectives, and are blocked by dependencies',\n      entity_types: ['team', 'role', 'team_okr', 'retrospective', 'dependency'],\n      edge_chain: ['team_staffed_with_role', 'team_targets_team_okr', 'team_reflects_in_retrospective', 'dependency_blocks_team'],\n    },\n    {\n      name: 'Org Nesting',\n      description: 'A department contains its teams; a parent team contains its sub-teams or squads one level deeper. Keep a sub-team in the same department as its parent team. Cross-department reporting lines are modelled at the individual level with person_reports_to_person, not by nesting a team under a parent in another department.',\n      entity_types: ['department', 'team'],\n      edge_chain: ['department_contains_team', 'team_contains_team'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'node_owned_by_team', target_domain: 'product_spec', when: 'Features and epics should have team ownership' },\n    { edge_type: 'team_okr_aligns_with_objective', target_domain: 'strategy', when: 'Team OKRs should align with product-level objectives' },\n  ],\n  anti_patterns: [\n    { description: 'Teams without OKRs: every team needs clear goals' },\n    { description: 'Dependencies without both teams linked: a dependency must connect blocker and blocked' },\n    { description: 'Retrospectives without action items: reflection without action is just venting' },\n    { description: 'Nesting a sub-team under a parent team in a different department: a team_contains_team nesting should stay within one department (both teams sharing a department_contains_team parent). A cross-department nesting is almost always a modelling error; model a cross-department reporting line at the individual level with person_reports_to_person instead.' },\n    { description: 'Double-modelling the org as product_area and team_org: a product_area is the classification axis ON products (which area a product belongs to, the axis used to group products); a team_org department/team is the people structure (the org chart, who reports to whom). Use product_area to classify products and department/team for the org chart, and relate them through the team that owns an area rather than restating one as the other.' },\n  ],\n}\n\nconst PROGRAM_MGMT_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'program_mgmt',\n  anchor_entity: 'program',\n  creation_sequence: ['program', 'project', 'milestone', 'risk_register', 'change_request', 'deliverable', 'resource_allocation', 'status_report'],\n  patterns: [\n    {\n      name: 'Program Execution',\n      description: 'Programs contain projects, projects target milestones, milestones gate deliverables, programs are tracked via risk registers',\n      entity_types: ['program', 'project', 'milestone', 'deliverable', 'risk_register'],\n      edge_chain: ['program_contains_project', 'project_targets_milestone', 'milestone_gates_deliverable', 'program_tracked_via_risk_register'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'program_implements_initiative', target_domain: 'strategy', when: 'Programs should implement strategic initiatives' },\n    { edge_type: 'dependency_blocks_team', target_domain: 'team_org', when: 'Cross-team dependencies should be visible as blockers to the team that owns them' },\n  ],\n  anti_patterns: [\n    { description: 'Programs without milestones: define checkpoints to measure progress' },\n    { description: 'Risk registers without risk assessments: quantify likelihood and impact' },\n    { description: 'Change requests without approval tracking: document who approved what and when' },\n  ],\n}\n\nconst LOCALISATION_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'localisation',\n  anchor_entity: 'locale',\n  creation_sequence: ['locale', 'translation_key', 'translation_bundle', 'locale_config', 'cultural_adaptation', 'regional_pricing'],\n  patterns: [\n    {\n      name: 'Localisation Pipeline',\n      description: 'Locales translated via translation bundles, bundles contain translation keys',\n      entity_types: ['locale', 'translation_key', 'translation_bundle'],\n      edge_chain: ['locale_translated_via_translation_bundle', 'translation_bundle_contains_translation_key'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'cultural_adaptation_targets_market_segment', target_domain: 'market_intelligence', when: 'Cultural adaptations should link to the markets they serve' },\n    { edge_type: 'pricing_tier_localised_as_regional_pricing', target_domain: 'pricing', when: 'Pricing tiers should localise into regional pricing per market' },\n  ],\n  anti_patterns: [\n    { description: 'Locales without translation bundles: a locale without strings is just a flag' },\n    { description: 'Cultural adaptations without rationale: document why an adaptation is needed' },\n    { description: 'Regional pricing without market research: price sensitivity varies by region' },\n  ],\n}\n\nconst ECOSYSTEM_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'ecosystem',\n  anchor_entity: 'partner_program',\n  creation_sequence: ['partner_program', 'partner_tier', 'api_ecosystem', 'marketplace_listing', 'developer_portal', 'integration_partner', 'partner_revenue_share'],\n  patterns: [\n    {\n      name: 'Partner Ecosystem',\n      description: 'Programs tier partners, tiers qualify integration partners, API ecosystems expose marketplace listings',\n      entity_types: ['partner_program', 'partner_tier', 'integration_partner', 'api_ecosystem', 'marketplace_listing'],\n      edge_chain: ['partner_program_tiers_as_partner_tier', 'partner_tier_qualifies_integration_partner', 'partner_program_exposes_api_ecosystem', 'api_ecosystem_lists_marketplace_listing'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'integration_partner_connects_external_api', target_domain: 'engineering', when: 'Partner integrations connect to engineering through external APIs' },\n    { edge_type: 'revenue_stream_tiered_as_pricing_tier', target_domain: 'pricing', when: 'Partner revenue streams should connect to pricing tiers' },\n  ],\n  anti_patterns: [\n    { description: 'Partner programs without tiers: define what partners get at each level' },\n    { description: 'Marketplace listings without review process: quality control matters' },\n    { description: 'Developer portals without documentation: APIs need docs to drive adoption' },\n  ],\n}\n\nconst COMPLIANCE_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'compliance',\n  anchor_entity: 'compliance_framework',\n  creation_sequence: ['compliance_framework', 'compliance_requirement', 'risk', 'data_contract', 'security_audit', 'audit_log_policy'],\n  patterns: [\n    {\n      name: 'Compliance Chain',\n      description: 'Frameworks mandate requirements, frameworks are verified by security audits, frameworks identify risks that constrain what you can build',\n      entity_types: ['compliance_framework', 'compliance_requirement', 'security_audit', 'risk'],\n      edge_chain: ['compliance_framework_mandates_compliance_requirement', 'compliance_framework_verified_by_security_audit', 'compliance_framework_identifies_risk'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'compliance_framework_requires_security_control', target_domain: 'security', when: 'Compliance requirements should map to security controls' },\n    { edge_type: 'audit_log_policy_tracks_event_schema', target_domain: 'data_analytics', when: 'Audit policies should specify which events are logged' },\n    { edge_type: 'data_contract_governs_data_source', target_domain: 'data_analytics', when: 'Data contracts should connect to the sources they govern' },\n  ],\n  anti_patterns: [\n    { description: 'Compliance without a framework: always specify which standard you are working toward' },\n    { description: 'Requirements without audit evidence: compliance claims need proof' },\n    { description: 'Data contracts without both parties: a contract binds a provider and consumer' },\n  ],\n}\n\n// ─── Nucleus ────────────────────────────────────────────────────────────────\n\nconst PORTFOLIO_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'portfolio',\n  anchor_entity: 'organization',\n  creation_sequence: ['organization', 'portfolio', 'product_area'],\n  patterns: [\n    {\n      name: 'Portfolio Hierarchy',\n      description: 'Organisation invests in portfolios, portfolios contain products, product areas organise ownership across the org',\n      entity_types: ['organization', 'portfolio', 'product', 'product_area'],\n      edge_chain: ['organization_invests_via_portfolio', 'portfolio_contains_product', 'organization_organised_into_product_area', 'product_area_contains_product'],\n    },\n  ],\n  required_bridges: [\n    { edge_type: 'product_area_contains_product', target_domain: 'strategy', when: 'Product areas should contain the products they manage' },\n  ],\n  anti_patterns: [\n    { description: 'Products without a product area: every product should be classified' },\n    { description: 'Portfolios without strategic alignment: portfolio decisions should reflect strategy' },\n    { description: 'Confusing product_area with the org chart: product_area is the classification axis on products (how products are grouped), not the people structure. Model who reports to whom with team_org department/team; relate the two through the team that owns an area.' },\n  ],\n}\n\nconst WORKSPACE_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'workspace',\n  anchor_entity: 'workspace',\n  creation_sequence: ['workspace', 'framework_exercise', 'composition', 'capture'],\n  patterns: [\n    {\n      name: 'Canvas to published view',\n      description: 'A workspace arranges the entities being thought about, produces the composition published from it, and the composition names what it focuses on so the published view stays answerable to the graph',\n      entity_types: ['workspace', 'composition'],\n      edge_chain: ['workspace_arranges_node', 'workspace_produced_node', 'composition_focuses_node'],\n    },\n  ],\n  required_bridges: [],\n  anti_patterns: [\n    { description: 'Workspaces are containers for exploration: do not over-structure them' },\n    { description: 'Workspace content is transient by default: promote discoveries to the graph, do not leave them in the workspace' },\n    { description: 'Treating a canvas arrangement as structure: a workspace_arranges_node edge says where a card sits, never what contains what. The arranged entity keeps its real parent' },\n    { description: 'Writing every scratch canvas into a shared graph: only a workspace someone deliberately kept (retention: durable) belongs in a file other people pull' },\n  ],\n}\n\nconst FOUNDATIONS_GUIDE: UPGDomainUsageGuide = {\n  domain_id: 'foundations',\n  anchor_entity: 'specification',\n  creation_sequence: ['specification', 'primitive', 'operating_lifecycle', 'operating_stage'],\n  patterns: [\n    {\n      name: 'Specification defines primitives',\n      description: 'A specification governs one or more primitives; each primitive is defined_by the spec and may compose other primitives',\n      entity_types: ['specification', 'primitive'],\n      edge_chain: ['primitive_defined_by_specification', 'primitive_composes_primitive'],\n    },\n  ],\n  required_bridges: [],\n  anti_patterns: [\n    { description: 'A specification scattered as duplicate features across products instead of one canonical with instance_of links' },\n    { description: 'Modelling a governed spec as a product: it has no single owner, P&L, or buyer; it is the rulebook products point at' },\n  ],\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────────\n\nexport const UPG_DOMAIN_GUIDES: readonly UPGDomainUsageGuide[] = [\n  // Nucleus\n  PORTFOLIO_GUIDE,\n  WORKSPACE_GUIDE,\n  // Foundations (0.9.12)\n  FOUNDATIONS_GUIDE,\n  // Ring 1: Understand\n  USER_GUIDE,\n  USER_RESEARCH_GUIDE,\n  MARKET_INTELLIGENCE_GUIDE,\n  DISCOVERY_GUIDE,\n  VALIDATION_GUIDE,\n  FEEDBACK_GUIDE,\n  // Ring 2: Define\n  STRATEGY_GUIDE,\n  PRODUCT_SPEC_GUIDE,\n  UX_DESIGN_GUIDE,\n  DESIGN_SYSTEM_GUIDE,\n  BRAND_GUIDE,\n  LEGAL_GUIDE,\n  // Ring 3: Build\n  ENGINEERING_GUIDE,\n  DEVOPS_GUIDE,\n  TESTING_GUIDE,\n  SECURITY_GUIDE,\n  ACCESSIBILITY_GUIDE,\n  DATA_ANALYTICS_GUIDE,\n  AI_GUIDE,\n  AUTOMATION_GUIDE,\n  // Ring 4: Grow\n  BUSINESS_MODEL_GUIDE,\n  GROWTH_GUIDE,\n  GTM_GUIDE,\n  PRICING_GUIDE,\n  SALES_GUIDE,\n  MARKETING_GUIDE,\n  // Ring 5: Operate\n  CUSTOMER_SUCCESS_GUIDE,\n  CONTENT_GUIDE,\n  EDUCATION_GUIDE,\n  // Ring 6: Extend\n  TEAM_ORG_GUIDE,\n  PROGRAM_MGMT_GUIDE,\n  LOCALISATION_GUIDE,\n  ECOSYSTEM_GUIDE,\n  COMPLIANCE_GUIDE,\n]\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Look up the usage guide for a domain.\n *\n * @example\n * const guide = getGuideForDomain('user')\n * // guide?.anchor_entity     === 'persona'\n * // guide?.creation_sequence === ['persona', 'job', 'need', ...]\n *\n * @example\n * getGuideForDomain('not_a_domain')   // → undefined\n */\nexport function getGuideForDomain(domainId: UPGDomainId | string): UPGDomainUsageGuide | undefined {\n  return UPG_DOMAIN_GUIDES.find((g) => g.domain_id === domainId)\n}\n\n/**\n * Get the anchor entity for a domain (the entity you create first).\n *\n * @example\n * getAnchorEntity('user')                 // → 'persona'\n * getAnchorEntity('market_intelligence')  // → 'competitive_analysis'\n * getAnchorEntity('not_a_domain')         // → undefined\n */\nexport function getAnchorEntity(domainId: UPGDomainId | string): UPGEntityType | undefined {\n  return getGuideForDomain(domainId)?.anchor_entity\n}\n\n/**\n * Get all anti-patterns across all domains, flattened and tagged by domain.\n *\n * @example\n * const all = getAntiPatterns()\n * // all[0].domain                   === 'user'\n * // all[0].anti_pattern.name        === 'persona_without_jobs' (example)\n * // all.length                      // one entry per anti-pattern across all guides\n */\nexport function getAntiPatterns(): Array<{ domain: UPGDomainId; anti_pattern: UPGAntiPattern }> {\n  return UPG_DOMAIN_GUIDES.flatMap((g) =>\n    g.anti_patterns.map((ap) => ({ domain: g.domain_id, anti_pattern: ap }))\n  )\n}\n","/**\n * UPG Benchmark type definitions.\n */\n\nimport type { UPGEntityType } from '../../catalog/entity-catalog.js'\nimport type { UPGDomainId } from '../../registry/domains.js'\nimport type { UPGProductStage } from '../../shapes/document.js'\n\n// ─── Benchmark source: controlled vocabulary ────────────────────────\n\n/**\n * Where a benchmark's range or expectation comes from.\n *\n * Structured so consumers can do \"show me every Lean Startup benchmark\" or\n * \"show me every industry-standard DevOps expectation\" without regex-matching\n * against free-form strings. Each variant carries enough metadata to render\n * the citation inline without further lookup.\n *\n * @example { kind: 'book', citation: 'The Lean Startup, Eric Ries (2011), ch. 7' }\n * @example { kind: 'practitioner', attribution: 'Teresa Torres, Continuous Discovery Habits' }\n * @example { kind: 'industry_practice', category: 'devops' }\n * @example { kind: 'fundamental' }\n */\nexport type UPGBenchmarkSource =\n  /** Cited from a named book or published work. */\n  | { kind: 'book'; citation: string }\n  /** Attributed to a specific practitioner or method author. */\n  | { kind: 'practitioner'; attribution: string }\n  /**\n   * Generally accepted industry practice rather than one citation.\n   * `category` groups the benchmark by discipline (agile, devops, security,\n   * voice_of_customer, etc.) so consumers can filter by space.\n   */\n  | { kind: 'industry_practice'; category: string }\n  /** Definitional: true by the spec's own construction, not externally sourced. */\n  | { kind: 'fundamental' }\n\n// Canonical product stages re-exported for consumer convenience.\nexport type { UPGProductStage } from '../../shapes/document.js'\n\n/** Ordered stages from earliest to latest (canonical 9-stage model) */\nexport const UPG_PRODUCT_STAGES = [\n  'concept', 'validation', 'build', 'beta', 'launch',\n  'growth', 'mature', 'maintenance', 'sunset',\n] as const satisfies readonly UPGProductStage[]\n\n// Type-level guard: the runtime tuple must exhaustively cover UPGProductStage.\n// If a stage is added to UPGProductStage in shapes/document.ts without being\n// added to UPG_PRODUCT_STAGES above (or vice versa), one of these lines fails.\ntype _UPGProductStagesMissing = Exclude<UPGProductStage, typeof UPG_PRODUCT_STAGES[number]>\ntype _UPGProductStagesExtra = Exclude<typeof UPG_PRODUCT_STAGES[number], UPGProductStage>\nconst _assertStagesComplete: [_UPGProductStagesMissing] extends [never] ? true : never = true\nconst _assertStagesNoExtra: [_UPGProductStagesExtra] extends [never] ? true : never = true\nvoid _assertStagesComplete\nvoid _assertStagesNoExtra\n\nexport type StageRange = { min: number; max: number } | null\n\nexport interface CountBenchmark {\n  /** The entity type this benchmark applies to */\n  type: UPGEntityType\n  /** The domain this entity type belongs to */\n  domain: UPGDomainId\n  /** Expected range per stage. null = not expected at this stage */\n  concept: StageRange\n  /** Expected count range at the validation stage */\n  validation: StageRange\n  /** Expected count range at the build stage */\n  build: StageRange\n  /** Expected count range at the beta stage */\n  beta: StageRange\n  /** Expected count range at the launch stage */\n  launch: StageRange\n  /** Expected count range at the growth stage */\n  growth: StageRange\n  /** Expected count range at the mature stage */\n  mature: StageRange\n  /** Expected count range at the maintenance stage */\n  maintenance: StageRange\n  /** Expected count range at the sunset stage */\n  sunset: StageRange\n  /** Attribution for this benchmark's expected ranges */\n  source: UPGBenchmarkSource\n  /** Why this benchmark exists and how the ranges were determined */\n  rationale: string\n}\n\nexport interface RelationshipBenchmark {\n  /** The parent entity type in the relationship */\n  parent_type: UPGEntityType\n  /** The child entity type connected to the parent */\n  child_type: UPGEntityType\n  /** Minimum children per parent */\n  min_per_parent: number\n  /** Stages where this relationship is expected */\n  stages: UPGProductStage[]\n  /** Attribution for this benchmark's expected relationship counts */\n  source: UPGBenchmarkSource\n  /** Why this relationship benchmark exists and how the threshold was set */\n  rationale: string\n}\n\nexport interface RatioBenchmark {\n  /** Human-readable identifier for this ratio (e.g. \"hypothesis-to-experiment\") */\n  name: string\n  /** Entity type(s) forming the numerator of the ratio */\n  numerator_type: UPGEntityType | UPGEntityType[]\n  /** Entity type(s) forming the denominator of the ratio */\n  denominator_type: UPGEntityType | UPGEntityType[]\n  /** Minimum acceptable ratio value. Below this signals an imbalance. */\n  expected_min: number\n  /** Stages where this ratio is meaningful and should be evaluated */\n  stages: UPGProductStage[]\n  /** Attribution for this ratio benchmark */\n  source: UPGBenchmarkSource\n  /** Why this ratio matters and how the minimum was determined */\n  rationale: string\n}\n\nexport interface DomainActivation {\n  /** The domain being activated */\n  domain_id: UPGDomainId\n  /** At which stage should this domain have at least 1 entity? */\n  expected_from: UPGProductStage\n  /** At which stage should this domain be well-populated? */\n  expected_mature: UPGProductStage\n  /** Attribution for this domain activation expectation */\n  source: UPGBenchmarkSource\n  /** Why this domain activation timing is expected */\n  rationale: string\n}\n","/**\n * Per-entity-type expected counts across the canonical 9-stage product journey.\n *\n * Each row binds an entity type (+ its domain) to a `StageRange` for every\n * stage from `concept` → `sunset`. A `null` range marks \"not expected at this\n * stage\". Ranges are sourced from product-management literature (JTBD, OST,\n * Lean Startup, BMC, etc.); the `source` column on the interface attributes\n * each row.\n *\n * Consumers:\n * - Intelligence layer (`intelligence.ts`) → health scoring, gap detection\n * - Graph audits → flag entities missing at a given stage\n *\n * Benchmark shape: see `CountBenchmark` in `./types.ts`.\n *\n * @see ./types.ts `CountBenchmark`, `StageRange`, `UPG_PRODUCT_STAGES`\n * @see ../intelligence.ts health scoring consumer\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { CountBenchmark } from './types.js'\n\nexport const UPG_COUNT_BENCHMARKS: CountBenchmark[] = [\n  {\n    \"type\": \"product\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"sunset\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"source\": {\"kind\":\"fundamental\"},\n    \"rationale\": \"Every graph needs exactly one product (or one per product area at scale).\"\n  },\n  {\n    \"type\": \"outcome\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 3,\n      \"max\": 7\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"sunset\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"source\": {\"kind\":\"book\",\"citation\":\"Measure What Matters (Doerr)\"},\n    \"rationale\": \"Outcomes are the \\\"why\\\" behind everything. Too few = unclear direction. Too many = diluted focus.\"\n  },\n  {\n    \"type\": \"objective\",\n    \"domain\": \"strategy\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"mature\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"maintenance\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Measure What Matters (Doerr)\"},\n    \"rationale\": \"Objectives give teams direction. Not needed at idea stage; outcomes suffice.\"\n  },\n  {\n    \"type\": \"key_result\",\n    \"domain\": \"strategy\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 4\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"beta\": {\n      \"min\": 3,\n      \"max\": 11\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"growth\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 8,\n      \"max\": 30\n    },\n    \"maintenance\": {\n      \"min\": 8,\n      \"max\": 30\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Measure What Matters (Doerr)\"},\n    \"rationale\": \"2-4 key results per objective is the sweet spot.\"\n  },\n  {\n    \"type\": \"metric\",\n    \"domain\": \"strategy\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 10\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 30\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 30\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Analytics (Croll)\"},\n    \"rationale\": \"Track what matters. At MVP, focus on 1 metric that matters (OMTM).\"\n  },\n  {\n    \"type\": \"vision\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Inspired (Cagan)\"},\n    \"rationale\": \"One vision. Clear and unchanging (the mission may evolve, the vision stays).\"\n  },\n  {\n    \"type\": \"mission\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Inspired (Cagan)\"},\n    \"rationale\": \"Mission articulates how you pursue the vision.\"\n  },\n  {\n    \"type\": \"strategic_theme\",\n    \"domain\": \"strategy\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": null,\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"launch\": null,\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"mature\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"maintenance\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"cascading_strategy\"},\n    \"rationale\": \"Themes organize initiatives. Premature before growth stage.\"\n  },\n  {\n    \"type\": \"initiative\",\n    \"domain\": \"strategy\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 7\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"practitioner\",\"attribution\":\"Teresa Torres\"},\n    \"rationale\": \"Initiatives are the big bets. 1-3 at MVP keeps focus.\"\n  },\n  {\n    \"type\": \"assumption\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"validation\": {\n      \"min\": 4,\n      \"max\": 13\n    },\n    \"build\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 13\n    },\n    \"launch\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"mature\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"maintenance\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Early stage should have MORE assumptions; they decrease as you validate.\"\n  },\n  {\n    \"type\": \"decision\",\n    \"domain\": \"strategy\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 3\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 7\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"architecture_decisions\"},\n    \"rationale\": \"Decisions accumulate. Recording them creates institutional memory.\"\n  },\n  {\n    \"type\": \"persona\",\n    \"domain\": \"user\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"beta\": {\n      \"min\": 3,\n      \"max\": 5\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 6\n    },\n    \"mature\": {\n      \"min\": 4,\n      \"max\": 10\n    },\n    \"maintenance\": {\n      \"min\": 4,\n      \"max\": 10\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Crossing the Chasm (Moore)\"},\n    \"rationale\": \"Start narrow (1 beachhead persona). Expand as you find fit.\"\n  },\n  {\n    \"type\": \"job\",\n    \"domain\": \"user\",\n    \"concept\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"validation\": {\n      \"min\": 3,\n      \"max\": 9\n    },\n    \"build\": {\n      \"min\": 4,\n      \"max\": 12\n    },\n    \"beta\": {\n      \"min\": 6,\n      \"max\": 19\n    },\n    \"launch\": {\n      \"min\": 4,\n      \"max\": 12\n    },\n    \"growth\": {\n      \"min\": 8,\n      \"max\": 25\n    },\n    \"mature\": {\n      \"min\": 15,\n      \"max\": 50\n    },\n    \"maintenance\": {\n      \"min\": 15,\n      \"max\": 50\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"JTBD (Christensen)\"},\n    \"rationale\": \"2-4 JTBDs per persona. Jobs are the demand side; they drive everything.\"\n  },\n  {\n    \"type\": \"need\",\n    \"domain\": \"user\",\n    \"concept\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"validation\": {\n      \"min\": 3,\n      \"max\": 12\n    },\n    \"build\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 6,\n      \"max\": 20\n    },\n    \"launch\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 8,\n      \"max\": 25\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"design_thinking\"},\n    \"rationale\": \"Needs have valence (pain, gap, desire, constraint). Surfaces opportunities: more needs = more signal.\"\n  },\n  {\n    \"type\": \"desired_outcome\",\n    \"domain\": \"user\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 4\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"beta\": {\n      \"min\": 3,\n      \"max\": 12\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"growth\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 6,\n      \"max\": 25\n    },\n    \"maintenance\": {\n      \"min\": 6,\n      \"max\": 25\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"ODI (Ulwick)\"},\n    \"rationale\": \"Desired outcomes are what users measure success by.\"\n  },\n  {\n    \"type\": \"opportunity\",\n    \"domain\": \"discovery\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"mature\": {\n      \"min\": 8,\n      \"max\": 30\n    },\n    \"maintenance\": {\n      \"min\": 8,\n      \"max\": 30\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Opportunities are the bridge between user needs and solutions. Core of continuous discovery.\"\n  },\n  {\n    \"type\": \"solution\",\n    \"domain\": \"discovery\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 12\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 8,\n      \"max\": 25\n    },\n    \"maintenance\": {\n      \"min\": 8,\n      \"max\": 25\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Multiple solutions per opportunity. Explore before committing.\"\n  },\n  {\n    \"type\": \"hypothesis\",\n    \"domain\": \"validation\",\n    \"concept\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"validation\": {\n      \"min\": 3,\n      \"max\": 12\n    },\n    \"build\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 6,\n      \"max\": 20\n    },\n    \"launch\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 8,\n      \"max\": 25\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Everything is a hypothesis until tested. More at early stages, fewer (but bigger) at scale.\"\n  },\n  {\n    \"type\": \"experiment_run\",\n    \"domain\": \"validation\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 13\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"maintenance\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Each hypothesis needs an experiment. Speed of learning = speed of progress.\"\n  },\n  {\n    \"type\": \"learning\",\n    \"domain\": \"validation\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 6,\n      \"max\": 15\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 8,\n      \"max\": 20\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 30\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 30\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Learnings are the output of experiments. They should accumulate over time.\"\n  },\n  {\n    \"type\": \"competitor\",\n    \"domain\": \"market_intelligence\",\n    \"concept\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 3,\n      \"max\": 7\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 10\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 12\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"competitive_analysis\"},\n    \"rationale\": \"Know your landscape. 2-5 direct competitors minimum.\"\n  },\n  {\n    \"type\": \"research_study\",\n    \"domain\": \"user_research\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 2\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 4\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"The Mom Test (Fitzpatrick)\"},\n    \"rationale\": \"Talk to users. Even 5 interviews surface 80% of issues.\"\n  },\n  {\n    \"type\": \"insight\",\n    \"domain\": \"user_research\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 7,\n      \"max\": 23\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 10,\n      \"max\": 30\n    },\n    \"mature\": {\n      \"min\": 15,\n      \"max\": 50\n    },\n    \"maintenance\": {\n      \"min\": 15,\n      \"max\": 50\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"ux_research\"},\n    \"rationale\": \"Insights are the refined output of research. They inform everything.\"\n  },\n  {\n    \"type\": \"user_journey\",\n    \"domain\": \"ux_design\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"mature\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"maintenance\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"service_design\"},\n    \"rationale\": \"Map the emotional experience. One per persona is ideal.\"\n  },\n  {\n    \"type\": \"user_flow\",\n    \"domain\": \"ux_design\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"information_architecture\"},\n    \"rationale\": \"Task-level paths through the product. Critical for UX quality.\"\n  },\n  {\n    \"type\": \"screen\",\n    \"domain\": \"ux_design\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 10\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 7,\n      \"max\": 33\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"mature\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"maintenance\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"information_architecture\"},\n    \"rationale\": \"Every distinct UI surface. Grows with product complexity.\"\n  },\n  {\n    \"type\": \"design_component\",\n    \"domain\": \"ux_design\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 7\n    },\n    \"build\": {\n      \"min\": 0,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 5,\n      \"max\": 30\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"mature\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"maintenance\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Atomic Design (Frost)\"},\n    \"rationale\": \"Design system components. Build a system, not one-offs.\"\n  },\n  {\n    \"type\": \"feature\",\n    \"domain\": \"product_spec\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"validation\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 6,\n      \"max\": 20\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 8,\n      \"max\": 30\n    },\n    \"mature\": {\n      \"min\": 20,\n      \"max\": 100\n    },\n    \"maintenance\": {\n      \"min\": 20,\n      \"max\": 100\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"product_management\"},\n    \"rationale\": \"Features are the user-facing capabilities. MVP = minimum set.\"\n  },\n  {\n    \"type\": \"epic\",\n    \"domain\": \"product_spec\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 40\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Epics group related stories. Not needed at idea stage.\"\n  },\n  {\n    \"type\": \"user_story\",\n    \"domain\": \"product_spec\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 10\n    },\n    \"build\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"beta\": {\n      \"min\": 7,\n      \"max\": 33\n    },\n    \"launch\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"growth\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"mature\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"maintenance\": {\n      \"min\": 30,\n      \"max\": 200\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Stories are the unit of delivery. 3-5 per feature is typical.\"\n  },\n  {\n    \"type\": \"release\",\n    \"domain\": \"product_spec\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 25\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 25\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"release_management\"},\n    \"rationale\": \"Ship frequently. Releases track what went out and when.\"\n  },\n  {\n    \"type\": \"bounded_context\",\n    \"domain\": \"engineering\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"mature\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"maintenance\": {\n      \"min\": 4,\n      \"max\": 15\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Domain-Driven Design (Evans)\"},\n    \"rationale\": \"Bounded contexts define system boundaries. Start simple.\"\n  },\n  {\n    \"type\": \"service\",\n    \"domain\": \"engineering\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 6\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 25\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 25\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"microservices\"},\n    \"rationale\": \"Services are runtime components. Monolith first, split later.\"\n  },\n  {\n    \"type\": \"decision\",\n    \"domain\": \"engineering\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 2\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"build\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"beta\": {\n      \"min\": 4,\n      \"max\": 14\n    },\n    \"launch\": {\n      \"min\": 2,\n      \"max\": 8\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 20\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 50\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Release It (Nygard)\"},\n    \"rationale\": \"Document why you chose X over Y. Prevents relitigating decisions.\"\n  },\n  {\n    \"type\": \"technical_debt_item\",\n    \"domain\": \"engineering\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"build\": {\n      \"min\": 0,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 10\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 15\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 30\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 30\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"engineering\"},\n    \"rationale\": \"Track debt explicitly. It compounds if invisible.\"\n  },\n  {\n    \"type\": \"metric\",\n    \"domain\": \"growth\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Analytics (Croll)\"},\n    \"rationale\": \"One metric that matters. Maybe two at scale (leading + lagging).\"\n  },\n  {\n    \"type\": \"funnel\",\n    \"domain\": \"growth\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"mature\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"maintenance\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"practitioner\",\"attribution\":\"Dave McClure (AARRR)\"},\n    \"rationale\": \"At least one acquisition funnel. Add retention/referral funnels at growth.\"\n  },\n  {\n    \"type\": \"acquisition_channel\",\n    \"domain\": \"growth\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 4\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 7\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 5\n    },\n    \"growth\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"mature\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"maintenance\": {\n      \"min\": 5,\n      \"max\": 15\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Traction (Weinberg)\"},\n    \"rationale\": \"Start with 1-2 channels, expand as you find what works.\"\n  },\n  {\n    \"type\": \"business_model\",\n    \"domain\": \"business_model\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"One business model per product. Maybe 2 at scale (freemium + enterprise).\"\n  },\n  {\n    \"type\": \"value_proposition\",\n    \"domain\": \"business_model\",\n    \"concept\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"beta\": {\n      \"min\": 2,\n      \"max\": 4\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"growth\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"mature\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"maintenance\": {\n      \"min\": 3,\n      \"max\": 8\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"What unique value do you deliver? One per segment.\"\n  },\n  {\n    \"type\": \"revenue_stream\",\n    \"domain\": \"business_model\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"mature\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"maintenance\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"How money comes in. At least one by MVP.\"\n  },\n  {\n    \"type\": \"pricing_strategy\",\n    \"domain\": \"pricing\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"The Strategy and Tactics of Pricing (Nagle)\"},\n    \"rationale\": \"Deliberate pricing. By growth stage this must be explicit.\"\n  },\n  {\n    \"type\": \"positioning\",\n    \"domain\": \"go_to_market\",\n    \"concept\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"build\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"launch\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"Obviously Awesome (Dunford)\"},\n    \"rationale\": \"How are you different? One positioning statement minimum.\"\n  },\n  {\n    \"type\": \"ideal_customer_profile\",\n    \"domain\": \"go_to_market\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"gtm\"},\n    \"rationale\": \"Who are you selling to? Tighter ICP = better conversion.\"\n  },\n  {\n    \"type\": \"messaging\",\n    \"domain\": \"go_to_market\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"beta\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 1\n    },\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 3\n    },\n    \"mature\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"maintenance\": {\n      \"min\": 2,\n      \"max\": 5\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"book\",\"citation\":\"StoryBrand (Miller)\"},\n    \"rationale\": \"How you talk about your product. Persona-specific messaging at scale.\"\n  },\n  {\n    \"type\": \"content_strategy\",\n    \"domain\": \"content\",\n    \"concept\": null,\n    \"validation\": null,\n    \"build\": null,\n    \"beta\": null,\n    \"launch\": null,\n    \"growth\": {\n      \"min\": 1,\n      \"max\": 1\n    },\n    \"mature\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"maintenance\": {\n      \"min\": 1,\n      \"max\": 2\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"content_marketing\"},\n    \"rationale\": \"Systematic content by growth stage. Premature before product-market fit.\"\n  },\n  {\n    \"type\": \"feature_request\",\n    \"domain\": \"feedback\",\n    \"concept\": null,\n    \"validation\": {\n      \"min\": 1,\n      \"max\": 7\n    },\n    \"build\": {\n      \"min\": 0,\n      \"max\": 10\n    },\n    \"beta\": {\n      \"min\": 3,\n      \"max\": 20\n    },\n    \"launch\": {\n      \"min\": 0,\n      \"max\": 10\n    },\n    \"growth\": {\n      \"min\": 5,\n      \"max\": 30\n    },\n    \"mature\": {\n      \"min\": 10,\n      \"max\": 100\n    },\n    \"maintenance\": {\n      \"min\": 10,\n      \"max\": 100\n    },\n    \"sunset\": null,\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"voice_of_customer\"},\n    \"rationale\": \"Feature requests signal demand. Track them to spot patterns.\"\n  }\n]\n","/**\n * Expected parent → child relationship benchmarks (minimum connections that a\n * parent type should have to a given child type at the listed stages).\n *\n * Encodes wisdom like \"each persona should have at least 2 jobs\" (JTBD) or\n * \"each hypothesis should produce at least one learning\" (Lean Startup).\n * Relationship benchmarks are stage-scoped: a persona doesn't need 2 jobs\n * at `concept`, but does by `build`.\n *\n * Consumers:\n * - Intelligence layer → \"thin parent\" gap detection (e.g. personas missing\n *   jobs); flags shallow modelling during audits\n *\n * Benchmark shape: see `RelationshipBenchmark` in `./types.ts`.\n *\n * @see ./types.ts `RelationshipBenchmark`\n * @see ../intelligence.ts audit consumer\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { RelationshipBenchmark } from './types.js'\n\nexport const UPG_RELATIONSHIP_BENCHMARKS: RelationshipBenchmark[] = [\n  {\n    \"parent_type\": \"persona\",\n    \"child_type\": \"job\",\n    \"min_per_parent\": 2,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"JTBD (Christensen)\"},\n    \"rationale\": \"Each persona should have at least 2 jobs. One job = shallow understanding.\"\n  },\n  {\n    \"parent_type\": \"persona\",\n    \"child_type\": \"need\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"design_thinking\"},\n    \"rationale\": \"No pain = no urgency to switch. Every persona needs at least one pain point.\"\n  },\n  {\n    \"parent_type\": \"persona\",\n    \"child_type\": \"desired_outcome\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"ODI (Ulwick)\"},\n    \"rationale\": \"What does success look like for this persona?\"\n  },\n  {\n    \"parent_type\": \"job\",\n    \"child_type\": \"need\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"jtbd\"},\n    \"rationale\": \"Every job has friction. Surface it.\"\n  },\n  {\n    \"parent_type\": \"opportunity\",\n    \"child_type\": \"solution\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Every opportunity needs at least one solution explored.\"\n  },\n  {\n    \"parent_type\": \"need\",\n    \"child_type\": \"opportunity\",\n    \"min_per_parent\": 0,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Pain should surface opportunities. 0 is the minimum, but flag if many pains have no opportunities.\"\n  },\n  {\n    \"parent_type\": \"solution\",\n    \"child_type\": \"hypothesis\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Every solution is a bet. Make the bet explicit.\"\n  },\n  {\n    \"parent_type\": \"hypothesis\",\n    \"child_type\": \"experiment_run\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Test your bets. No experiment = no learning.\"\n  },\n  {\n    \"parent_type\": \"feature\",\n    \"child_type\": \"story_task\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Features should be broken into stories for delivery.\"\n  },\n  {\n    \"parent_type\": \"feature\",\n    \"child_type\": \"epic\",\n    \"min_per_parent\": 0,\n    \"stages\": [\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Large features become epics at scale.\"\n  },\n  {\n    \"parent_type\": \"bounded_context\",\n    \"child_type\": \"service\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Domain-Driven Design (Evans)\"},\n    \"rationale\": \"Each bounded context should have at least one service.\"\n  },\n  {\n    \"parent_type\": \"funnel\",\n    \"child_type\": \"funnel_step\",\n    \"min_per_parent\": 3,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"practitioner\",\"attribution\":\"Dave McClure (AARRR)\"},\n    \"rationale\": \"A funnel needs at least 3 steps to be meaningful.\"\n  },\n  {\n    \"parent_type\": \"business_model\",\n    \"child_type\": \"value_proposition\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"No value prop = no business model.\"\n  },\n  {\n    \"parent_type\": \"business_model\",\n    \"child_type\": \"revenue_stream\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"How does money come in? Must be explicit.\"\n  },\n  {\n    \"parent_type\": \"feature\",\n    \"child_type\": \"persona\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Inspired (Cagan)\"},\n    \"rationale\": \"Every feature should serve at least one persona. Otherwise: who is this for?\"\n  },\n  {\n    \"parent_type\": \"persona\",\n    \"child_type\": \"research_study\",\n    \"min_per_parent\": 0,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"The Mom Test (Fitzpatrick)\"},\n    \"rationale\": \"Personas without research are fiction. Flag but do not block.\"\n  },\n  {\n    \"parent_type\": \"outcome\",\n    \"child_type\": \"metric\",\n    \"min_per_parent\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Measure What Matters (Doerr)\"},\n    \"rationale\": \"Every outcome needs a measurable indicator.\"\n  }\n]\n","/**\n * Expected ratios between entity-type counts at given stages.\n *\n * Encodes relationships like \"learnings / hypotheses ≥ 1\" (every hypothesis\n * should yield at least one learning) or \"evidence per insight ≥ 1\" (no\n * untested insights).\n *\n * Numerator and denominator can be a single type or a union (e.g. the\n * \"evidence\" ratio counts `learning | observation | research_finding` against\n * insights). Ratios are stage-scoped because early stages should not be\n * penalised for not yet having collected evidence.\n *\n * Consumers:\n * - Intelligence layer → ratio-based health checks, \"untested assumption\"\n *   warnings\n *\n * Benchmark shape: see `RatioBenchmark` in `./types.ts`.\n *\n * @see ./types.ts `RatioBenchmark`\n * @see ../intelligence.ts ratio audit consumer\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { RatioBenchmark } from './types.js'\n\nexport const UPG_RATIO_BENCHMARKS: RatioBenchmark[] = [\n  {\n    \"name\": \"Hypothesis-to-Learning ratio\",\n    \"numerator_type\": \"learning\",\n    \"denominator_type\": \"hypothesis\",\n    \"expected_min\": 1,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Each hypothesis should produce at least one learning. If ratio <1, you have untested assumptions.\"\n  },\n  {\n    \"name\": \"Evidence density\",\n    \"numerator_type\": [\n      \"learning\",\n      \"insight\"\n    ],\n    \"denominator_type\": \"hypothesis\",\n    \"expected_min\": 0.5,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"discovery\"},\n    \"rationale\": \"Decisions should be backed by evidence, not intuition.\"\n  },\n  {\n    \"name\": \"Experiment rate\",\n    \"numerator_type\": \"experiment_run\",\n    \"denominator_type\": \"hypothesis\",\n    \"expected_min\": 0.8,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Most hypotheses should have experiments. 80%+ means you test your bets.\"\n  },\n  {\n    \"name\": \"Solution breadth\",\n    \"numerator_type\": \"solution\",\n    \"denominator_type\": \"opportunity\",\n    \"expected_min\": 1.5,\n    \"stages\": [\n      \"concept\",\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Explore multiple solutions per opportunity. 1:1 means you jumped to the first idea.\"\n  },\n  {\n    \"name\": \"Story coverage\",\n    \"numerator_type\": \"user_story\",\n    \"denominator_type\": \"feature\",\n    \"expected_min\": 2,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Features need decomposition. 2+ stories per feature means proper breakdown.\"\n  },\n  {\n    \"name\": \"Research throughput\",\n    \"numerator_type\": \"insight\",\n    \"denominator_type\": \"research_study\",\n    \"expected_min\": 3,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"ux_research\"},\n    \"rationale\": \"Each study should yield 3+ insights. Less means shallow research or poor synthesis.\"\n  },\n  {\n    \"name\": \"Pain-to-opportunity conversion\",\n    \"numerator_type\": \"opportunity\",\n    \"denominator_type\": \"need\",\n    \"expected_min\": 0.3,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"At least 30% of pain points should surface opportunities. Lower = pain is documented but not acted on.\"\n  },\n  {\n    \"name\": \"Feature-to-persona ratio\",\n    \"numerator_type\": \"feature\",\n    \"denominator_type\": \"persona\",\n    \"expected_min\": 2,\n    \"stages\": [\n      \"build\",\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"product_management\"},\n    \"rationale\": \"Each persona should drive at least 2 features. Less = underserved personas.\"\n  },\n  {\n    \"name\": \"Decision documentation rate\",\n    \"numerator_type\": \"decision\",\n    \"denominator_type\": \"initiative\",\n    \"expected_min\": 1,\n    \"stages\": [\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"book\",\"citation\":\"Release It (Nygard)\"},\n    \"rationale\": \"Each initiative should have at least one documented decision.\"\n  },\n  {\n    \"name\": \"Tech debt visibility\",\n    \"numerator_type\": \"technical_debt_item\",\n    \"denominator_type\": \"service\",\n    \"expected_min\": 0.5,\n    \"stages\": [\n      \"growth\",\n      \"mature\"\n    ],\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"engineering\"},\n    \"rationale\": \"If you have services but zero documented debt, debt is invisible, not absent.\"\n  }\n]\n","/**\n * When each UPG domain is expected to \"turn on\" across the product journey.\n *\n * Each row binds a domain (see `registry/domains.ts`) to the earliest stage\n * at which domain activity is expected (`expected_from`) and the stage by\n * which it should be fully active (`expected_mature`). E.g. `strategy` should\n * be active from `concept`; `sales` typically activates at `launch`.\n *\n * Consumers:\n * - Intelligence layer → \"domain asleep at this stage\" warnings, stage\n *   readiness checks\n *\n * Benchmark shape: see `DomainActivation` in `./types.ts`.\n *\n * @see ./types.ts `DomainActivation`\n * @see ../../registry/domains.ts canonical domain registry\n * @see ../intelligence.ts domain-activation audit consumer\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { DomainActivation } from './types.js'\n\nexport const UPG_DOMAIN_ACTIVATION: DomainActivation[] = [\n  {\n    \"domain_id\": \"strategy\",\n    \"expected_from\": \"concept\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"fundamental\"},\n    \"rationale\": \"Product identity is step zero.\"\n  },\n  {\n    \"domain_id\": \"user\",\n    \"expected_from\": \"concept\",\n    \"expected_mature\": \"build\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"JTBD (Christensen)\"},\n    \"rationale\": \"Understanding users is foundational. Cannot be deferred.\"\n  },\n  {\n    \"domain_id\": \"discovery\",\n    \"expected_from\": \"concept\",\n    \"expected_mature\": \"build\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Continuous Discovery Habits (Torres)\"},\n    \"rationale\": \"Opportunities should be identified before building.\"\n  },\n  {\n    \"domain_id\": \"validation\",\n    \"expected_from\": \"concept\",\n    \"expected_mature\": \"build\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Startup (Ries)\"},\n    \"rationale\": \"Test assumptions before investing in features.\"\n  },\n  {\n    \"domain_id\": \"product_spec\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"agile\"},\n    \"rationale\": \"Feature specs emerge when building starts.\"\n  },\n  {\n    \"domain_id\": \"market_intelligence\",\n    \"expected_from\": \"concept\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"competitive_strategy\"},\n    \"rationale\": \"Know your landscape early. Deepen as you grow.\"\n  },\n  {\n    \"domain_id\": \"business_model\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Business Model Generation (Osterwalder)\"},\n    \"rationale\": \"Revenue model must be clear before scaling.\"\n  },\n  {\n    \"domain_id\": \"growth\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Lean Analytics (Croll)\"},\n    \"rationale\": \"Growth metrics and funnels enable scaling decisions.\"\n  },\n  {\n    \"domain_id\": \"go_to_market\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"gtm\"},\n    \"rationale\": \"How you reach customers. Must be systematic by growth.\"\n  },\n  {\n    \"domain_id\": \"user_research\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"The Mom Test (Fitzpatrick)\"},\n    \"rationale\": \"Continuous research keeps you honest.\"\n  },\n  {\n    \"domain_id\": \"ux_design\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Atomic Design (Frost)\"},\n    \"rationale\": \"Design system and IA emerge as product matures.\"\n  },\n  {\n    \"domain_id\": \"engineering\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Domain-Driven Design (Evans)\"},\n    \"rationale\": \"Architecture becomes explicit as complexity grows.\"\n  },\n  {\n    \"domain_id\": \"pricing\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"pricing\"},\n    \"rationale\": \"Deliberate pricing by growth stage.\"\n  },\n  {\n    \"domain_id\": \"content\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"content_marketing\"},\n    \"rationale\": \"Systematic content after product-market fit.\"\n  },\n  {\n    \"domain_id\": \"feedback\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"growth\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"voice_of_customer\"},\n    \"rationale\": \"Listen to users once you have them.\"\n  },\n  {\n    \"domain_id\": \"team_org\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Team Topologies (Skelton & Pais)\"},\n    \"rationale\": \"Org structure matters when the team grows.\"\n  },\n  {\n    \"domain_id\": \"data_analytics\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"data_driven\"},\n    \"rationale\": \"Data infrastructure for decision-making at scale.\"\n  },\n  {\n    \"domain_id\": \"compliance\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"regulatory\"},\n    \"rationale\": \"Compliance becomes critical as you scale and attract scrutiny.\"\n  },\n  {\n    \"domain_id\": \"devops\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"book\",\"citation\":\"Site Reliability Engineering (Google)\"},\n    \"rationale\": \"Reliability engineering for production systems.\"\n  },\n  {\n    \"domain_id\": \"security\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"security\"},\n    \"rationale\": \"Security posture must formalize as the product handles real user data.\"\n  },\n  {\n    \"domain_id\": \"testing\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"quality_assurance\"},\n    \"rationale\": \"Testing discipline scales with the codebase.\"\n  },\n  {\n    \"domain_id\": \"accessibility\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"accessibility\"},\n    \"rationale\": \"Accessibility should be considered early but formalized at growth.\"\n  },\n  {\n    \"domain_id\": \"ai\",\n    \"expected_from\": \"build\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"ai_ops\"},\n    \"rationale\": \"Only if the product uses AI. Track models, costs, and quality.\"\n  },\n  {\n    \"domain_id\": \"automation\",\n    \"expected_from\": \"growth\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"automation\"},\n    \"rationale\": \"Workflow automation at scale.\"\n  },\n  {\n    \"domain_id\": \"portfolio\",\n    \"expected_from\": \"mature\",\n    \"expected_mature\": \"mature\",\n    \"source\": {\"kind\":\"industry_practice\",\"category\":\"portfolio_management\"},\n    \"rationale\": \"Multi-product management. Only relevant at scale.\"\n  }\n]\n","/**\n * benchmarks/ Product management wisdom as structured data.\n *\n * Encodes expected entity counts, relationships, ratios, and domain activation\n * thresholds per product stage. All 9 stages populated.\n */\n\nexport * from './types.js'\nexport { UPG_COUNT_BENCHMARKS } from './count-benchmarks.js'\nexport { UPG_RELATIONSHIP_BENCHMARKS } from './relationship-benchmarks.js'\nexport { UPG_RATIO_BENCHMARKS } from './ratio-benchmarks.js'\nexport { UPG_DOMAIN_ACTIVATION } from './domain-activations.js'\n\nimport type { CountBenchmark, StageRange, UPGProductStage } from './types.js'\nimport type { UPGEntityType } from '../../catalog/entity-catalog.js'\nimport type { UPGDomainId } from '../../registry/domains.js'\nimport { UPG_COUNT_BENCHMARKS } from './count-benchmarks.js'\n\n/**\n * Look up the expected range for a type at a given stage.\n *\n * Returns `null` when the type is unknown OR when the type exists but is not\n * expected at that stage (e.g. `sales` activity at `concept`).\n *\n * @example\n * getBenchmark('product', 'concept')   // → { min: 1, max: 1 }\n * getBenchmark('persona', 'build')     // → { min: 2, max: 5 }  (example range)\n * getBenchmark('not_a_type', 'growth') // → null\n */\nexport function getBenchmark(entityType: UPGEntityType | string, stage: UPGProductStage): StageRange {\n  const bm = UPG_COUNT_BENCHMARKS.find((b) => b.type === entityType)\n  if (!bm) return null\n  return bm[stage]\n}\n\n/**\n * Get all benchmarks for a given domain.\n *\n * @example\n * const userBenchmarks = getBenchmarksByDomain('user')\n * // userBenchmarks.map(b => b.type)\n * //   → ['persona', 'job', 'need', 'desired_outcome', ...]\n */\nexport function getBenchmarksByDomain(domain: UPGDomainId | string): CountBenchmark[] {\n  return UPG_COUNT_BENCHMARKS.filter((b) => b.domain === domain)\n}\n","/**\n * UPG Curated Anti-Patterns: cross-domain reference set.\n *\n * Each entry pairs a memorable name with a machine-evaluable\n * `IntelligenceCondition`, the stages it fires in, a \"why it matters\" line,\n * and a remediation hint.\n *\n * Distinct from `UPGAntiPattern` in `domain-guides.ts`:\n * - `UPGAntiPattern` (per-domain): guidance for MCP agents working *inside* a domain.\n * - `UPGCuratedAntiPattern` (this file): cross-cutting patterns evaluated against the *whole* graph.\n *\n * Adding one: append to `UPG_ANTI_PATTERNS`. Integrity tests validate id\n * uniqueness, condition well-formedness, and stage/severity vocab. Cite\n * sources via `UPGBenchmarkSource` where applicable.\n *\n * https://unifiedproductgraph.org | MIT\n */\n\nimport type { IntelligenceCondition, EdgeCountVsPropertyCheck } from './intelligence.js'\nimport type { UPGProductStage, UPGBenchmarkSource } from './benchmarks/types.js'\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Severity tier for a curated anti-pattern.\n *\n * - `'high'`: blocks downstream work or surfaces a missing causal chain\n *   (e.g. features without hypotheses, building-without-validating).\n * - `'medium'`: quality or coverage gap that degrades the graph as a\n *   reasoning surface (e.g. orphan-loose-thoughts, single-domain-graph).\n * - `'low'`: informational. Signal worth surfacing but not urgent.\n */\nexport type UPGAntiPatternSeverity = 'high' | 'medium' | 'low'\n\n/**\n * A curated, cross-domain anti-pattern with a machine-evaluable detector.\n *\n * @example\n * {\n *   id: 'features-without-hypotheses',\n *   name: 'Features without hypotheses',\n *   description: 'The graph has features but no hypotheses. Work is being scoped without a stated belief about why it should work.',\n *   structured_condition: { operator: 'and', checks: [\n *     { check: { type: 'entity_count', entity_type: 'feature', comparison: 'nonzero' } },\n *     { check: { type: 'entity_count', entity_type: 'hypothesis', comparison: 'zero' } },\n *   ] },\n *   why_it_matters: 'Features built without hypotheses ship as opinion; learnings from delivery cannot validate or refute anything because no claim was made.',\n *   remediation: 'For each in-flight feature, draft one hypothesis it tests; link via feature_tests_hypothesis.',\n *   stages: ['validation', 'build', 'beta', 'launch', 'growth'],\n *   severity: 'high',\n * }\n */\nexport interface UPGCuratedAntiPattern {\n  /**\n   * Stable slug: kebab-case, unique within `UPG_ANTI_PATTERNS`.\n   * Surfaced as URL fragment on the `/intelligence` site page; never rename\n   * once published (rename = breaking link surface).\n   */\n  id: string\n\n  /** Short, memorable display title (≤ 6 words). */\n  name: string\n\n  /**\n   * 2–3 sentence plain-English explanation. Read by a product\n   * practitioner, not a graph engineer.\n   */\n  description: string\n\n  /**\n   * Detection scope.\n   * - `'graph'` (default, omitted): evaluated against a single product graph by\n   *   the `evaluateAntiPatterns` chokepoint (validate_graph, get_anti_pattern_violations_for).\n   * - `'portfolio'`: evaluated across products + the shared registry by\n   *   `portfolio_validate`. The single-graph evaluator SKIPS these (a portfolio\n   *   pattern can never flip a single graph invalid), and they carry no\n   *   `structured_condition` because the cross-product detector is not expressible\n   *   as an `IntelligenceCondition` over one graph.\n   */\n  scope?: 'graph' | 'portfolio'\n\n  /**\n   * Machine-evaluable detector. Composes `EntityCheck`,\n   * `RelationshipCheck`, `BenchmarkCheck`, etc. via `and` / `or`.\n   * Consumers (Entopo, MCP, the site) evaluate this against a graph.\n   *\n   * Required for graph-scoped patterns; OMITTED for `scope: 'portfolio'`\n   * patterns, whose detector lives in `portfolio_validate` instead.\n   */\n  structured_condition?: IntelligenceCondition\n\n  /** One sentence on the product impact when this anti-pattern fires. */\n  why_it_matters: string\n\n  /**\n   * One sentence pointing at the fix. Where useful, names a\n   * canonical edge type, entity type, or workflow / skill.\n   */\n  remediation: string\n\n  /**\n   * Product stages this anti-pattern can meaningfully trigger in.\n   * Surface for stage-aware filtering (e.g. don't show\n   * \"competitors-missing\" warnings during `concept`).\n   */\n  stages: readonly UPGProductStage[]\n\n  /** Severity tier. See `UPGAntiPatternSeverity`. */\n  severity: UPGAntiPatternSeverity\n\n  /**\n   * Optional citation for the pattern's origin (a book, practitioner,\n   * industry practice, or fundamental). Reuses the same controlled\n   * vocabulary as `CountBenchmark.source` so consumers render\n   * citations uniformly.\n   */\n  source?: UPGBenchmarkSource\n\n  /**\n   * UPG version that introduced this anti-pattern (e.g. `'0.9.7'`). Lets\n   * `get_spec_version` surface \"new anti-patterns in this version\" so a graph\n   * authored clean under an earlier version is not silently flipped invalid on\n   * upgrade with no heads-up (batch-6 #36). Omitted on baseline patterns that\n   * predate this tracking (treated as \"always present\").\n   */\n  since?: string\n}\n\n// ─── Curated set ─────────────────\n\n/**\n * The curated anti-pattern reference set. Append-only; existing ids are\n * stable URL fragments and content surfaces.\n */\nexport const UPG_ANTI_PATTERNS: readonly UPGCuratedAntiPattern[] = [\n  // ── User layer ──────────────────────────────────────────────────────────\n  {\n    id: 'personas-without-jobs',\n    name: 'Personas without jobs',\n    description:\n      'The graph has persona entities, but none link into the user chain via any of the v0.2 chain edges (job, need, desired_outcome, or switching_cost). A persona without chain links is a demographic profile: who someone is, not what they are trying to get done.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'persona', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'persona',\n            edge_type: 'persona_pursues_job',\n            target_type: 'job',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'persona',\n            edge_type: 'persona_experiences_need',\n            target_type: 'need',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'persona',\n            edge_type: 'persona_aspires_to_desired_outcome',\n            target_type: 'desired_outcome',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'persona',\n            edge_type: 'persona_incurs_switching_cost',\n            target_type: 'switching_cost',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Without any chain link, every downstream artefact (need, opportunity, feature) loses its anchor. Features end up addressing demographics instead of struggles.',\n    remediation:\n      'For each persona, connect it into the user chain via at least one of: `persona_pursues_job`, `persona_experiences_need`, `persona_aspires_to_desired_outcome`, or `persona_incurs_switching_cost`. Use `/upg-new-persona` or the JTBD canvas workflow.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'high',\n    source: { kind: 'practitioner', attribution: 'Clayton Christensen, Jobs to Be Done' },\n  },\n\n  {\n    id: 'opportunity-without-need',\n    name: 'Opportunity without underlying need',\n    description:\n      'An opportunity exists in the graph but is not linked into the user chain via any valid v0.2 upstream edge. Opportunities that don\\'t trace back to a real user need, outcome, or job are solutions in search of a problem.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'opportunity', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'opportunity',\n            edge_type: 'opportunity_addresses_need',\n            target_type: 'need',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'opportunity',\n            edge_type: 'opportunity_pursues_outcome',\n            target_type: 'outcome',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'opportunity',\n            edge_type: 'opportunity_contextualises_job',\n            target_type: 'job',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'outcome',\n            edge_type: 'outcome_reveals_opportunity',\n            target_type: 'opportunity',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Opportunities untethered from the user chain cannot be prioritised. There is no signal about who benefits or why.',\n    remediation:\n      'For each opportunity, connect it to the user chain via one of: `opportunity_addresses_need`, `opportunity_pursues_outcome`, `opportunity_contextualises_job`, or an `outcome_reveals_opportunity` edge from a parent outcome.',\n    stages: ['validation', 'build', 'beta', 'launch'],\n    severity: 'high',\n    source: { kind: 'practitioner', attribution: 'Teresa Torres, Continuous Discovery Habits' },\n  },\n\n  // ── Validation layer ────────────────────────────────────────────────────\n  {\n    id: 'features-without-hypotheses',\n    name: 'Features without hypotheses',\n    description:\n      'The graph has features but no hypothesis entities. Work is being scoped without a stated belief about why it should work.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'feature', comparison: 'nonzero' } },\n        { check: { type: 'entity_count', entity_type: 'hypothesis', comparison: 'zero' } },\n      ],\n    },\n    why_it_matters:\n      'Features built without hypotheses ship as opinion. Learnings from delivery cannot validate or refute anything because no claim was made.',\n    remediation:\n      'For each in-flight feature, draft one `hypothesis` it tests; link via `feature_tests_hypothesis`.',\n    stages: ['validation', 'build', 'beta', 'launch', 'growth'],\n    severity: 'high',\n    source: { kind: 'book', citation: 'The Lean Startup, Eric Ries (2011)' },\n  },\n\n  {\n    id: 'untested-hypothesis-pile-up',\n    name: 'Untested hypothesis pile-up',\n    description:\n      'More than three hypothesis claims sit in `drafted` status. Hypotheses accumulate when authoring is decoupled from validation; a backlog of drafts is a signal the team is generating beliefs faster than testing them.',\n    structured_condition: {\n      check: {\n        type: 'entity_count',\n        entity_type: 'hypothesis',\n        filter: { status: 'drafted' },\n        comparison: 'gt',\n        threshold: 3,\n      },\n    },\n    why_it_matters:\n      'Drafted hypotheses neither inform direction nor produce learning. Conversion of draft → active is the lifecycle health metric.',\n    remediation:\n      'Promote at least one drafted `hypothesis` to `active` per planning cycle by pairing it with an `experiment_plan`.',\n    stages: ['validation', 'build', 'beta', 'launch', 'growth'],\n    severity: 'medium',\n    source: { kind: 'practitioner', attribution: 'David Bland, Testing Business Ideas' },\n  },\n\n  {\n    id: 'experiment-run-without-learning',\n    name: 'Experiment runs without learnings',\n    description:\n      'The graph has `experiment_run` entities but no `experiment_run_produces_learning` edges. Runs that complete without producing a learning are runs whose results were never written down.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'experiment_run', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'experiment_run',\n            edge_type: 'experiment_run_produces_learning',\n            target_type: 'learning',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Without an attached learning, an experiment_run is operational exhaust. It consumed time but did not change what the team believes.',\n    remediation:\n      'For each completed `experiment_run`, capture one `learning` and link via `experiment_run_produces_learning`.',\n    stages: ['validation', 'build', 'beta', 'launch', 'growth'],\n    severity: 'high',\n    source: { kind: 'book', citation: 'The Lean Startup, Eric Ries (2011)' },\n  },\n\n  // ── Strategy / OKR layer ────────────────────────────────────────────────\n  {\n    id: 'objective-without-key-results',\n    name: 'Objectives without key results',\n    description:\n      'The graph has objectives but no `objective_achieved_through_key_result` edges. Objectives without measurable key results are aspirations, not commitments.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'objective', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'objective',\n            edge_type: 'objective_achieved_through_key_result',\n            target_type: 'key_result',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'OKRs without measurable key results cannot be tracked, debated, or learned from. The graph carries intent but not accountability.',\n    remediation:\n      'For each `objective`, define 2–4 `key_result` entities and link via `objective_achieved_through_key_result`. Use `/upg-new-okr` to author.',\n    stages: ['validation', 'build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'high',\n    source: { kind: 'book', citation: 'Measure What Matters, John Doerr (2017)' },\n  },\n\n  {\n    id: 'roadmap-feature-without-outcome-link',\n    name: 'Roadmap features without outcome linkage',\n    description:\n      'Features exist in the graph but none link to a `key_result` they drive. Output without outcome linkage is feature-factory work: building things, not moving things.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'feature', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'feature',\n            edge_type: 'feature_drives_key_result',\n            target_type: 'key_result',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Roadmap items without outcome anchors can be prioritised on size, not on impact.',\n    remediation:\n      'For each feature, identify the `key_result` it drives and link via `feature_drives_key_result`.',\n    stages: ['build', 'beta', 'launch', 'growth'],\n    severity: 'high',\n    source: { kind: 'practitioner', attribution: 'John Cutler, Outcomes over Output' },\n  },\n\n  {\n    id: 'planning-cycle-without-scheduled-work',\n    name: 'Planning cycle with no scheduled work',\n    description:\n      'A planning_cycle exists but neither schedules any work item nor contains a finer sub-cycle. An empty cadence box is a date range with nothing flowing through it: a sprint or iteration nobody planned work into, or a coarse period that was never broken down.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'planning_cycle', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'planning_cycle',\n            edge_type: 'planning_cycle_schedules_work_item',\n            target_type: 'node',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'planning_cycle',\n            edge_type: 'planning_cycle_contains_planning_cycle',\n            target_type: 'planning_cycle',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'A cadence layer only earns its keep when work is planned through it. An interval with no scheduled stories and no nested cycles adds ceremony without telling anyone what the period is for.',\n    remediation:\n      'Schedule the work the cycle will carry via `planning_cycle_schedules_work_item`, or break a coarse period into finer cycles via `planning_cycle_contains_planning_cycle`. If neither applies, the interval is not yet a real cadence box.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'low',\n    since: '0.20.0',\n    // RETARGETED at 0.32.0 from planning_cycle_schedules_user_story. Left\n    // unchanged it would have become a false-positive generator the moment\n    // cycles could hold tasks: a cycle full of scheduled tasks and no stories\n    // would have reported as empty. Labeled fixtures cover the near-miss this\n    // is most likely to get wrong — a coarse `period` cycle that legitimately\n    // holds only sub-cycles and schedules nothing directly.\n  },\n\n  // ── Market intelligence layer ───────────────────────────────────────────\n  {\n    id: 'competitors-missing-past-validation',\n    name: 'Competitor catalogue empty past validation',\n    description:\n      'The graph has zero competitor entities at build stage or later. Past validation, the absence of named competitors usually means alternatives haven\\'t been thought through, not that none exist. A graph still at concept or validation is exempt: cataloguing the field can wait until you commit to building.',\n    structured_condition: {\n      check: {\n        type: 'benchmark',\n        entity_type: 'competitor',\n        comparison: 'below_min',\n      },\n    },\n    why_it_matters:\n      'Without competitors in the graph, positioning, differentiation, and switching-cost analysis lack referents. The team is reasoning in a vacuum.',\n    remediation:\n      'Catalogue the 3–5 closest alternatives users would pick today. Use `/upg-compete` to author.',\n    // Fires from build onward, matching the name (past the validation stage). A\n    // concept or validation graph is still framing the problem; holding it to a\n    // competitor benchmark there is the false alarm this anti-pattern caused on\n    // legitimately-young graphs.\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'industry_practice', category: 'product_strategy' },\n  },\n\n  {\n    id: 'persona-count-below-stage-benchmark',\n    name: 'Persona count below stage benchmark',\n    description:\n      'The graph has fewer personas than the stage-appropriate benchmark expects, from beta onward. Persona under-coverage at that point signals the team has not segmented its audience. Concept through build are exempt: the sound move there is to start with one beachhead persona and expand as you find fit.',\n    structured_condition: {\n      check: {\n        type: 'benchmark',\n        entity_type: 'persona',\n        comparison: 'below_min',\n      },\n    },\n    why_it_matters:\n      'A graph still on a single persona by beta is usually carrying an unexamined assumption that every user is the same.',\n    remediation:\n      'Add personas representing the next 1–2 most distinct user segments. Use `/upg-new-persona`.',\n    // Fires from beta onward. The persona benchmark expects 2+ from validation,\n    // but the canonical beachhead move is to start with one persona and expand as\n    // fit is found, so holding a build-stage graph to a multi-persona bar is a\n    // false alarm. By beta an unsegmented audience is a real signal.\n    stages: ['beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'practitioner', attribution: 'Alan Cooper, The Inmates Are Running the Asylum' },\n  },\n\n  // ── Cross-domain coverage ───────────────────────────────────────────────\n  {\n    id: 'building-without-validating',\n    name: 'Building without validating',\n    description:\n      'The product-spec domain has entities but the validation domain is empty. The team is shipping work without a parallel discovery / validation track.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'domain_population', domain_id: 'product_spec', comparison: 'nonzero' } },\n        { check: { type: 'domain_population', domain_id: 'validation', comparison: 'zero' } },\n      ],\n    },\n    why_it_matters:\n      'Build-only graphs commit the team to delivery without a learning loop. Every shipped feature becomes a permanent assumption.',\n    remediation:\n      'Spin up at least one `experiment_plan` or `hypothesis` per quarter\\'s build batch. Use `/upg-new-discovery` or `/upg-new-hypothesis`.',\n    stages: ['build', 'beta', 'launch', 'growth'],\n    severity: 'high',\n    source: { kind: 'practitioner', attribution: 'Marty Cagan, Inspired (continuous discovery)' },\n  },\n\n  {\n    id: 'single-domain-graph',\n    name: 'Single-domain graph',\n    description:\n      'The graph has more than five entities but they all live in a single UPG domain, at beta stage or later. A real product spans multiple domains by then; a single-domain graph that far along is usually a deep notebook in one corner with the rest of the picture missing. Concept through build are exempt: a graph legitimately starts deep in one domain and broadens as it matures.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'total_entity_count', comparison: 'gt', threshold: 5 } },\n        { check: { type: 'domain_count', comparison: 'eq', threshold: 1 } },\n      ],\n    },\n    why_it_matters:\n      'Single-domain coverage prevents cross-domain reasoning. The graph cannot answer questions like \"which feature serves which persona?\" or \"which experiment validates which hypothesis?\".',\n    remediation:\n      'Identify the next adjacent domain (usually `user`, `validation`, or `product_spec`) and add 2–3 anchor entities to bridge.',\n    // Fires from beta onward. Early on a graph is legitimately deep in one domain\n    // (a discovery notebook, a thin internal tool); only once it reaches beta is\n    // single-domain coverage a smell rather than a normal starting shape. Extends\n    // through growth and mature, where a single-domain graph is most telling.\n    stages: ['beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  {\n    id: 'orphan-loose-thoughts',\n    name: 'Orphan loose thoughts',\n    description:\n      'More than five entities have no incoming or outgoing edges. Orphans accumulate when capture outpaces composition: thoughts get added without being connected.',\n    structured_condition: {\n      check: { type: 'orphan_count', comparison: 'gt', threshold: 5 },\n    },\n    why_it_matters:\n      'Orphan entities sit outside graph traversal. They answer no questions, flag no gaps, drive no insight. Capture without composition is note-taking, not graph-building.',\n    remediation:\n      'Walk the orphan list and either (a) connect each to its parent / sibling / consequence via the appropriate edge, or (b) archive entities that no longer matter.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── Experience-design layer ─────────────────────────────────────────────\n  {\n    id: 'journey-phases-without-canonical-steps',\n    name: 'Journey phases without a step spine',\n    description:\n      'The graph has journey phases spanning steps (`journey_phase_spans_journey_step`), but no journey owns its steps via `user_journey_contains_journey_step`. A phase is a band over a step timeline, not a container. When the timeline itself is missing there is no canonical answer to \"what are the steps of this journey?\". The phase overlay points at steps the journey does not own.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'journey_phase',\n            edge_type: 'journey_phase_spans_journey_step',\n            target_type: 'journey_step',\n            comparison: 'exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'user_journey',\n            edge_type: 'user_journey_contains_journey_step',\n            target_type: 'journey_step',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Steps owned by no journey render a different step list per consumer: the phase overlay sees them, a journey-direct walk does not. The journey has no deterministic step spine to traverse, score, or map to screens.',\n    remediation:\n      'Own every step under its journey with `user_journey_contains_journey_step`, then let phases span ranges of that single timeline via `journey_phase_spans_journey_step`. The phase is a non-owning band overlay, not the step container.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth'],\n    severity: 'high',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── F5 (UPG-671): anti-pattern enforcement ────────────────────────────────\n  // P-C from the 36-domain wiring audit: domain-guide anti-patterns described\n  // in prose with no machine-checkable detector. These two map cleanly to a\n  // RelationshipCheck (edge presence/absence) and are promoted here.\n  {\n    id: 'insights-without-evidence',\n    since: '0.9.7',\n    name: 'Insights without evidence',\n    description:\n      'The graph has insight entities but none are backed by a primary-evidence link: no observation yields them (`observation_yields_insight`), no survey response evidences them (`survey_response_evidences_insight`), and no quote is attached (`insight_evidenced_by_quote`). An insight with no evidence behind it is an opinion wearing a research label.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'insight', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'observation',\n            edge_type: 'observation_yields_insight',\n            target_type: 'insight',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'survey_response',\n            edge_type: 'survey_response_evidences_insight',\n            target_type: 'insight',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'insight',\n            edge_type: 'insight_evidenced_by_quote',\n            target_type: 'quote',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Insights untethered from evidence cannot be trusted, contested, or traced. Downstream opportunities and design questions inherit an unfalsifiable claim.',\n    remediation:\n      'Back each insight with at least one primary record via `observation_yields_insight`, `survey_response_evidences_insight`, or `insight_evidenced_by_quote`. Capture the supporting observation or quote first.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'high',\n    source: { kind: 'practitioner', attribution: 'Steve Portigal, Interviewing Users' },\n  },\n\n  {\n    id: 'feature-requests-without-provenance',\n    since: '0.9.7',\n    name: 'Feature requests without provenance',\n    description:\n      'The graph has feature_request entities but none trace back to a source: no feedback program collects them (`feedback_program_collects_feature_request`), no customer feedback becomes one (`customer_feedback_becomes_feature_request`), and none originate from a behavioural segment (`feature_request_from_behavioral_segment`). A request with no provenance cannot be weighed against who asked or how many.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'feature_request', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'feedback_program',\n            edge_type: 'feedback_program_collects_feature_request',\n            target_type: 'feature_request',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'customer_feedback',\n            edge_type: 'customer_feedback_becomes_feature_request',\n            target_type: 'feature_request',\n            comparison: 'not_exists',\n          },\n        },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'feature_request',\n            edge_type: 'feature_request_from_behavioral_segment',\n            target_type: 'behavioral_segment',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Requests without a source get prioritised on volume of voice, not on the strength or fit of who is asking. The loudest channel wins by default.',\n    remediation:\n      'Attach provenance to each `feature_request` via `feedback_program_collects_feature_request`, `customer_feedback_becomes_feature_request`, or `feature_request_from_behavioral_segment` before it enters prioritisation.',\n    stages: ['beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'practitioner', attribution: 'Marty Cagan, Inspired (product discovery)' },\n  },\n\n  // ── Operating-function layer (0.17.0): member_kind: operating_function ─────\n  // Carry concern 'operating' (UPG_ANTI_PATTERN_CONCERNS) and are evaluated ONLY\n  // for operating_function graphs — a function a team operates (revenue / success\n  // / finance / people / marketing), not a product it ships. The product-spine\n  // patterns above are not evaluated for that kind (category errors); these assert\n  // the function spine instead.\n  {\n    id: 'operating-function-without-north-star',\n    since: '0.17.0',\n    name: 'Operating function without a north-star metric',\n    description:\n      'An operating function graph has real content but no north-star metric to operate toward. A function (sales, finance, people, marketing) is run against one headline number it moves and that rolls up to the company tree. With no north-star metric the function has direction but nothing to steer by.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'total_entity_count', comparison: 'gt', threshold: 3 } },\n        { check: { type: 'entity_count', entity_type: 'metric', filter: { property: 'designation', value: 'north_star' }, comparison: 'zero' } },\n      ],\n    },\n    why_it_matters:\n      'A function with no north-star metric cannot be steered, prioritised, or rolled into the company metric tree. Operating work becomes activity without a measured target.',\n    remediation:\n      'Add the one `metric` the function operates toward and mark it `designation: north_star`, then wire it to the company metric tree via `metric_decomposes_into_metric`.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature', 'maintenance', 'sunset'],\n    severity: 'high',\n    source: { kind: 'fundamental' },\n  },\n\n  {\n    id: 'operating-function-without-operating-content',\n    since: '0.17.0',\n    name: 'Operating function without operating content',\n    description:\n      'An operating function graph has more than a few entities but none in any operating domain (sales, go-to-market, customer success, growth, marketing, business model, pricing). It carries direction and people but no operating substance: the work the function actually runs.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'total_entity_count', comparison: 'gt', threshold: 3 } },\n        { check: { type: 'domain_population', domain_id: 'sales', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'go_to_market', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'customer_success', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'growth', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'marketing', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'business_model', comparison: 'zero' } },\n        { check: { type: 'domain_population', domain_id: 'pricing', comparison: 'zero' } },\n      ],\n    },\n    why_it_matters:\n      'A function graph that is all strategy and org chart with no operating domain is a stub: it states intent but models none of the work the function runs, so it answers no operating questions.',\n    remediation:\n      'Populate at least one operating domain appropriate to the function (e.g. Field → `sales` / `go_to_market` / `customer_success`; Finance → `business_model` / `pricing`). Start from the matching template via `/upg-new-from-template`.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature', 'maintenance', 'sunset'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── Foundations layer (0.9.13): portfolio-scoped, registry-aware ──────────\n  // These read the shared registry + cross-product edges, so they are evaluated\n  // by portfolio_validate, not the single-graph evaluator. They carry no\n  // structured_condition (the detector is cross-product, not a single-graph\n  // IntelligenceCondition).\n  {\n    id: 'specification-without-implementer',\n    since: '0.9.13',\n    scope: 'portfolio',\n    name: 'Specification without implementer',\n    description:\n      'A specification in the shared registry has no product, feature, or api_contract implementing or conforming to it anywhere in the portfolio. A specification nobody implements is a document, not a contract: it states an intent the portfolio never honours.',\n    why_it_matters:\n      'An unimplemented specification carries authority it has not earned. Teams cite it as a standard while no surface actually conforms, so conformance claims cannot be trusted or traced.',\n    remediation:\n      'Link at least one product, feature, or api_contract to the specification via `product_implements_specification`, `product_exposes_specification`, `feature_conforms_to_specification`, or `api_contract_speaks_specification`; or retire the specification from the registry.',\n    stages: ['validation', 'build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  {\n    id: 'primitive-scattered-without-canonical',\n    since: '0.9.13',\n    scope: 'portfolio',\n    name: 'Primitive scattered without a canonical',\n    description:\n      'The same primitive concept appears as a product-local node in two or more products, but no canonical primitive in the shared registry unifies them. Each product redefines the building block on its own terms, so the portfolio carries several drifting copies of one shared idea instead of a single authoritative definition.',\n    why_it_matters:\n      'Scattered primitives drift apart in name, shape, and meaning. Cross-product reasoning breaks because the same concept reads as several unrelated entities, and a change to the shared building block has no single place to land.',\n    remediation:\n      'Define the shared primitive once in the registry with `define_canonical_entity`, then link each product copy via `register_instance` so the building block has one authoritative definition.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  {\n    id: 'product-reimplements-specification',\n    since: '0.9.13',\n    scope: 'portfolio',\n    name: 'Specification reimplemented across products',\n    description:\n      'Two or more products independently implement the same registry specification rather than one depending on a shared implementation. Parallel implementations of a single contract multiply the surface that must stay in sync and usually signal a missing shared library or service.',\n    why_it_matters:\n      'Every independent reimplementation of a specification is another place a conformance bug can hide and another copy that drifts from the contract. The cost of a spec change scales with the number of reimplementers.',\n    remediation:\n      'Consolidate onto one implementation that the others depend on (`depends_on_product` / `hosts`), or confirm the duplication is deliberate and record why. Capture the stewarding organization with `create_registry_edge` so the contract has an owner.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'low',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── Operating-function org link (0.17.0): portfolio-scoped ─────────────────\n  // Cross-product detector (in portfolio_validate): an operating_function graph\n  // should reference the org unit it operates under, which lives once in the\n  // rollup's team_org map. Carries no structured_condition — the org link is a\n  // cross-product edge in portfolio.upg, not a single-graph shape.\n  {\n    id: 'operating-function-without-org-link',\n    since: '0.17.0',\n    scope: 'portfolio',\n    name: 'Operating function without an org link',\n    description:\n      'An operating_function graph does not reference the org unit it operates under. The department/team hierarchy lives once in the rollup (org_rollup) as team_org entities; a function should point its spine at the department or team that owns it (node_owned_by_department / node_owned_by_team), so the operating layer hangs off the canonical org map rather than re-stating it.',\n    why_it_matters:\n      'A function with no org link floats free of the org chart: its work cannot be rolled up by department, and the single source of truth for who owns what is bypassed.',\n    remediation:\n      'Add a cross-product node_owned_by_department (or node_owned_by_team) edge from the function spine to its department/team in the rollup. Mint the org unit once in the org_rollup graph; functions reference it.',\n    stages: ['concept', 'validation', 'build', 'beta', 'launch', 'growth', 'mature', 'maintenance', 'sunset'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── Citable-key collision (0.34.0): portfolio-scoped, and the FIRST detector\n  // to ship with a labeled corpus behind it (packages/upg-evals/corpora/\n  // intelligence/duplicate-key-across-products/).\n  //\n  // WHY IT CANNOT BE A SINGLE-GRAPH CHECK. Key uniqueness is enforced by a\n  // `(product_id, key)` index, so each product reports its own key as valid. The\n  // collision is only visible from above, which is why this is `scope: 'portfolio'`\n  // and carries no structured_condition: the detector reads across products, and\n  // IntelligenceCondition composes aggregate counts within one graph.\n  //\n  // MECHANICALLY DECIDABLE, which is unusual in this file and is why it can ship\n  // enforced: one `(prefix, number)` pair appearing in two products of one\n  // portfolio, with no judgement about intent. Every other portfolio entry here\n  // approximates a per-node rule; this one is exact.\n  //\n  // ENFORCED FROM DAY ONE. What was staged is the CORPUS, not the enforcement.\n  // The tempting shape was a check that ships \"defined\" and becomes \"enforced\"\n  // later, and there is no such mechanic: a registered detector that declines to\n  // fire is worse than either real option, and nothing in the spec could hang it.\n  // The detector has little to fire on until a second keyed product exists, and\n  // that is a property of the estate rather than of the check.\n  //\n  // THE NEAR-MISSES ARE CONSTRUCTED, and the corpus says so in its own README\n  // rather than in a plan nobody opens. Three classes: two products sharing a\n  // prefix over DISJOINT number ranges (latent, not yet colliding); a\n  // DELIBERATELY shared prefix across a product family wanting one citation\n  // namespace; and a product holding IMPORTED keys minted elsewhere. Until a real\n  // collision is sampled, the recall figure is a claim about the author's\n  // imagination. The corpus carries a dated obligation to re-grade precision and\n  // recall on the first sampled collision.\n  {\n    id: 'duplicate-key-across-products',\n    since: '0.34.0',\n    scope: 'portfolio',\n    name: 'One citable key, two products',\n    description:\n      'The same (prefix, number) pair identifies a node in two or more products of one portfolio. Keys are minted per product and uniqueness is enforced by a (product_id, key) index, so two products minting under one prefix run two independent sequences under one name. Each product reports its own key as valid and only the portfolio can see that the citation is ambiguous.',\n    why_it_matters:\n      'A key exists to be cited. When one citation resolves to two different things, every reference made with it becomes ambiguous after the fact, including references already written down outside the graph where nothing can be corrected. The damage is retroactive and grows with adoption: the longer both sequences run, the more citations a reconciliation has to rewrite.',\n    remediation:\n      'Decide which product owns the prefix and declare it there with team.key_prefix, so ownership is explicit rather than inferred. Migrate the other product by rewriting its existing keys, which is deliberate and visibly costly, never by editing a declaration under a live sequence. If both products want one namespace, record that decision so it does not read as drift.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'high',\n    source: { kind: 'fundamental' },\n  },\n\n  // ── surface (0.27.0): the place, its guest list, and its arbitration rule ──\n  // Three patterns, calibrated so the contention one leads and the two coverage\n  // companions sit a tier below it. Like every entry in this file, each detector\n  // is a WHOLE-GRAPH approximation of a per-node rule (cf. personas-without-jobs,\n  // which fires on \"no persona anywhere links to a job\", not per persona): the\n  // `IntelligenceCondition` language composes aggregate counts, not per-node\n  // predicates.\n  {\n    id: 'contended-surface-without-arbitration',\n    since: '0.27.0',\n    name: 'Contended surface without arbitration',\n    description:\n      'At least one surface has no recorded answer to \"who wins here, and why\". Either it holds more occupants than its stated `capacity` allows (or holds several while stating no limit) and carries no arbitration_rule, or it admits through arbitration_state that the answer is absent (`none`) or accidental (`safe_by_coincidence`). Unrecorded, that answer lives in whoever remembers the last argument.',\n    // 0.28.0 (feedback 852a9721, from a 30-surface field audit). Three changes,\n    // each earned by a reported false positive or a reported blind spot:\n    //\n    //  (a) rule-absence, EXCEPT chained. `composition_mode: 'chained'` means each\n    //      occupant wraps the next rather than competing with it. Many occupants\n    //      and no arbitration rule is the designed shape, so the reporter's 14\n    //      chained slots were 14 standing false positives — and because\n    //      `get_anti_pattern_violations_for` attributes by TYPE, they kept the\n    //      whole surface roster lit no matter how diligently the genuinely\n    //      contended surfaces were documented. The check could never be silenced\n    //      by correct modelling, which is the property a check has to have.\n    //      Exemption is DECLARE-TO-EARN: an unset `composition_mode` still fires,\n    //      so the default posture stays suspicious and silence must be claimed.\n    //  (b) `safe_by_coincidence` fires on its own, with no chained exemption. It\n    //      is the one state that a written `arbitration_rule` can mask: the field\n    //      audit found surfaces whose prose described disjoint enum values doing\n    //      the arbitrating with nothing guarding them. Branch (a) cannot see\n    //      those, because the rule text is present.\n    //  (c) `none` fires on its own too. A graph that says \"nobody decided\" while\n    //      carrying rule text is contradicting itself, and the admission is the\n    //      half to believe.\n    //\n    // `enforced_undocumented` deliberately gets NO branch and NO suppression. It\n    // needs none: a surface enforcing an untranscribed rule has no\n    // `arbitration_rule`, so branch (a) already fires. Nor does it earn a\n    // downgrade — severity is per-anti-pattern, not per-violation, so there is\n    // nowhere to put one; and the harm this pattern names is that the settlement\n    // is unrecorded, which is exactly what `enforced_undocumented` admits. The\n    // graph is the record; code is not. What the state buys is triage, so the\n    // remediation text below names the two costs separately.\n    //\n    // No new anti-pattern was minted for `safe_by_coincidence`. It is a value of\n    // the arbitration question, not a different question, and a second detector\n    // would fire on the same graphs and double-report through type-keyed\n    // attribution — making this family noisier on its first real deployment,\n    // which is the exact failure (a) exists to fix. If field evidence later shows\n    // it needs its own severity, mint it then.\n    //\n    // 0.29.0 (feedback af9ae4c2, the same reporter's measured follow-up: 43\n    // surfaces, 10 flagged, 7 rightly and 3 wrongly). Branch (a) moved from an\n    // aggregate presence count to the per-node `edge_count_vs_property` form.\n    //\n    //  (d) CAPACITY IS NOW READ. The old branch was a pure edge count: any\n    //      surface with more than one occupant and no rule. That flags a header\n    //      row declaring room for four and holding exactly four, which is not\n    //      contended but PARTITIONED — everyone fits, by design, so nothing is\n    //      displaced and there is nothing to decide. All three of the reporter's\n    //      false positives were this, and all three had occupancy at or below a\n    //      stated capacity. The rule is now `occupancy > (capacity ?? 1)`.\n    //\n    //      ABSENT CAPACITY BEHAVES AS 1, NOT AS INFINITY. Absence means\n    //      unbounded, and it is tempting to read unbounded as \"never flag\". The\n    //      opposite is right: a surface that states no limit has stated no\n    //      answer, so two or more occupants is precisely the unrecorded decision\n    //      this pattern names. That keeps all four of the reporter's unbounded\n    //      true positives (7, 7, 10 and 3 occupants) firing.\n    //\n    //      The check had to become per-node rather than two ANDed aggregates:\n    //      \"some surface is over capacity\" and \"some surface has no rule\" are\n    //      both true when they are DIFFERENT surfaces, which would have kept\n    //      every false positive alive. See `EdgeCountVsPropertyCheck.node_filter`.\n    //\n    // ADJUDICATED: DOES A CAPACITY-SATISFIED `additive` SURFACE STILL NEED AN\n    // ORDERING RULE? The reporter's capacity rule and their own earlier report\n    // pull in opposite directions here: 0.28.0 documented that `additive`\n    // occupants raise a question of ORDER rather than victory and that the order\n    // belongs in `arbitration_rule`, while the capacity rule says a surface\n    // where everyone fits has nothing to settle. Ruling: BOTH ARE RIGHT, because\n    // they are about different failures, and this detector owns only one of them.\n    //\n    //   - Contention is about DISPLACEMENT: who is not rendered. Capacity settles\n    //     it. If everyone fits, nobody is displaced, and \"who wins\" is genuinely\n    //     moot. That is why reading capacity removes real false positives rather\n    //     than merely quieting the check.\n    //   - Ordering is about ARRANGEMENT: in what sequence coexisting occupants\n    //     appear. Capacity says nothing about it. The reporter's own four-occupant\n    //     header row, positioned by runtime width measurement, has a live ordering\n    //     question and no displacement question at all.\n    //\n    // So this check reads capacity and stops at displacement. The ordering concern\n    // stays documented on `composition_mode: 'additive'` as guidance, NOT as a\n    // detector: minting `additive-surface-without-ordering` today would repeat the\n    // 0.28.0 mistake of shipping a second detector on no field evidence, and it\n    // would double-report against this one. Mint it when a graph shows unrecorded\n    // ordering causing a real defect, with its own severity and remediation.\n    //\n    // Known consequence, recorded rather than papered over: `arbitration_rule` is\n    // now visibly OVERLOADED. It holds a displacement rule for `exclusive`\n    // surfaces and an ordering rule for `additive` ones, and this check reads it\n    // for only the first. Splitting it (`arbitration_rule` vs `ordering_rule`) is\n    // the natural move if the ordering detector is ever minted; it is not worth a\n    // breaking property change before then.\n    //\n    // CLOSED (banked at 0.28.0, field-confirmed and resolved here): a `chained`\n    // slot that honestly declared `arbitration_state: 'none'` used to re-fire\n    // through branch (c), which carries no chained exemption. The field\n    // confirmation arrived from a second reporter whose census left the state\n    // unset on every one of its chained frames and named this branch as the\n    // reason. THE FIX WAS THE VOCABULARY, NOT THE DETECTOR. Branch (c) matches\n    // the literal string 'none', so the new fifth `SurfaceArbitrationState`\n    // member `no_contention_by_design` never matches it and NOTHING in this\n    // file, the evaluator, or the collector changed.\n    //\n    // Exempting `chained` from (c) was the alternative and it lost on both\n    // correctness and cost. Correctness: `none` is defined as \"nobody ever\n    // decided\", which is FALSE on a chained shell that has no decision to make,\n    // and silencing a check on a false statement is worse than the empty field\n    // it replaces. Cost: `evaluateEntityCount`'s except form covers the\n    // PRESENCE filter only; the value-keyed path is a bare indexed lookup with\n    // no exception arm, so giving it one means a parallel derived spec set, a\n    // new collector aggregate keyed by (type, property, value, except_property,\n    // except_value), the derivation walk, and its tests. That is the whole\n    // 0.28.0 evaluator rider again, spent to make a false statement quiet.\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'surface', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'feature',\n            edge_type: 'feature_occupies_surface',\n            target_type: 'surface',\n            comparison: 'exists',\n          },\n        },\n        {\n          operator: 'or',\n          checks: [\n            {\n              check: {\n                type: 'edge_count_vs_property',\n                entity_type: 'surface',\n                edge_type: 'feature_occupies_surface',\n                direction: 'inbound',\n                property: 'capacity',\n                property_absent_default: 1,\n                node_comparison: 'gt',\n                node_filter: { property: 'arbitration_rule', present: false },\n                except_property: 'composition_mode',\n                except_value: 'chained',\n                comparison: 'nonzero',\n              },\n            },\n            {\n              check: {\n                type: 'entity_count',\n                entity_type: 'surface',\n                filter: { property: 'arbitration_state', value: 'safe_by_coincidence' },\n                comparison: 'nonzero',\n              },\n            },\n            {\n              check: {\n                type: 'entity_count',\n                entity_type: 'surface',\n                filter: { property: 'arbitration_state', value: 'none' },\n                comparison: 'nonzero',\n              },\n            },\n          ],\n        },\n      ],\n    },\n    why_it_matters:\n      'Contention over a UI place is settled every time it comes up, and an unrecorded settlement is re-argued at the next feature. The cost is paid in repeated decisions, not in a visible defect. A surface that is safe only by coincidence pays it all at once instead, the first time an occupant is added.',\n    // Remediation is deliberately the ACTIONABLE CORE only. It is read by\n    // someone who has already been told there is a problem and now needs the\n    // next move, so rationale in it is strictly in the way. The reasoning that\n    // used to live here (why transcription is ten minutes rather than a\n    // meeting, why safe_by_coincidence is the dangerous state, why declaring\n    // capacity is the honest fix rather than inventing a rule, and why the\n    // chained exemption is a factual claim rather than a mute button) is all\n    // above in this comment block, which is where a reader who wants it looks.\n    remediation:\n      // Remediation is read by someone already told there is a problem and now\n      // wanting the action, so rationale is strictly in the way. The reasoning\n      // trimmed out in 0.31.0: a surface at its designed capacity should state\n      // that capacity rather than invent an arbitration rule it does not need,\n      // and leaving the state empty on a chained surface reads as unassessed\n      // rather than as \"nothing to arbitrate\".\n      'Start from `target_node_ids`, then read `arbitration_state`: `enforced_undocumented` needs the rule transcribed into `arbitration_rule`, `none` needs a decision, `safe_by_coincidence` needs a guard in code. A surface holding all it was designed to should state its `capacity`. Occupants that wrap rather than compete declare `composition_mode: \\'chained\\'` with `arbitration_state: \\'no_contention_by_design\\'`.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature', 'maintenance'],\n    severity: 'medium',\n    source: { kind: 'fundamental' },\n  },\n\n  {\n    id: 'surface-without-job',\n    since: '0.27.0',\n    name: 'Surface without a job',\n    description:\n      'The graph has surfaces, but none links to the job it exists to serve. A surface with no job is a place that survives on precedent: it is there because it has always been there.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'surface', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'surface',\n            edge_type: 'surface_serves_job',\n            target_type: 'job',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'Without a job, there is no test for whether a surface still earns its space. Places accumulate, and the layout argument becomes a matter of taste rather than of purpose.',\n    remediation:\n      'Link each surface to the job it serves with `surface_serves_job`. A surface that cannot name one is a candidate for removal or for merging into its parent.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'low',\n    source: { kind: 'practitioner', attribution: 'Clayton Christensen, Jobs to Be Done' },\n  },\n\n  {\n    id: 'surface-without-measurement',\n    since: '0.27.0',\n    name: 'Surface without measurement',\n    description:\n      'The graph has surfaces, but none links to a metric. Nothing reports whether the place is used, ignored, or in the way.',\n    structured_condition: {\n      operator: 'and',\n      checks: [\n        { check: { type: 'entity_count', entity_type: 'surface', comparison: 'nonzero' } },\n        {\n          check: {\n            type: 'relationship',\n            source_type: 'surface',\n            edge_type: 'surface_measured_by_metric',\n            target_type: 'metric',\n            comparison: 'not_exists',\n          },\n        },\n      ],\n    },\n    why_it_matters:\n      'An unmeasured surface cannot be retired on evidence. It is defended by whoever built it and challenged by whoever wants its space, with no reading to settle the question.',\n    remediation:\n      'Attach the reading that would justify keeping the place with `surface_measured_by_metric`. Engagement, or the rate at which its occupants are actually invoked, is usually the honest one.',\n    stages: ['build', 'beta', 'launch', 'growth', 'mature'],\n    severity: 'low',\n    source: { kind: 'fundamental' },\n  },\n] as const\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * One `{ property, present, except_property, except_value }` filter declared\n * somewhere in `UPG_ANTI_PATTERNS`, flattened for collectors.\n *\n * @see UPG_PRESENCE_EXCEPT_SPECS\n */\nexport interface UPGPresenceExceptSpec {\n  /** Entity type the count is taken over. */\n  entity_type: string\n  /** Property whose presence is being counted. */\n  property: string\n  /** Property that removes an entity from the counted population. */\n  except_property: string\n  /** Value of `except_property` that triggers the exclusion. */\n  except_value: string\n}\n\n/** Recursively collect except-filter specs from one condition tree. */\nfunction walkForExceptSpecs(\n  cond: IntelligenceCondition,\n  out: UPGPresenceExceptSpec[],\n): void {\n  if ('operator' in cond) {\n    for (const child of cond.checks) walkForExceptSpecs(child, out)\n    return\n  }\n  const check = cond.check\n  if (check.type !== 'entity_count' || !check.filter) return\n  const f = check.filter as Record<string, unknown>\n  if (\n    typeof f.property !== 'string' ||\n    typeof f.except_property !== 'string' ||\n    typeof f.except_value !== 'string'\n  ) {\n    return\n  }\n  const spec: UPGPresenceExceptSpec = {\n    entity_type: check.entity_type,\n    property: f.property,\n    except_property: f.except_property,\n    except_value: f.except_value,\n  }\n  const seen = out.some(\n    (s) =>\n      s.entity_type === spec.entity_type &&\n      s.property === spec.property &&\n      s.except_property === spec.except_property &&\n      s.except_value === spec.except_value,\n  )\n  if (!seen) out.push(spec)\n}\n\n/**\n * Every except-qualified presence filter the catalog declares (0.28.0).\n *\n * A collector cannot compute joint property counts speculatively: indexing\n * every (property, other-property, other-value) triple is quadratic in\n * properties-per-node and would tax every `validate_graph` call to serve one\n * detector. Nor can it derive the count arithmetically from the existing\n * indexes, because those record marginals and the question is an intersection.\n *\n * So the catalog declares what it needs and collectors compute exactly that\n * and no more. It stays correct without maintenance because it is derived from\n * the conditions themselves.\n *\n * EMPTY SINCE 0.29.0, AND THAT IS NOT A REGRESSION. Its one declarer was the\n * arbitration branch of `contended-surface-without-arbitration`, which moved to\n * the per-node `edge_count_vs_property` form because the aggregate could not\n * ask \"over capacity\" and \"no rule\" of the SAME surface. The mechanism stays\n * supported and tested: an except-qualified presence count is still the right\n * instrument for a detector that needs an intersection of two marginals and no\n * per-node arithmetic, and a future pattern declaring one gets it for free.\n *\n * @example\n * // The shape, as the 0.28.0 contention branch declared it:\n * // { entity_type: 'surface', property: 'arbitration_rule',\n * //   except_property: 'composition_mode', except_value: 'chained' }\n */\nexport const UPG_PRESENCE_EXCEPT_SPECS: readonly UPGPresenceExceptSpec[] = (() => {\n  const out: UPGPresenceExceptSpec[] = []\n  for (const ap of UPG_ANTI_PATTERNS) {\n    if (ap.structured_condition) walkForExceptSpecs(ap.structured_condition, out)\n  }\n  return out\n})()\n\n/**\n * Canonical key for an except-qualified presence count, shared by the\n * collectors that build `countsByTypeAndPropertyPresenceExcept` and the\n * evaluator that reads it. Both sides must agree, so neither spells it inline.\n *\n * @example\n * presenceExceptKey('arbitration_rule', 'composition_mode', 'chained')\n * // → \"arbitration_rule!composition_mode=chained\"\n */\nexport function presenceExceptKey(\n  property: string,\n  exceptProperty: string,\n  exceptValue: string,\n): string {\n  return `${property}!${exceptProperty}=${exceptValue}`\n}\n\n/**\n * One `edge_count_vs_property` check declared somewhere in\n * `UPG_ANTI_PATTERNS`, flattened for collectors (0.29.0).\n *\n * @see UPG_EDGE_COUNT_SPECS\n */\nexport interface UPGEdgeCountSpec {\n  /** Entity type whose nodes are evaluated one at a time. */\n  entity_type: string\n  /** Edge type counted against each node. */\n  edge_type: string\n  /** Which end of the edge the evaluated node sits on. */\n  direction: 'inbound' | 'outbound'\n  /** The node's own numeric property the count is compared against. */\n  property: string\n  /** Value used when the node does not carry `property` at all. */\n  property_absent_default: number\n  /** How the count must relate to the property for the node to match. */\n  node_comparison: 'gt' | 'gte' | 'lt' | 'lte' | 'eq'\n  /** Optional extra per-node presence requirement. */\n  node_filter?: { property: string; present: boolean }\n  /** Property that removes a node from the evaluated population. */\n  except_property?: string\n  /** Value of `except_property` that triggers the exclusion. */\n  except_value?: string\n}\n\n/**\n * Canonical key for one edge-count spec, shared by the collectors that build\n * `nodesByEdgeCountSpec` and the evaluator that reads it. Both sides must\n * agree, so neither spells it inline.\n *\n * Every discriminating field is in the key. Two detectors asking about the same\n * edge and property but with different thresholds, filters or exemptions are\n * different questions and must not collide on one tally.\n *\n * @example\n * edgeCountSpecKey({ entity_type: 'surface', edge_type: 'feature_occupies_surface',\n *   direction: 'inbound', property: 'capacity', property_absent_default: 1,\n *   node_comparison: 'gt', node_filter: { property: 'arbitration_rule', present: false },\n *   except_property: 'composition_mode', except_value: 'chained' })\n * // → \"surface|feature_occupies_surface|inbound|capacity|1|gt|arbitration_rule=absent|composition_mode=chained\"\n */\nexport function edgeCountSpecKey(spec: UPGEdgeCountSpec): string {\n  const filter = spec.node_filter\n    ? `${spec.node_filter.property}=${spec.node_filter.present ? 'present' : 'absent'}`\n    : '*'\n  const except =\n    spec.except_property !== undefined && spec.except_value !== undefined\n      ? `${spec.except_property}=${spec.except_value}`\n      : '*'\n  return [\n    spec.entity_type,\n    spec.edge_type,\n    spec.direction,\n    spec.property,\n    String(spec.property_absent_default),\n    spec.node_comparison,\n    filter,\n    except,\n  ].join('|')\n}\n\n/**\n * Canonical key for one `entity_count` filter, shared by the collectors that\n * build `nodesByEntityFilter` and the evaluator that reads it (0.29.0).\n *\n * Covers all four filter forms in `EntityCheck.filter`. The key encodes the\n * filter as the detector wrote it, so a `present: false` filter and a\n * `present: true` filter over the same property are different keys holding\n * different node sets, and neither has to be derived from the other by\n * subtraction.\n *\n * @example\n * entityFilterKey('surface', { property: 'arbitration_state', value: 'none' })\n * // → \"surface|arbitration_state=none\"\n * entityFilterKey('hypothesis', { status: 'drafted' })\n * // → \"hypothesis|status=drafted\"\n */\nexport function entityFilterKey(\n  entityType: string,\n  filter: Record<string, unknown>,\n): string {\n  const kind = classifyEntityFilter(filter)\n  switch (kind) {\n    case 'presence':\n      return `${entityType}|${filter.property as string}=${filter.present ? 'present' : 'absent'}`\n    case 'value':\n      return `${entityType}|${filter.property as string}=${filter.value as string}`\n    case 'status':\n      return `${entityType}|status=${filter.status as string}`\n    case 'unrecognized':\n      // Unreachable through the catalog: `walkForEntityFilterSpecs` throws on\n      // this shape at module load, so a filter that gets here never made it\n      // into a shipped condition. Kept as a distinct key rather than a silent\n      // catch-all so that if it somehow IS reached, two different unrecognized\n      // filters cannot collide on one tally and dedup each other away.\n      return `${entityType}|<unrecognized>`\n  }\n}\n\n/**\n * Which of the recognised `EntityCheck.filter` shapes this is.\n *\n * The presence form deliberately does NOT branch on `except_property` /\n * `except_value`. Those belong to the aggregate\n * `countsByTypeAndPropertyPresenceExcept` mechanism, which is still supported\n * for counting; ATTRIBUTION for that shape has no declarer, no collector path\n * and no test, and shipping an unexercised parallel path is how the next drift\n * starts. When a detector declares one, its attribution lands with it and with\n * a test. Until then such a filter classifies as `presence` and is attributed\n * on the presence predicate alone, which is a superset and therefore never\n * names a node the detector did not implicate.\n */\nexport function classifyEntityFilter(\n  filter: Record<string, unknown>,\n): 'presence' | 'value' | 'status' | 'unrecognized' {\n  const hasProperty = typeof filter.property === 'string'\n  if (hasProperty && typeof filter.present === 'boolean') return 'presence'\n  if (hasProperty && typeof filter.value === 'string') return 'value'\n  if (typeof filter.status === 'string') return 'status'\n  return 'unrecognized'\n}\n\n/**\n * One `entity_count` filter declared somewhere in `UPG_ANTI_PATTERNS`,\n * flattened for collectors (0.29.0). Attribution only: the counts these\n * filters drive are unchanged and still read the aggregate tallies.\n *\n * @see UPG_ENTITY_FILTER_SPECS\n */\nexport interface UPGEntityFilterSpec {\n  /** Entity type the filter is applied to. */\n  entity_type: string\n  /** The filter exactly as the detector declared it. */\n  filter: Record<string, unknown>\n  /**\n   * Which recognised shape this filter is, resolved once at derivation.\n   *\n   * Carrying it means a collector switches exhaustively on a closed set rather\n   * than re-sniffing the shape and quietly skipping anything it was not taught.\n   * A silent skip there produces a forever-empty match list: attribution dies\n   * with no error and no failing test, which is the worst possible failure for\n   * a feature whose whole job is to name things.\n   */\n  kind: 'presence' | 'value' | 'status'\n}\n\n/** Recursively collect entity-count filter specs from one condition tree. */\nfunction walkForEntityFilterSpecs(\n  cond: IntelligenceCondition,\n  out: UPGEntityFilterSpec[],\n): void {\n  if ('operator' in cond) {\n    for (const child of cond.checks) walkForEntityFilterSpecs(child, out)\n    return\n  }\n  const check = cond.check\n  if (check.type !== 'entity_count' || !check.filter) return\n  const kind = classifyEntityFilter(check.filter)\n  if (kind === 'unrecognized') {\n    // LOUD, AND AT MODULE LOAD. A filter shape nothing can classify would\n    // otherwise reach the collector, match nothing forever, and cost the\n    // detector its attribution in total silence. Failing here means a spec\n    // author learns at the moment they write it, and no shipped build can\n    // contain one.\n    throw new Error(\n      `Unrecognized entity_count filter shape on \"${check.entity_type}\": ` +\n        `${JSON.stringify(check.filter)}. Recognised shapes are ` +\n        `{ property, present }, { property, value } and { status }. ` +\n        `Teach classifyEntityFilter + the collector before declaring a new one.`,\n    )\n  }\n  const key = entityFilterKey(check.entity_type, check.filter)\n  if (out.some((s) => entityFilterKey(s.entity_type, s.filter) === key)) return\n  out.push({ entity_type: check.entity_type, filter: check.filter, kind })\n}\n\n/**\n * Every `entity_count` filter the catalog declares (0.29.0), so collectors can\n * record which nodes matched each one without indexing the whole graph.\n *\n * The catalog declares FOUR filters in total (one status form, three value\n * forms), which is what makes per-node attribution affordable here: a handful\n * of predicate evaluations per node, rather than an id list for every (type,\n * property, value) triple that happens to exist in the data.\n *\n * Note there is no `present` form among them since 0.29.0, when the contention\n * branch moved to `EdgeCountVsPropertyCheck`. The only `present: false` left in\n * the catalog is that check's `node_filter`, which this walk correctly does not\n * collect: it is a per-node clause on a different check type, tallied through\n * `UPG_EDGE_COUNT_SPECS` instead. The count is asserted in the tests rather\n * than trusted to this comment.\n */\nexport const UPG_ENTITY_FILTER_SPECS: readonly UPGEntityFilterSpec[] = (() => {\n  const out: UPGEntityFilterSpec[] = []\n  for (const ap of UPG_ANTI_PATTERNS) {\n    if (ap.structured_condition) walkForEntityFilterSpecs(ap.structured_condition, out)\n  }\n  return out\n})()\n\n/**\n * Normalise one `edge_count_vs_property` check into its spec.\n *\n * THE ONLY PLACE THIS SHAPE IS CONSTRUCTED. The spec has nine fields and every\n * one of them is keyed into `edgeCountSpecKey`, so a second construction site\n * that forgot to apply the `direction` default (or added a field) would produce\n * a key that silently misses the collector's entry, and the check would read as\n * \"no node matched\" rather than failing. Collector, evaluator and attribution\n * all route through here.\n */\nexport function checkToEdgeCountSpec(check: EdgeCountVsPropertyCheck): UPGEdgeCountSpec {\n  return {\n    entity_type: check.entity_type,\n    edge_type: check.edge_type,\n    direction: check.direction ?? 'inbound',\n    property: check.property,\n    property_absent_default: check.property_absent_default,\n    node_comparison: check.node_comparison,\n    node_filter: check.node_filter,\n    except_property: check.except_property,\n    except_value: check.except_value,\n  }\n}\n\n/** Recursively collect edge-count specs from one condition tree. */\nfunction walkForEdgeCountSpecs(\n  cond: IntelligenceCondition,\n  out: UPGEdgeCountSpec[],\n): void {\n  if ('operator' in cond) {\n    for (const child of cond.checks) walkForEdgeCountSpecs(child, out)\n    return\n  }\n  const check = cond.check\n  if (check.type !== 'edge_count_vs_property') return\n  const spec = checkToEdgeCountSpec(check)\n  const key = edgeCountSpecKey(spec)\n  if (!out.some((s) => edgeCountSpecKey(s) === key)) out.push(spec)\n}\n\n/**\n * Every per-node edge-count check the catalog declares (0.29.0).\n *\n * Same contract as `UPG_PRESENCE_EXCEPT_SPECS`: the catalog states what it\n * needs, collectors compute exactly that and nothing more. Indexing every\n * (type, edge type, property) triple speculatively would tax every\n * `validate_graph` call to serve one detector, and unlike the aggregate counts\n * these tallies cannot be derived from each other.\n *\n * Today the list holds one entry (surface occupancy against `capacity`), and it\n * stays correct without maintenance because it is derived from the conditions\n * themselves.\n */\nexport const UPG_EDGE_COUNT_SPECS: readonly UPGEdgeCountSpec[] = (() => {\n  const out: UPGEdgeCountSpec[] = []\n  for (const ap of UPG_ANTI_PATTERNS) {\n    if (ap.structured_condition) walkForEdgeCountSpecs(ap.structured_condition, out)\n  }\n  return out\n})()\n\n/**\n * Look up a curated anti-pattern by its slug id.\n *\n * @example\n * getAntiPatternById('features-without-hypotheses')?.severity // → 'high'\n * getAntiPatternById('not-a-real-pattern') // → undefined\n */\nexport function getAntiPatternById(id: string): UPGCuratedAntiPattern | undefined {\n  return UPG_ANTI_PATTERNS.find((ap) => ap.id === id)\n}\n\n/**\n * Filter the curated set to anti-patterns relevant at a given product stage.\n *\n * @example\n * const concept = getAntiPatternsForStage('concept')\n * concept.every(ap => ap.stages.includes('concept')) // → true\n */\nexport function getAntiPatternsForStage(stage: UPGProductStage): readonly UPGCuratedAntiPattern[] {\n  return UPG_ANTI_PATTERNS.filter((ap) => ap.stages.includes(stage))\n}\n\n/**\n * Filter the curated set by severity tier.\n *\n * @example\n * getAntiPatternsBySeverity('high').length >= 1 // → true\n */\nexport function getAntiPatternsBySeverity(\n  severity: UPGAntiPatternSeverity,\n): readonly UPGCuratedAntiPattern[] {\n  return UPG_ANTI_PATTERNS.filter((ap) => ap.severity === severity)\n}\n","/**\n * Per-member-kind validation profiles (0.17.0).\n *\n * A workspace member graph is graded against a profile chosen by its\n * `member_kind`. Before 0.17.0 the only kind-aware behaviour was a single\n * hard-coded `member_kind === 'watched'` branch in the MCP `validate_graph`\n * tool that demoted ALL anti-pattern violations wholesale; `org_rollup` got no\n * relaxation, and the cloud server had no equivalent. This module lifts that into\n * the spec core as a table so every consumer (local MCP, cloud MCP, the site)\n * grades each kind the same way, and a new kind is a row, not a bespoke branch.\n *\n * Two axes per profile:\n * - `evaluate_concerns` — which anti-pattern concern families are RUN + reported.\n * - `gating_concerns` — the subset whose fired violations flip `valid` (the rest\n *   are advisory: reported, non-gating).\n *\n * The concern of each curated anti-pattern is looked up by id from\n * `UPG_ANTI_PATTERN_CONCERNS` (kept here rather than inline on each pattern so the\n * whole classification reads in one place). Unlisted ids default to\n * `product_spine`. Portfolio-scoped patterns are unlisted — the single-graph\n * evaluator skips them regardless.\n *\n * https://unifiedproductgraph.org | MIT\n */\n\n/**\n * The concern family an anti-pattern belongs to — the axis a per-member-kind\n * profile switches on.\n * - `product_spine` — presupposes a shippable product (personas/jobs, features/\n *   hypotheses, roadmap→outcome, competitors, journeys). A category error for a\n *   non-product graph.\n * - `universal` — kind-independent: graph hygiene (orphans, single-domain) and\n *   strategy discipline (objectives→key results). Applies to every kind.\n * - `operating` — operating_function expectation (a metric to operate toward,\n *   real operating content). Only meaningful for that kind.\n */\nexport type UPGAntiPatternConcern = 'product_spine' | 'universal' | 'operating'\n\n/** Member-kind keys for the profile table. Mirrors the `member_kind` union on\n *  `UPGDocument`; kept as a local literal because the SDK's `UPG_MEMBER_KINDS`\n *  const is downstream of the spec core. */\nexport type UPGMemberKindKey = 'product' | 'org_rollup' | 'watched' | 'operating_function'\n\n/**\n * Concern family per curated anti-pattern id. Unlisted ids default to\n * `product_spine` (the conservative classification: gated for product, suppressed\n * for operating_function). The single-graph evaluator skips portfolio-scoped\n * patterns, so they are intentionally absent here.\n */\nexport const UPG_ANTI_PATTERN_CONCERNS: Readonly<Record<string, UPGAntiPatternConcern>> = {\n  // universal — kind-independent graph hygiene + strategy discipline\n  'objective-without-key-results': 'universal',\n  'single-domain-graph': 'universal',\n  'orphan-loose-thoughts': 'universal',\n  // operating — only evaluated for operating_function graphs\n  'operating-function-without-north-star': 'operating',\n  'operating-function-without-operating-content': 'operating',\n  // everything else defaults to 'product_spine'\n}\n\n/** The concern family for a curated anti-pattern id (default `product_spine`). */\nexport function concernFor(antiPatternId: string): UPGAntiPatternConcern {\n  return UPG_ANTI_PATTERN_CONCERNS[antiPatternId] ?? 'product_spine'\n}\n\nexport interface UPGValidationProfile {\n  /** Concern families whose patterns are EVALUATED (run + reported) for this kind. */\n  evaluate_concerns: readonly UPGAntiPatternConcern[]\n  /** Concern families whose fired violations GATE `valid` (a subset of `evaluate_concerns`). */\n  gating_concerns: readonly UPGAntiPatternConcern[]\n}\n\n/**\n * The per-member-kind validation profile table.\n *\n * - `product` — the default; evaluates and gates the full product set. Identical\n *   to pre-0.17.0 behaviour.\n * - `watched` — a monitored competitor-intelligence graph: product-thinking\n *   patterns are category errors, so everything is advisory (gates nothing).\n *   Reproduces the old hard-coded watched suppression, now in the core.\n * - `org_rollup` — the company umbrella: product-spine is a category error\n *   (advisory) but universal hygiene still gates. (Pre-0.17.0 it incorrectly\n *   gated product-spine too.)\n * - `operating_function` — a function a team operates: product-spine is not even\n *   evaluated (no noise); universal hygiene and the operating spine gate.\n */\nexport const UPG_VALIDATION_PROFILES: Readonly<Record<UPGMemberKindKey, UPGValidationProfile>> = {\n  product: { evaluate_concerns: ['product_spine', 'universal'], gating_concerns: ['product_spine', 'universal'] },\n  watched: { evaluate_concerns: ['product_spine', 'universal'], gating_concerns: [] },\n  org_rollup: { evaluate_concerns: ['product_spine', 'universal'], gating_concerns: ['universal'] },\n  operating_function: { evaluate_concerns: ['universal', 'operating'], gating_concerns: ['universal', 'operating'] },\n}\n\n/** Resolve a member kind to its profile; unknown/absent kinds fall back to\n *  `product` (gate-everything) for back-compat safety. */\nexport function validationProfileFor(kind: string | undefined): UPGValidationProfile {\n  return UPG_VALIDATION_PROFILES[(kind ?? 'product') as UPGMemberKindKey] ?? UPG_VALIDATION_PROFILES.product\n}\n\n/** Is an anti-pattern of this concern EVALUATED (run + reported) for this kind? */\nexport function concernEvaluatedFor(kind: string | undefined, concern: UPGAntiPatternConcern): boolean {\n  return validationProfileFor(kind).evaluate_concerns.includes(concern)\n}\n\n/** Does a fired violation of this concern GATE `valid` for this kind? */\nexport function concernGatesFor(kind: string | undefined, concern: UPGAntiPatternConcern): boolean {\n  return validationProfileFor(kind).gating_concerns.includes(concern)\n}\n\n// ─── Thin-graph softening (0.17.0, companion C) ──────────────────────────────\n\n/**\n * Coverage / benchmark anti-patterns that presuppose a graph has grown enough to\n * expect breadth (multiple domains, several personas, a competitor set). On a\n * brand-new thin graph they fire as false alarms — a 3-node stub is not the same\n * as a drifted product. Below `THIN_GRAPH_THRESHOLD` total entities these are\n * demoted to advisory (reported, non-gating) for every member kind, so an\n * intentionally-thin stub is not indistinguishable from drift.\n */\nexport const COVERAGE_ANTI_PATTERNS: ReadonlySet<string> = new Set([\n  'single-domain-graph',\n  'persona-count-below-stage-benchmark',\n  'competitors-missing-past-validation',\n  // surface companions (0.27.0): both presuppose the graph has grown past the\n  // point where a place is worth justifying and measuring. A stub that has\n  // sketched one surface has not yet drifted. `contended-surface-without-\n  // arbitration` is deliberately NOT here: it only fires once features actually\n  // occupy surfaces, which is itself the evidence that the graph has grown.\n  'surface-without-job',\n  'surface-without-measurement',\n])\n\n/** A graph with fewer than this many entities is treated as too thin to grade on\n *  coverage breadth. */\nexport const THIN_GRAPH_THRESHOLD = 8\n\n/** True when a fired coverage anti-pattern should be advisory (not gating) because\n *  the graph is still too thin to expect breadth. */\nexport function isThinCoverageAdvisory(antiPatternId: string, totalEntityCount: number): boolean {\n  return COVERAGE_ANTI_PATTERNS.has(antiPatternId) && totalEntityCount < THIN_GRAPH_THRESHOLD\n}\n","/**\n * UPG Anti-Pattern Evaluator. Pure function over pre-computed graph stats.\n * Walks `UPG_ANTI_PATTERNS`, evaluates each `structured_condition` against\n * `AntiPatternInputs`, returns the violations.\n *\n * Synchronous. Collectors live outside this package (`packages/upg-sdk/src/lib/anti-pattern-inputs.ts`).\n * Covers every leaf check type in `IntelligenceCondition`; composes recursively.\n *\n * https://unifiedproductgraph.org | MIT\n */\n\nimport type {\n  IntelligenceCondition,\n  EntityCheck,\n  RelationshipCheck,\n  BenchmarkCheck,\n  TotalEntityCountCheck,\n  DomainCountCheck,\n  DomainPopulationCheck,\n  OrphanCheck,\n  EdgeCountVsPropertyCheck,\n} from './intelligence.js'\nimport type {\n  UPGCuratedAntiPattern,\n  UPGAntiPatternSeverity,\n} from './anti-patterns.js'\nimport {\n  UPG_ANTI_PATTERNS,\n  presenceExceptKey,\n  edgeCountSpecKey,\n  entityFilterKey,\n  checkToEdgeCountSpec,\n} from './anti-patterns.js'\nimport { getBenchmark } from './benchmarks/index.js'\nimport type { UPGProductStage } from './benchmarks/types.js'\nimport { concernFor, concernEvaluatedFor } from './validation-profiles.js'\nimport type { UPGAntiPatternConcern } from './validation-profiles.js'\n\n// ─── Inputs ──────────────────────────────────────────────────────────────────\n\n/**\n * Pre-computed graph statistics consumed by the evaluator.\n *\n * Per-server collectors derive this from their own store: in-memory walks for\n * the local mcp-server, SQL queries for the cloud server. The evaluator\n * doesn't care which.\n *\n * Severity / id filters live on the evaluator's `options` arg, not here, so\n * callers can re-filter the same inputs without recollecting.\n */\nexport interface AntiPatternInputs {\n  /** Per-type entity counts. Example: `{ persona: 4, job: 2, feature: 0 }` */\n  countsByType: Record<string, number>\n\n  /**\n   * Per-type counts filtered by `status`. Only required for anti-patterns with\n   * a `filter.status` clause (currently 1: `untested-hypothesis-pile-up`).\n   * Example: `{ hypothesis: { drafted: 5, active: 2 } }`.\n   */\n  countsByTypeAndStatus?: Record<string, Record<string, number>>\n\n  /**\n   * Per-type counts filtered by a property value (0.17.0). Only required for\n   * anti-patterns with a `filter: { property, value }` clause (e.g.\n   * `operating-function-without-north-star` counts `metric` where\n   * `designation === 'north_star'`). Shape: type → property key → value → count.\n   */\n  countsByTypeAndProperty?: Record<string, Record<string, Record<string, number>>>\n\n  /**\n   * Per-type counts of entities that CARRY a non-empty value for a property\n   * (0.27.0). Only required for anti-patterns with a\n   * `filter: { property, present }` clause (e.g.\n   * `contended-surface-without-arbitration` counts surfaces with NO\n   * `arbitration_rule`). Shape: type → property key → count of entities of that\n   * type with a value. The evaluator derives the \"absent\" count by subtracting\n   * from `countsByType`, so a collector never has to enumerate absences.\n   * Absent input reads as zero, so a stale collector degrades to \"nothing\n   * carries this property\" rather than crashing.\n   */\n  countsByTypeAndPropertyPresence?: Record<string, Record<string, number>>\n\n  /**\n   * As `countsByTypeAndPropertyPresence`, but counted over a population that\n   * EXCLUDES entities carrying a declared exemption (0.28.0). Only required for\n   * anti-patterns with a `filter: { property, present, except_property,\n   * except_value }` clause (currently 1:\n   * `contended-surface-without-arbitration`, which exempts surfaces that have\n   * declared `composition_mode: 'chained'`).\n   *\n   * Shape: type → `presenceExceptKey(property, except_property, except_value)`\n   * → count of entities of that type that carry a value for `property` AND are\n   * NOT exempt. The evaluator derives the absent-and-not-exempt count from this\n   * plus `countsByType` and `countsByTypeAndProperty`, so collectors still\n   * never enumerate absences.\n   *\n   * Collectors build it by walking `UPG_PRESENCE_EXCEPT_SPECS` rather than\n   * indexing property pairs speculatively, which would be quadratic in\n   * properties-per-node for the benefit of one detector. Absent input reads as\n   * zero, which makes a stale collector OVER-report (every non-exempt entity\n   * reads as missing the property) rather than silently under-report — the safe\n   * direction for a check whose job is to notice omissions.\n   */\n  countsByTypeAndPropertyPresenceExcept?: Record<string, Record<string, number>>\n\n  /**\n   * Node ids matching each declared per-node edge-count check (0.29.0). Shape:\n   * `edgeCountSpecKey(spec)` → the ids of the nodes that matched.\n   *\n   * The COUNT is the array length, so this input carries both halves of the\n   * check: what fired, and which nodes it fired about. Collectors build it by\n   * walking `UPG_EDGE_COUNT_SPECS`, never speculatively.\n   *\n   * A SEEDED-BUT-EMPTY entry and a MISSING entry mean different things, and\n   * collectors must keep them distinct. Empty means \"nothing matched\" and the\n   * check clears. Missing means \"this collector predates the spec\", and the\n   * evaluator falls back to assuming every node of the type matched, preserving\n   * the 0.28.0 property that a stale collector over-reports rather than\n   * silently retiring the detector. Attribution stays empty on that path: a\n   * fabricated node id is worse than an unattributed violation.\n   */\n  nodesByEdgeCountSpec?: Record<string, string[]>\n\n  /**\n   * Node ids matching each declared `entity_count` filter (0.29.0), for\n   * ATTRIBUTION ONLY. Shape: `entityFilterKey(entity_type, filter)` → ids.\n   *\n   * Counts are unaffected: every `entity_count` comparison still reads the\n   * aggregate tallies above, exactly as it did before this input existed. This\n   * runs alongside purely so a fired violation can name nodes, which means a\n   * collector that omits it loses attribution and changes no verdict.\n   *\n   * Bounded by declaration, like every other spec-driven input here: the whole\n   * catalog declares four filters, so this is a handful of predicate\n   * evaluations per node rather than an index over every property.\n   */\n  nodesByEntityFilter?: Record<string, string[]>\n\n  /**\n   * Boolean presence per `(source_type, edge_type, target_type)` tuple.\n   * Key format: `${source_type}|${edge_type}|${target_type}`.\n   * `true` iff at least one edge of that exact shape exists in the graph.\n   */\n  edgePresence: Record<string, boolean>\n\n  /**\n   * Per-domain population. `true` iff the domain has at least one entity.\n   * Example: `{ product_spec: true, validation: false, ... }`.\n   */\n  domainPopulation: Record<string, boolean>\n\n  /** Total node count in the graph. */\n  totalEntityCount: number\n\n  /** Number of distinct domains with at least one entity. */\n  domainCount: number\n\n  /** Nodes with zero in-edges AND zero out-edges. */\n  orphanCount: number\n\n  /**\n   * Active product stage. Used to filter `UPG_ANTI_PATTERNS[i].stages[]`.\n   * If undefined, the evaluator runs all patterns regardless of stage gating\n   * (safer default: surface everything when stage is unknown).\n   */\n  productStage?: UPGProductStage\n\n  /**\n   * Workspace member kind (0.17.0). Selects the validation profile that decides\n   * which anti-pattern concern families are evaluated for this graph. Absent =\n   * `product` (evaluate the full product set; back-compat).\n   */\n  memberKind?: string\n}\n\n// ─── Output ──────────────────────────────────────────────────────────────────\n\n/**\n * One fired anti-pattern, lifted from the catalog with prose attached.\n *\n * `target_entities` is filled from the catalog's referenced entity-type\n * strings. Phase 1 keeps these as types; Phase 1.x will promote to specific\n * entity ids once the input collector tracks them.\n */\nexport interface AntiPatternViolation {\n  anti_pattern_id: string\n  name: string\n  severity: UPGAntiPatternSeverity\n  /** The concern family this pattern belongs to (0.17.0). Lets callers partition\n   *  fired violations into gating vs advisory per the member-kind profile. */\n  concern: UPGAntiPatternConcern\n  /** Entity-type strings the catalog references. Phase 1: types, not ids. */\n  target_entities: string[]\n  /**\n   * The specific nodes this violation is about (0.29.0), where the fired\n   * condition could name them. Sorted, deduplicated, and drawn only from the\n   * branches that actually contributed to the fire.\n   *\n   * ABSENT MEANS \"THIS DETECTOR CANNOT NAME NODES\", NOT \"NO NODES\". Most\n   * patterns here are whole-graph approximations of per-node rules: they\n   * compare aggregate tallies against constants, so they can say a graph has a\n   * problem without knowing where it lives. Only checks that evaluate nodes one\n   * at a time attribute, plus the declared `entity_count` filters.\n   *\n   * ATTRIBUTION IS PARTIAL, AND PARTIAL PER TYPE. A violation may name nodes of\n   * one type while saying nothing about another type in `target_entities`: the\n   * contention detector names surfaces and never the features occupying them,\n   * though both types appear there. So a consumer must NOT read a non-empty\n   * list as \"these are the only implicated entities\".\n   *\n   * The contract for a reverse lookup is: this list is authoritative for the\n   * types it actually covers, and silent about every other type, which must\n   * keep resolving through `target_entities`. Reading it as globally\n   * authoritative makes entities of the uncovered types unreachable, which is\n   * a reachability regression dressed up as precision.\n   *\n   * Optional so every existing consumer keeps compiling and behaving as before.\n   */\n  target_node_ids?: string[]\n  description: string\n  why_it_matters: string\n  remediation: string\n  source?: UPGCuratedAntiPattern['source']\n}\n\n// ─── Options ─────────────────────────────────────────────────────────────────\n\nexport interface EvaluateAntiPatternsOptions {\n  /** Filter to one severity tier. */\n  severity?: UPGAntiPatternSeverity\n  /** Restrict evaluation to a subset of anti-pattern ids. */\n  anti_pattern_ids?: string[]\n}\n\n// ─── Severity ordering ──────────────────────────────────────────────────────\n\nconst SEVERITY_ORDER: Record<UPGAntiPatternSeverity, number> = {\n  high: 0,\n  medium: 1,\n  low: 2,\n}\n\n// ─── Public entry point ──────────────────────────────────────────────────────\n\n/**\n * Evaluate the curated anti-pattern catalog against a graph's pre-computed\n * stats. Returns the violations, sorted high → medium → low, then by id asc.\n *\n * @param inputs The pre-computed graph stats (see `AntiPatternInputs`).\n * @param options Optional filters: `severity`, `anti_pattern_ids` subset.\n *\n * @example\n *   const violations = evaluateAntiPatterns(inputs)\n *   const highOnly = evaluateAntiPatterns(inputs, { severity: 'high' })\n *   const subset = evaluateAntiPatterns(inputs, {\n *     anti_pattern_ids: ['features-without-hypotheses', 'orphan-loose-thoughts'],\n *   })\n */\nexport function evaluateAntiPatterns(\n  inputs: AntiPatternInputs,\n  options?: EvaluateAntiPatternsOptions,\n): AntiPatternViolation[] {\n  const severityFilter = options?.severity\n  const idFilter = options?.anti_pattern_ids\n    ? new Set(options.anti_pattern_ids)\n    : undefined\n\n  const fires: AntiPatternViolation[] = []\n  for (const ap of UPG_ANTI_PATTERNS) {\n    // Portfolio-scoped patterns are evaluated by portfolio_validate with\n    // cross-product + registry context this single-graph evaluator cannot\n    // express. Skip them here so one graph is never flipped invalid by a\n    // portfolio pattern. The guard also defends a missing structured_condition.\n    if (ap.scope === 'portfolio' || !ap.structured_condition) continue\n    if (severityFilter && ap.severity !== severityFilter) continue\n    if (idFilter && !idFilter.has(ap.id)) continue\n    // Stage gating: when productStage is provided, skip patterns that don't\n    // declare it. When undefined, run all (safer default, see docstring).\n    if (\n      inputs.productStage &&\n      !ap.stages.includes(inputs.productStage)\n    ) {\n      continue\n    }\n    // Member-kind profile gating (0.17.0): only evaluate the concern families the\n    // member kind's profile includes. A product graph (default) evaluates\n    // product_spine + universal — the full existing set, so behaviour is\n    // unchanged — while an operating_function graph skips product-spine entirely\n    // and evaluates the operating spine instead.\n    const concern = concernFor(ap.id)\n    if (!concernEvaluatedFor(inputs.memberKind, concern)) continue\n\n    if (evaluateCondition(ap.structured_condition, inputs)) {\n      // Attribution runs as a SECOND walk, only on patterns that actually\n      // fired. Keeping it out of `evaluateCondition` means the verdict path is\n      // byte-identical to its pre-0.29.0 behaviour: attribution can be wrong,\n      // absent or stale without ever changing whether a pattern fires.\n      const ids = new Set<string>()\n      collectAttribution(ap.structured_condition, inputs, ids)\n      const violation = buildViolation(ap, concern)\n      if (ids.size > 0) violation.target_node_ids = [...ids].sort()\n      fires.push(violation)\n    }\n  }\n\n  // Stable sort: high → medium → low, then by anti_pattern_id asc.\n  fires.sort((a, b) => {\n    const sd = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity]\n    if (sd !== 0) return sd\n    return a.anti_pattern_id.localeCompare(b.anti_pattern_id)\n  })\n\n  return fires\n}\n\n// ─── Attribution ─────────────────────────────────────────────────────────────\n\n/**\n * Walk a FIRED condition tree and collect the node ids the fire is about.\n *\n * Only called after the pattern has already fired, so this never influences a\n * verdict. Two rules decide what contributes:\n *\n *  1. ONLY TRUE BRANCHES. Under `or`, a branch that did not fire says nothing\n *     about any node, so its ids stay out. Under `and`, every child is true by\n *     construction, so every attributing child contributes.\n *  2. ONLY ACCUSING CHECKS. An unfiltered `entity_count` (\"this graph has\n *     surfaces\") is a population GATE, not an accusation, and attributing every\n *     surface to a violation because the gate passed would reproduce the exact\n *     \"whole roster stays lit\" problem attribution exists to fix. So bare\n *     counts, relationship shapes, benchmarks and graph-shape checks attribute\n *     nothing; filtered `entity_count` checks and `edge_count_vs_property`\n *     checks attribute.\n */\nfunction collectAttribution(\n  cond: IntelligenceCondition,\n  inputs: AntiPatternInputs,\n  out: Set<string>,\n): void {\n  if ('operator' in cond) {\n    for (const child of cond.checks) {\n      // Rule 1: under `or`, skip branches that did not themselves fire.\n      if (cond.operator === 'or' && !evaluateCondition(child, inputs)) continue\n      collectAttribution(child, inputs, out)\n    }\n    return\n  }\n  const check = cond.check\n  if (check.type === 'edge_count_vs_property') {\n    const key = edgeCountSpecKey(checkToEdgeCountSpec(check))\n    for (const id of inputs.nodesByEdgeCountSpec?.[key] ?? []) out.add(id)\n    return\n  }\n  if (check.type === 'entity_count' && check.filter) {\n    // Rule 2: filtered counts accuse; bare counts gate.\n    const key = entityFilterKey(check.entity_type, check.filter)\n    for (const id of inputs.nodesByEntityFilter?.[key] ?? []) out.add(id)\n  }\n}\n\n// ─── Condition dispatch ──────────────────────────────────────────────────────\n\nfunction evaluateCondition(\n  cond: IntelligenceCondition,\n  inputs: AntiPatternInputs,\n): boolean {\n  if ('check' in cond) {\n    return evaluateLeaf(cond.check, inputs)\n  }\n  // Compound: 'and' | 'or' over `checks: []`.\n  if (cond.operator === 'and') {\n    for (const child of cond.checks) {\n      if (!evaluateCondition(child, inputs)) return false\n    }\n    return true\n  }\n  // 'or'\n  for (const child of cond.checks) {\n    if (evaluateCondition(child, inputs)) return true\n  }\n  return false\n}\n\ntype LeafCheck =\n  | EntityCheck\n  | RelationshipCheck\n  | BenchmarkCheck\n  | TotalEntityCountCheck\n  | DomainCountCheck\n  | DomainPopulationCheck\n  | OrphanCheck\n  | EdgeCountVsPropertyCheck\n\nfunction evaluateLeaf(check: LeafCheck, inputs: AntiPatternInputs): boolean {\n  switch (check.type) {\n    case 'entity_count':\n      return evaluateEntityCount(check, inputs)\n    case 'edge_count_vs_property':\n      return evaluateEdgeCountVsProperty(check, inputs)\n    case 'relationship':\n      return evaluateRelationship(check, inputs)\n    case 'benchmark':\n      return evaluateBenchmark(check, inputs)\n    case 'total_entity_count':\n      return evaluateTotalEntityCount(check, inputs)\n    case 'domain_count':\n      return evaluateDomainCount(check, inputs)\n    case 'domain_population':\n      return evaluateDomainPopulation(check, inputs)\n    case 'orphan_count':\n      return evaluateOrphanCount(check, inputs)\n    default: {\n      // Exhaustiveness: if a new check type lands without a handler, this\n      // assignment fails to type-check. At runtime, treat as a no-fire.\n      const _exhaustive: never = check\n      void _exhaustive\n      return false\n    }\n  }\n}\n\n// ─── Numeric comparison helper ───────────────────────────────────────────────\n\ntype NumericComparison =\n  | 'eq'\n  | 'gt'\n  | 'lt'\n  | 'gte'\n  | 'lte'\n  | 'zero'\n  | 'nonzero'\n\nfunction compareNumber(\n  value: number,\n  comparison: NumericComparison,\n  threshold: number | undefined,\n): boolean {\n  switch (comparison) {\n    case 'zero':\n      return value === 0\n    case 'nonzero':\n      return value !== 0\n    case 'eq':\n      return threshold !== undefined && value === threshold\n    case 'gt':\n      return threshold !== undefined && value > threshold\n    case 'lt':\n      return threshold !== undefined && value < threshold\n    case 'gte':\n      return threshold !== undefined && value >= threshold\n    case 'lte':\n      return threshold !== undefined && value <= threshold\n    default:\n      return false\n  }\n}\n\n// ─── Per-check type handlers ─────────────────────────────────────────────────\n\nfunction evaluateEntityCount(\n  check: EntityCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  const filter = check.filter as\n    | {\n        status?: unknown\n        property?: unknown\n        value?: unknown\n        present?: unknown\n        except_property?: unknown\n        except_value?: unknown\n      }\n    | undefined\n\n  let count = 0\n  if (\n    filter &&\n    typeof filter.property === 'string' &&\n    typeof filter.present === 'boolean' &&\n    typeof filter.except_property === 'string' &&\n    typeof filter.except_value === 'string'\n  ) {\n    // Except-qualified presence filter (0.28.0): as the presence filter below,\n    // but entities carrying the declared exemption are removed from BOTH sides\n    // of the subtraction first. Checked before the plain presence form because\n    // it is a strict refinement of it.\n    //\n    // eligible  = (all of type) - (those declaring the exemption)\n    // withValue = those carrying the property, exemption-holders already excluded\n    //             (the collector counts over the eligible population)\n    const key = presenceExceptKey(filter.property, filter.except_property, filter.except_value)\n    const exempt =\n      inputs.countsByTypeAndProperty?.[check.entity_type]?.[filter.except_property]?.[\n        filter.except_value\n      ] ?? 0\n    const eligible = Math.max(0, (inputs.countsByType[check.entity_type] ?? 0) - exempt)\n    const withValue =\n      inputs.countsByTypeAndPropertyPresenceExcept?.[check.entity_type]?.[key] ?? 0\n    count = filter.present ? Math.min(withValue, eligible) : Math.max(0, eligible - withValue)\n  } else if (filter && typeof filter.property === 'string' && typeof filter.present === 'boolean') {\n    // Property-presence filter (0.27.0): count entities of this type that DO\n    // (present: true) or DO NOT (present: false) carry a non-empty value for\n    // the named property. The absence form is the one a value-keyed filter\n    // cannot express, because the collector only indexes values that exist;\n    // it is derived as (all of type) - (those carrying a value).\n    const withValue =\n      inputs.countsByTypeAndPropertyPresence?.[check.entity_type]?.[filter.property] ?? 0\n    count = filter.present\n      ? withValue\n      : Math.max(0, (inputs.countsByType[check.entity_type] ?? 0) - withValue)\n  } else if (filter && typeof filter.property === 'string' && typeof filter.value === 'string') {\n    // Property-value filter (0.17.0): count entities of this type whose property\n    // equals the value, e.g. metric where designation == 'north_star'.\n    count = inputs.countsByTypeAndProperty?.[check.entity_type]?.[filter.property]?.[filter.value] ?? 0\n  } else if (filter && typeof filter.status === 'string') {\n    count = inputs.countsByTypeAndStatus?.[check.entity_type]?.[filter.status] ?? 0\n  } else {\n    count = inputs.countsByType[check.entity_type] ?? 0\n  }\n  return compareNumber(count, check.comparison, check.threshold)\n}\n\n/**\n * Per-node edge-count check (0.29.0). The collector has already done the\n * per-node arithmetic and handed us the ids that matched; the evaluator's job\n * is only the aggregate comparison over how many there were.\n *\n * The division of labour matters for projection (0.30.0): because the matching\n * happens in the collector, over whatever node and edge set the collector was\n * given, running this check against one configuration of a graph costs nothing\n * beyond building the collector on a filtered store. A check that reached past\n * the collector to the live store would be permanently blind to that.\n */\nfunction evaluateEdgeCountVsProperty(\n  check: EdgeCountVsPropertyCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  const key = edgeCountSpecKey(checkToEdgeCountSpec(check))\n  const matched = inputs.nodesByEdgeCountSpec?.[key]\n  if (matched === undefined) {\n    // STALE COLLECTOR, not an honest zero. Collectors SEED every declared spec\n    // with an empty array before walking, precisely so these two cases are\n    // distinguishable: a present-but-empty entry means \"nothing matched\", a\n    // missing entry means \"this collector predates the spec and computed\n    // nothing\". Reading the second as zero would silently retire the check\n    // against any older collector in the tree.\n    //\n    // So fall back to the worst case the aggregate tallies can support: assume\n    // every node of the type matched. That preserves the 0.28.0 property that a\n    // stale collector OVER-reports rather than under-reporting, which is the\n    // safe failure for a detector whose job is noticing omissions. Attribution\n    // deliberately yields nothing in this path: the ids would be guesses, and a\n    // fabricated node id is worse than an unattributed violation.\n    return compareNumber(\n      inputs.countsByType[check.entity_type] ?? 0,\n      check.comparison,\n      check.threshold,\n    )\n  }\n  return compareNumber(matched.length, check.comparison, check.threshold)\n}\n\nfunction relationshipKey(\n  source_type: string,\n  edge_type: string,\n  target_type: string,\n): string {\n  return `${source_type}|${edge_type}|${target_type}`\n}\n\nfunction evaluateRelationship(\n  check: RelationshipCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  const key = relationshipKey(check.source_type, check.edge_type, check.target_type)\n  const present = inputs.edgePresence[key] ?? false\n  switch (check.comparison) {\n    case 'exists':\n      return present\n    case 'not_exists':\n      return !present\n    case 'count_gt':\n    case 'count_lt':\n      // Phase 1 ships boolean presence only. None of the 12 curated\n      // anti-patterns use `count_gt` / `count_lt` against a relationship;\n      // promote to per-edge counts when a future pattern needs it.\n      return false\n    default:\n      return false\n  }\n}\n\nfunction evaluateBenchmark(\n  check: BenchmarkCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  // Without a productStage, the benchmark range is undefined. Treat as\n  // 'no benchmark applicable here, no fire'. The catalog's stages[] gating\n  // would normally suppress this anyway; the guard keeps the evaluator pure.\n  if (!inputs.productStage) return false\n  const range = getBenchmark(check.entity_type, inputs.productStage)\n  if (!range) {\n    // No expected range at this stage. `'missing'` interprets that as a fire;\n    // the other comparisons treat it as \"nothing to compare\" → no fire.\n    return check.comparison === 'missing'\n  }\n  const count = inputs.countsByType[check.entity_type] ?? 0\n  switch (check.comparison) {\n    case 'below_min':\n      return count < range.min\n    case 'above_max':\n      return count > range.max\n    case 'within_range':\n      return count >= range.min && count <= range.max\n    case 'missing':\n      // Range exists for this stage → not 'missing'.\n      return false\n    default:\n      return false\n  }\n}\n\nfunction evaluateTotalEntityCount(\n  check: TotalEntityCountCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  return compareNumber(inputs.totalEntityCount, check.comparison, check.threshold)\n}\n\nfunction evaluateDomainCount(\n  check: DomainCountCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  return compareNumber(inputs.domainCount, check.comparison, check.threshold)\n}\n\nfunction evaluateDomainPopulation(\n  check: DomainPopulationCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  const populated = inputs.domainPopulation[check.domain_id] ?? false\n  switch (check.comparison) {\n    case 'zero':\n      return !populated\n    case 'nonzero':\n      return populated\n    case 'gt':\n    case 'lt':\n      // Phase 1 ships boolean population only. None of the 12 curated\n      // anti-patterns use gt/lt against domain_population.\n      return false\n    default:\n      return false\n  }\n}\n\nfunction evaluateOrphanCount(\n  check: OrphanCheck,\n  inputs: AntiPatternInputs,\n): boolean {\n  return compareNumber(inputs.orphanCount, check.comparison, check.threshold)\n}\n\n// ─── Violation construction ──────────────────────────────────────────────────\n\nfunction buildViolation(ap: UPGCuratedAntiPattern, concern: UPGAntiPatternConcern): AntiPatternViolation {\n  return {\n    anti_pattern_id: ap.id,\n    name: ap.name,\n    severity: ap.severity,\n    concern,\n    target_entities: collectTargetEntities(ap.structured_condition),\n    description: ap.description,\n    why_it_matters: ap.why_it_matters,\n    remediation: ap.remediation,\n    source: ap.source,\n  }\n}\n\n/**\n * Walk the condition and return the unique entity-type strings it references.\n *\n * This is what fills `target_entities`, so it is the type half of every\n * consumer's reachability. A check form missing from the walk produces a\n * violation nothing can find by type, which is why the walk is exported: it is\n * testable in isolation, against conditions built to defeat the masking that\n * hides an omission inside a real multi-check pattern.\n */\nexport function collectTargetEntities(cond: IntelligenceCondition | undefined): string[] {\n  const types = new Set<string>()\n  if (!cond) return []\n  walk(cond)\n  return [...types].sort()\n\n  function walk(c: IntelligenceCondition): void {\n    if ('check' in c) {\n      const leaf = c.check\n      if (\n        leaf.type === 'entity_count' ||\n        leaf.type === 'benchmark' ||\n        leaf.type === 'edge_count_vs_property'\n      ) {\n        types.add(leaf.entity_type as string)\n      } else if (leaf.type === 'relationship') {\n        types.add(leaf.source_type as string)\n        types.add(leaf.target_type as string)\n      }\n      // total_entity_count / domain_count / domain_population / orphan_count\n      // don't reference a specific entity type; leave them out.\n      //\n      // `edge_count_vs_property` DOES name one and must be listed above. It is\n      // currently masked in the one pattern that uses it, whose sibling checks\n      // already contribute `surface`, but a pattern whose only typed check is\n      // this form would otherwise report an EMPTY target_entities: no type\n      // match, and so unreachable through the type half of any consumer. Every\n      // check that names an entity type belongs here, mask or no mask.\n      return\n    }\n    for (const child of c.checks) walk(child)\n  }\n}\n","/**\n * `UPGProductStage` validation and soft-coercion.\n *\n * Strategy: soft-coerce on read, strict on write. Existing `.upg` files\n * carrying legacy stage values (`idea`, `discovery`, `mvp`) load with an\n * in-memory coercion to the nearest canonical equivalent and a deprecation\n * warning. New writes via `create_product` and `update_node` reject\n * non-canonical values.\n *\n * @module intelligence/product-stage-coercion\n */\n\nimport type { UPGProductStage } from '../shapes/document.js'\nimport { UPG_PRODUCT_STAGES } from './benchmarks/types.js'\n\n/**\n * Documented mapping from known-bad legacy stage values to the closest\n * canonical UPGProductStage. Keys are lowercased. Matching is\n * case-insensitive at the call boundary.\n *\n * Mapping rationale:\n * - `idea` → `concept`: pre-canonical alias from early v0.1 product nodes.\n *   Matches the v0.2.13 `properties.stage` migration value_map.\n * - `discovery` → `validation`: \"discovery\" was used pre-v0.2 to mean the\n *   pre-build research / customer-discovery phase. UPGProductStage does not\n *   have a separate \"discovery\" phase. The closest canonical equivalent is\n *   `validation` (testing demand, talking to users: the discovery activity).\n * - `mvp` → `build`: minimum viable product, actively building v1.\n * - `production` → `launch`: generally available shipped product.\n * - `draft` → `concept`: mirrors the v0.2.13 `lifecycle_status` migration.\n * - `active` → `launch`: mirrors the v0.2.13 `lifecycle_status` migration.\n * - `archived`, `retired`, `deprecated` → `sunset`: winding down or done.\n */\nexport const UPG_PRODUCT_STAGE_COERCION_MAP: Readonly<Record<string, UPGProductStage>> = Object.freeze({\n  idea: 'concept',\n  discovery: 'validation',\n  mvp: 'build',\n  production: 'launch',\n  draft: 'concept',\n  active: 'launch',\n  archived: 'sunset',\n  retired: 'sunset',\n  deprecated: 'sunset',\n  // Pass-through duplicates for safety, keeps the matcher table unsurprising\n  // when a caller passes the canonical value but expects coercion to confirm.\n  // We intentionally do NOT list every canonical value here; the canonical\n  // check happens before the coercion lookup.\n})\n\nconst UPG_PRODUCT_STAGES_SET: ReadonlySet<UPGProductStage> = new Set(UPG_PRODUCT_STAGES)\n\n/**\n * True when `value` is a canonical UPGProductStage.\n *\n * Use this as the strict guard on the write path. Readers should prefer\n * `coerceProductStage` so legacy values still resolve.\n */\nexport function isCanonicalProductStage(value: unknown): value is UPGProductStage {\n  return typeof value === 'string' && UPG_PRODUCT_STAGES_SET.has(value as UPGProductStage)\n}\n\n/**\n * Result of a soft-coercion attempt on a product `stage` value.\n *\n * - `canonical`: the canonical UPGProductStage to use, or `undefined` when\n *   the input was unrecognised (no entry in the coercion map AND not already\n *   canonical). Callers can choose to fall back to a default (typically\n *   `'concept'`) or surface the unknown value.\n * - `originalValue`: the raw input, for warning messages and audit trails.\n * - `wasCoerced`: `true` if the input was a known legacy value that was\n *   mapped to a canonical equivalent. `false` if the input was already\n *   canonical or unrecognised.\n * - `wasUnknown`: `true` if the input was non-canonical AND not in the\n *   coercion map. Callers should fall back to a default and log loudly.\n */\nexport interface ProductStageCoercion {\n  canonical: UPGProductStage | undefined\n  originalValue: unknown\n  wasCoerced: boolean\n  wasUnknown: boolean\n}\n\n/**\n * Soft-coerce a stage value to canonical UPGProductStage, falling back to\n * the documented mapping for known legacy values. Used at `.upg` load time\n * so existing graphs keep working.\n *\n * @example\n * coerceProductStage('idea')\n * // → { canonical: 'concept', originalValue: 'idea', wasCoerced: true, wasUnknown: false }\n *\n * @example\n * coerceProductStage('concept')\n * // → { canonical: 'concept', originalValue: 'concept', wasCoerced: false, wasUnknown: false }\n *\n * @example\n * coerceProductStage('xyz')\n * // → { canonical: undefined, originalValue: 'xyz', wasCoerced: false, wasUnknown: true }\n */\nexport function coerceProductStage(value: unknown): ProductStageCoercion {\n  if (value === undefined || value === null) {\n    return { canonical: undefined, originalValue: value, wasCoerced: false, wasUnknown: false }\n  }\n  if (typeof value !== 'string') {\n    return { canonical: undefined, originalValue: value, wasCoerced: false, wasUnknown: true }\n  }\n  // Already canonical: pass through.\n  if (UPG_PRODUCT_STAGES_SET.has(value as UPGProductStage)) {\n    return { canonical: value as UPGProductStage, originalValue: value, wasCoerced: false, wasUnknown: false }\n  }\n  // Known legacy alias: coerce.\n  const lower = value.toLowerCase()\n  const mapped = UPG_PRODUCT_STAGE_COERCION_MAP[lower]\n  if (mapped) {\n    return { canonical: mapped, originalValue: value, wasCoerced: true, wasUnknown: false }\n  }\n  // Truly unknown: caller decides what to do.\n  return { canonical: undefined, originalValue: value, wasCoerced: false, wasUnknown: true }\n}\n\n/**\n * Strict validator for the write path. Returns `null` when `value` is a\n * canonical UPGProductStage, otherwise a structured error message\n * including the canonical set and any documented coercion target.\n *\n * Intended for `create_product` and `update_node({ type: 'product', ... })`.\n * Callers should reject the operation when this returns non-null.\n *\n * @example\n * validateProductStageStrict('idea')\n * // → \"Invalid product stage: \\\"idea\\\". Canonical UPGProductStage values: ...\"\n */\nexport function validateProductStageStrict(value: unknown): string | null {\n  if (value === undefined || value === null) return null\n  if (isCanonicalProductStage(value)) return null\n\n  const coerced = coerceProductStage(value)\n  const canonicalList = UPG_PRODUCT_STAGES.join(' | ')\n\n  if (coerced.wasCoerced && coerced.canonical) {\n    return (\n      `Invalid product stage: ${JSON.stringify(value)}. ` +\n      `This looks like a legacy value. Pass ${JSON.stringify(coerced.canonical)} instead. ` +\n      `Canonical UPGProductStage values: ${canonicalList}.`\n    )\n  }\n\n  return (\n    `Invalid product stage: ${JSON.stringify(value)}. ` +\n    `Expected one of: ${canonicalList}.`\n  )\n}\n","/**\n * UPG Approach primitive: the cognitive *path of arrival* to a region.\n *\n * Five canonical approaches: Plan, Inspect, Prioritise, Trace, Reflect.\n * The catalog is closed. New techniques land as frameworks under existing\n * approaches.\n *\n * @see {@link UPG_APPROACHES} for the canonical five\n * @see {@link UPGFramework.approach_ids} for the bridge to frameworks\n */\n\nimport type { Step, EntryMode, RunContext, StepOutput, SurfaceId } from '../step-sequence.js'\nimport type { UPGRegionId } from '../regions/types.js'\nimport type { FrameworkOrigin } from '../frameworks/types.js'\n\n// ─── Approach identity ──────────────────────────────────────────────────────\n\n/**\n * The five canonical approach ids. Closed catalog: adding a sixth is a\n * coordinated breaking-shape change.\n *\n * Source of truth for `UPGFramework.approach_ids` and the MCP tool dispatch\n * keys (`plan`, `inspect`, `prioritise`, `trace`, `reflect`).\n */\nexport type UPGApproachId =\n  | 'plan'\n  | 'inspect'\n  | 'prioritise'\n  | 'trace'\n  | 'reflect'\n\n// ─── Approach (structure) ───────────────────────────────────────────────────\n\n/**\n * A definition record describing a cognitive engagement category exposed as\n * a verb-led MCP tool (`plan` / `inspect` / `prioritise` / `trace` / `reflect`).\n *\n * Today these ship as definition lookups: the MCP handler returns the\n * approach record + invocation parameters; the LLM is the executor.\n * Structured execution is forward-declared (see `ApproachRuntime`) and is\n * a forthcoming follow-up.\n *\n * @example\n * // The Prioritise approach: \"what's most important?\"\n * const prioritise: UPGApproach = {\n *   id: 'prioritise',\n *   label: 'Prioritise',\n *   description: 'Rank a candidate set by an explicit framework: RICE, ICE, Kano, Cost of Delay.',\n *   question_answered: \"what's most important?\",\n *   signature_hint: '({ candidates: entity_ids[], framework_id }) → { ranked, framework_used }',\n *   framework_id_examples: ['rice-scoring', 'ice-scoring', 'kano-model', 'cost-of-delay'],\n * }\n */\nexport interface UPGApproach {\n  /**\n   * Unique identifier: bare verb, matches the MCP tool name. One of\n   * `'plan' | 'inspect' | 'prioritise' | 'trace' | 'reflect'`.\n   */\n  id: UPGApproachId\n  /** Human-readable label (Title Case): `'Plan'`, `'Inspect'`, etc. */\n  label: string\n  /** One-paragraph description of the cognitive engagement category. */\n  description: string\n  /**\n   * The single question this approach answers, read as the user's intent in\n   * plain language. Drives natural-language → MCP-tool routing.\n   */\n  question_answered: string\n  /**\n   * Compact signature reminder: `(args) → return-shape`. Documents the\n   * structured-execution shape; today the MCP handler returns the approach\n   * record + invocation parameters (definition lookup).\n   */\n  signature_hint: string\n  /**\n   * 3-5 canonical framework ids inside this approach (`UPGFramework.id`),\n   * a discoverability surface, not exhaustive coverage. Full reverse-lookup\n   * is via `UPGFramework.approach_ids`.\n   */\n  framework_id_examples?: readonly string[]\n}\n\n// ─── Reflect-mode vocabulary ────────────────────────────────────────────────\n\n/**\n * Canonical reflect modes: the 4 nouns the `reflect` approach accepts as an\n * optional `mode` parameter. Absence of `mode` is open reflection.\n *\n * Locked vocabulary; agent-facing. Users speak natural language; the LLM\n * translates `\"what assumptions are we making?\"` → `mode: 'assumptions'`.\n */\nexport type ReflectMode =\n  | 'assumptions'\n  | 'alternatives'\n  | 'blind-spots'\n  | 'load-bearing'\n\n/** Closed list, useful for tool input-schema enums. */\nexport const REFLECT_MODES: readonly ReflectMode[] = [\n  'assumptions',\n  'alternatives',\n  'blind-spots',\n  'load-bearing',\n] as const\n\n// ─── Family-resemblance envelope ────────────────────────────────────────────\n\n/**\n * Shared envelope every approach handler returns. The handler-specific\n * payload spreads into `...payload`; see each approach's `signature_hint`\n * for the per-id shape.\n */\nexport interface UPGApproachEnvelope {\n  /** The approach id this envelope is wrapping. */\n  approach_id: UPGApproachId\n  /**\n   * Approach-specific scope: a region id (Plan, Inspect, Reflect), an\n   * anchor entity id (Trace), an entity id array (Prioritise candidates),\n   * or `null` (open invocation). Typed `unknown` because the shape varies\n   * by approach.\n   */\n  scope: unknown\n  /** ISO-8601 datetime when the handler produced the envelope. */\n  generated_at: string\n}\n\n// ─── Forward-declared runtime / binding shapes ──────────────────────────────\n//\n// These mirror legacy technique shapes for forward-compat. Forward-declared\n// (no current surface uses them) so the structured-execution authoring pass\n// lands additively.\n\n/** Per-surface experience binding for a `UPGApproach`. Forward-declared. */\nexport interface ApproachBinding {\n  /** The `UPGApproach.id` this binding renders */\n  approach_id: UPGApproachId\n  /** Surface this binding targets */\n  surface: SurfaceId\n  /** Identifier the runtime maps to a component or handler */\n  renderer: string\n  /** Per-step renderer overrides, keyed by `Step.order` */\n  step_renderers?: Record<number, string>\n  /** Surface-specific step kinds the runtime handles */\n  custom_step_kinds?: readonly string[]\n  /** Lifecycle hook id: runtime-resolved, fires when an invocation starts */\n  on_start?: string\n  /** Lifecycle hook id: runtime-resolved, fires after each step */\n  on_step_complete?: string\n  /** Lifecycle hook id: runtime-resolved, fires when an invocation completes */\n  on_run_complete?: string\n}\n\n/** Narrowing filter for `listApproaches`. All fields AND together. */\nexport interface ApproachFilter {\n  /** Filter to approaches whose framework_id_examples include this id */\n  framework_id?: string\n  /** Filter to approaches relevant to a specific region (forward-compat; all five are cross-region today) */\n  region?: UPGRegionId\n  /** Filter to approaches reachable via a specific entry mode (forward-compat) */\n  entry_mode?: EntryMode\n}\n\n/**\n * A concrete invocation of a `UPGApproach`. Forward-declared: the MCP\n * handlers are stateless definition lookups today; structured execution\n * with run tracking is a forthcoming follow-up.\n */\nexport interface ApproachRun {\n  /** Unique identifier for this run */\n  id: string\n  /** The `UPGApproach.id` this run is executing */\n  approach_id: UPGApproachId\n  /** ISO 8601 datetime */\n  started_at: string\n  /** ISO 8601 datetime, set when the run completes */\n  completed_at?: string\n  /** Order of the step currently in progress, if any */\n  current_step_order?: number\n  /** Runtime context passed when the run was started */\n  context: RunContext\n}\n\n/**\n * Forward-declared interface for a future structured-execution runtime. No\n * current surface implements it; the MCP tools ship as definition lookups.\n */\nexport interface ApproachRuntime {\n  /** Return all approaches matching an optional filter */\n  listApproaches(filter?: ApproachFilter): readonly UPGApproach[]\n  /** Return a single approach by id, or null if not found */\n  getApproach(id: UPGApproachId): UPGApproach | null\n  /** Start a new run of an approach, returning the in-progress `ApproachRun` */\n  startRun(approach_id: UPGApproachId, context: RunContext): ApproachRun\n  /** Record the output of a completed step against an in-progress run */\n  recordStep(run_id: string, step_order: number, output: StepOutput): void\n}\n\n// ─── Re-export forward-compat references ───────────────────────────────────\n\n// `FrameworkOrigin` and `Step` are unused by approach records today but\n// re-exported so the structured-execution authoring pass can extend\n// `UPGApproach` (e.g. `origin?: FrameworkOrigin`, `steps?: readonly Step[]`)\n// without a re-import sweep.\nexport type { Step, EntryMode, RunContext, StepOutput, SurfaceId, FrameworkOrigin }\n","/**\n * approaches/definitions/: the five canonical UPGApproach records.\n *\n * Each record is a definition lookup: id, label, description (cartographic\n * framing), question_answered, signature_hint, framework_id_examples.\n * Structured execution semantics are a forthcoming follow-up; the LLM is the\n * executor today.\n *\n * Order is stable: Plan / Inspect / Prioritise / Trace / Reflect. Matches the\n * cognitive flow: decide what to build, check what's broken, rank what's\n * most important, walk a path through what exists, question what you're\n * assuming.\n *\n * See `../types.ts` for the cartographic-framing JSDoc that anchors the\n * \"approach\" naming. Read that before touching this file.\n */\n\nimport type { UPGApproach, UPGApproachId } from '../types.js'\nimport { UPG_FRAMEWORKS } from '../../frameworks/canonical.js'\n\n// ─── Single source of truth: framework.approach_ids ───────────────────────────\n//\n// Seam 3 (DT-SEAM-1): `approach.framework_id_examples` and\n// `framework.approach_ids` used to be two hand-kept lists that disagreed — the\n// examples advertised framework ids (ice-scoring, wsjf, cost-of-delay, the five\n// reflect classics) that are authored in the full research catalog but are NOT\n// in the canonical public surface, so `get_framework(id)` returned \"Unknown\n// framework id\" for them. The contract (`get_approach` → `get_framework`) was\n// broken end to end.\n//\n// The fix makes ONE mapping authoritative: `UPGFramework.approach_ids` on each\n// CANONICAL framework. `framework_id_examples` is now DERIVED by inverting that\n// map over `UPG_FRAMEWORKS` (the 34-framework public surface), so every id a\n// skill reads back from `framework_id_examples` is guaranteed to resolve in\n// `get_framework`. The two lists can no longer drift because there is only one.\n//\n// `framework.approach_ids` references `okr-framework` (not the legacy bare\n// `okrs`) — see /upg-new-okr fix.\n\n/** approachId → ordered framework ids, inverted from `framework.approach_ids`. */\nfunction deriveFrameworkExamples(): Record<UPGApproachId, string[]> {\n  const byApproach: Record<UPGApproachId, string[]> = {\n    plan: [],\n    inspect: [],\n    prioritise: [],\n    trace: [],\n    reflect: [],\n  }\n  for (const fw of UPG_FRAMEWORKS) {\n    for (const approachId of fw.approach_ids ?? []) {\n      if (approachId in byApproach) {\n        byApproach[approachId as UPGApproachId].push(fw.id)\n      }\n    }\n  }\n  return byApproach\n}\n\nconst FRAMEWORK_EXAMPLES = deriveFrameworkExamples()\n\n// ─── Plan ───────────────────────────────────────────────────────────────────\n\nconst PLAN: UPGApproach = {\n  id: 'plan',\n  label: 'Plan',\n  description:\n    'The path of arrival to \"what should I build next?\". Plan engages a region by surveying its entity coverage against canonical expectations and surfacing the missing scaffolding: the entities a healthy region carries that this graph does not. Cartographic sense: you are walking the coastline of a region and noting where the contour is incomplete, not deciding a strategy. Frameworks like Now/Next/Later, MoSCoW, and Wardley Mapping live within Plan as the named techniques for organising the gap-filling sequence.',\n  question_answered: \"what should I build next?\",\n  signature_hint: '({ region?: UPGRegionId }) → { missing_entities, coverage_score }',\n  framework_id_examples: FRAMEWORK_EXAMPLES.plan,\n}\n\n// ─── Inspect ────────────────────────────────────────────────────────────────\n\nconst INSPECT: UPGApproach = {\n  id: 'inspect',\n  label: 'Inspect',\n  description:\n    'The path of arrival to \"what\\'s broken?\". Inspect engages a region or a set of entities by running canonical health checks (anti-pattern audits, drift reports, lint passes) and emitting a structured violation list with severity, kind, target entity, description, and fix hint. Cartographic sense: you are surveying the coastline for hazards before approach; the violations are the rocks marked on the chart. The named techniques inside Inspect are the audit catalogues themselves (`UPG_ANTI_PATTERNS` and the lint passes built on the structural rules).',\n  question_answered: \"what's broken?\",\n  signature_hint:\n    '({ region?: UPGRegionId, entities?: entity_ids[] }) → { violations: [{ severity, kind, entity_id, description, fix_hint }] }',\n  framework_id_examples: FRAMEWORK_EXAMPLES.inspect,\n}\n\n// ─── Prioritise ─────────────────────────────────────────────────────────────\n\nconst PRIORITISE: UPGApproach = {\n  id: 'prioritise',\n  label: 'Prioritise',\n  description:\n    'The path of arrival to \"what\\'s most important?\". Prioritise engages an explicit candidate set (entity ids the caller passes in) and ranks it by an explicit framework: RICE, Kano, MoSCoW. The framework_id is required because prioritisation without a declared scoring lens is incoherent. Cartographic sense: you have a set of charted destinations and you are computing the order of arrival from a chosen vantage. Different frameworks weight the same candidate set differently; the approach delegates the actual ranking math to the named technique (the framework definition).',\n  question_answered: \"what's most important?\",\n  signature_hint:\n    '({ candidates: entity_ids[], framework_id }) → { ranked: [{ entity_id, score, rationale }], framework_used }',\n  framework_id_examples: FRAMEWORK_EXAMPLES.prioritise,\n}\n\n// ─── Trace ──────────────────────────────────────────────────────────────────\n\nconst TRACE: UPGApproach = {\n  id: 'trace',\n  label: 'Trace',\n  description:\n    'The path of arrival to \"walk a meaningful path through existing graph\". Trace engages an anchor entity and follows a path expressed as a UPGEntityType[] shorthand. Example: `[\"persona\", \"job\", \"feature\"]` walks persona→job→feature using the canonical edge for each pair (resolved via `resolve_edge_for_pair`). An optional `edges_override` array selects non-canonical edges per hop when a pair has multiple resolutions. Cartographic sense: you are tracing a route across charted terrain; anchor is the departure, path is the heading sequence, the canonical edges are the roads. No DSL invented; the shorthand IS the path expression.',\n  question_answered: \"walk a meaningful path through existing graph\",\n  signature_hint:\n    '({ anchor: entity_id, path: UPGEntityType[], edges_override?: (string | null)[] }) → { trail: [{ depth, entity_id, edge_type_in }], reached: entity_id[] }',\n  framework_id_examples: FRAMEWORK_EXAMPLES.trace,\n}\n\n// ─── Reflect ────────────────────────────────────────────────────────────────\n\nconst REFLECT: UPGApproach = {\n  id: 'reflect',\n  label: 'Reflect',\n  description:\n    'The path of arrival to \"what should I be questioning?\". Reflect engages an optional scope (region, entity, or `null` for the whole graph) and emits structured prompts a thinker should consider: assumptions to test, alternatives to weigh, blind-spots to surface, load-bearing claims to verify. Mode is optional; absence is open reflection. Cartographic sense: before approaching the coastline, you are asking which features of your chart you have not actually verified; the prompts mark the parts of the map that may be conjecture. Retrospective and Build-Measure-Learn are the named reflective techniques in the canonical surface.',\n  question_answered: \"what should I be questioning?\",\n  signature_hint:\n    \"({ scope?: UPGRegionId | entity_id | null, mode?: 'assumptions' | 'alternatives' | 'blind-spots' | 'load-bearing' }) → { prompts: [{ kind, question, target_entities? }] }\",\n  framework_id_examples: FRAMEWORK_EXAMPLES.reflect,\n}\n\n// ─── Catalog ────────────────────────────────────────────────────────────────\n\n/**\n * The five canonical approaches. Order is the cognitive flow.\n *\n * `as const` keeps the array length and ids in the type system so consumers\n * that pin against `UPG_APPROACHES.length === 5` get a compile-time guarantee.\n */\nexport const UPG_APPROACHES = [PLAN, INSPECT, PRIORITISE, TRACE, REFLECT] as const\n\n/** O(1) lookup by id. */\nexport const UPG_APPROACHES_BY_ID: Record<string, UPGApproach> = Object.fromEntries(\n  UPG_APPROACHES.map((a) => [a.id, a]),\n)\n","/**\n * UPG Region catalog (topology only). The 10 canonical super-domain regions:\n * entities, edges, anchors, shape archetype, atomic-domain composition.\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport type { UPGRegion } from './types.js'\n\nexport const UPG_REGIONS: readonly UPGRegion[] = [\n  {\n    id: \"strategy_outcomes\",\n    label: \"Strategy & Outcomes\",\n    order: 1,\n    shape: \"cascade\",\n    mental_model: \"Aspiration → direction → bet → measurable → proof.\",\n    operators: [\n      \"CEO\",\n      \"PM\",\n      \"leadership\",\n      \"strategy team\",\n    ],\n    composes_atomic_domains: [\n      \"strategy\",\n    ],\n    entities: [\n      {\n        type: \"product\",\n        role: \"container\",\n      },\n      {\n        type: \"vision\",\n        role: \"root\",\n      },\n      {\n        type: \"mission\",\n        role: \"container\",\n      },\n      {\n        type: \"strategic_pillar\",\n        role: \"hub\",\n      },\n      {\n        type: \"strategic_theme\",\n        role: \"container\",\n      },\n      {\n        type: \"initiative\",\n        role: \"container\",\n      },\n      {\n        type: \"capability\",\n        role: \"leaf\",\n      },\n      {\n        type: \"value_stream\",\n        role: \"container\",\n      },\n      {\n        type: \"objective\",\n        role: \"anchor\",\n      },\n      {\n        type: \"key_result\",\n        role: \"hub\",\n      },\n      {\n        type: \"metric\",\n        role: \"leaf\",\n        notes: \"also anchors Analytics; canonical home is Strategy\",\n      },\n      {\n        type: \"metric_quality_assessment\",\n        role: \"leaf\",\n      },\n      {\n        type: \"decision\",\n        role: \"hub\",\n        notes: \"polymorphic across domains\",\n      },\n      {\n        type: \"assumption\",\n        role: \"leaf\",\n      },\n      {\n        type: \"strategic_question\",\n        role: \"leaf\",\n      },\n      {\n        type: \"constraint\",\n        role: \"leaf\",\n      },\n      {\n        type: \"outcome\",\n        role: \"hub\",\n      },\n    ],\n    anchor: {\n      type: \"objective\",\n      rationale: \"The single entity where P5 language meets P3 measurement. The accountability question of strategy flows through it.\",\n      outbound_cross_edge_count: 0,\n      inbound_cross_edge_count: 1,\n    },\n    intra_edges: [\n      \"vision_realised_through_mission\",\n      \"vision_guides_objective\",\n      \"mission_supported_by_strategic_pillar\",\n      \"strategic_pillar_organises_strategic_theme\",\n      \"strategic_pillar_enables_capability\",\n      \"strategic_pillar_delivers_value_stream\",\n      \"strategic_pillar_decided_via_decision\",\n      \"strategic_theme_pursues_initiative\",\n      \"initiative_assumes_assumption\",\n      \"objective_raises_strategic_question\",\n      \"initiative_raises_strategic_question\",\n      \"initiative_drives_outcome\",\n      \"objective_achieved_through_key_result\",\n      \"objective_measured_by_metric\",\n      \"key_result_quantified_by_metric\",\n      \"outcome_measured_by_metric\",\n      \"metric_decomposes_into_metric\",\n      \"metric_guards_metric\",\n      \"metric_drives_metric\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"export\",\n        edge_id: \"outcome_reveals_opportunity\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"assumption_becomes_hypothesis\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"outcome_delivered_by_feature\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"outcome_delivered_via_feature_area\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"objective_scoped_to_planning_cycle\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"strategic_theme_scoped_to_planning_cycle\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"feature_drives_key_result\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"insight_validates_strategic_pillar\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"document_describes_strategic_pillar\",\n        crosses_into: \"experience_design_brand\",\n      },\n    ],\n  },\n  {\n    id: \"users_needs\",\n    label: \"Users & Needs\",\n    order: 2,\n    shape: \"convergent\",\n    mental_model: \"Who → what they want to do → what is in their way → what they would accept as done.\",\n    operators: [\n      \"researcher\",\n      \"PM\",\n      \"designer\",\n      \"marketer\",\n    ],\n    composes_atomic_domains: [\n      \"user\",\n    ],\n    entities: [\n      {\n        type: \"persona\",\n        role: \"anchor\",\n      },\n      {\n        type: \"job\",\n        role: \"hub\",\n      },\n      {\n        type: \"need\",\n        role: \"hub\",\n      },\n      {\n        type: \"desired_outcome\",\n        role: \"leaf\",\n      },\n      {\n        type: \"switching_cost\",\n        role: \"leaf\",\n      },\n      {\n        type: \"job_step\",\n        role: \"leaf\",\n      },\n      {\n        type: \"participant\",\n        role: \"leaf\",\n        notes: \"research-resolved persona; canonical home is Discovery/Research/Validation\",\n      },\n    ],\n    anchor: {\n      type: \"persona\",\n      rationale: \"Persona carries 25 inbound cross-edge types from 13 atomic domains, making it the graph's gravitational centre. Solve persona's P1 SoT and all P1 members inherit.\",\n      outbound_cross_edge_count: 1,\n      inbound_cross_edge_count: 25,\n    },\n    intra_edges: [\n      \"persona_pursues_job\",\n      \"persona_experiences_need\",\n      \"persona_aspires_to_desired_outcome\",\n      \"persona_incurs_switching_cost\",\n      \"persona_delegates_to_persona\",\n      \"job_surfaces_need\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"competitor_competes_for_persona\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"market_segment_includes_persona\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"insight_characterises_persona\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"observation_characterises_persona\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"user_journey_maps_persona\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"user_flow_targets_persona\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"cohort_represents_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"funnel_maps_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"acquisition_channel_reaches_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"value_proposition_targets_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"ideal_customer_profile_maps_to_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"positioning_resonates_with_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"messaging_targets_persona\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"content_theme_targets_persona\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"metric_segmented_by_persona\",\n        crosses_into: \"analytics_data\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"user_advisory_board_includes_persona\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"stakeholder_maps_to_persona\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"cultural_adaptation_targets_persona\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"education_program_targets_persona\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"document_describes_persona\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"persona_experiences_user_journey\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"product_shares_persona_with_product\",\n        crosses_into: \"users_needs\",\n      },\n    ],\n  },\n  {\n    id: \"discovery_research_validation\",\n    label: \"Discovery, Research & Validation\",\n    order: 3,\n    shape: \"directed-cyclic\",\n    mental_model: \"Question → hypothesis → test → evidence → decision → loop back.\",\n    operators: [\n      \"PM\",\n      \"researcher\",\n      \"designer-in-exploration\",\n    ],\n    composes_atomic_domains: [\n      \"discovery\",\n      \"validation\",\n      \"user_research\",\n    ],\n    entities: [\n      {\n        type: \"opportunity\",\n        role: \"anchor\",\n      },\n      {\n        type: \"solution\",\n        role: \"container\",\n      },\n      {\n        type: \"feasibility_study\",\n        role: \"leaf\",\n      },\n      {\n        type: \"design_sprint\",\n        role: \"leaf\",\n      },\n      {\n        type: \"hypothesis\",\n        role: \"hub\",\n      },\n      {\n        type: \"experiment\",\n        role: \"hub\",\n      },\n      {\n        type: \"experiment_plan\",\n        role: \"container\",\n      },\n      {\n        type: \"experiment_run\",\n        role: \"container\",\n        notes: \"self-nesting\",\n      },\n      {\n        type: \"learning\",\n        role: \"leaf\",\n      },\n      {\n        type: \"evidence\",\n        role: \"leaf\",\n      },\n      {\n        type: \"research_plan\",\n        role: \"leaf\",\n      },\n      {\n        type: \"research_study\",\n        role: \"container\",\n      },\n      {\n        type: \"participant\",\n        role: \"leaf\",\n      },\n      {\n        type: \"observation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"quote\",\n        role: \"leaf\",\n      },\n      {\n        type: \"insight\",\n        role: \"hub\",\n        notes: \"self-nesting refines_into\",\n      },\n      {\n        type: \"affinity_cluster\",\n        role: \"container\",\n      },\n      {\n        type: \"survey_response\",\n        role: \"leaf\",\n      },\n      {\n        type: \"interview_guide\",\n        role: \"leaf\",\n      },\n      {\n        type: \"research_question\",\n        role: \"leaf\",\n      },\n    ],\n    anchor: {\n      type: \"opportunity\",\n      rationale: \"Sits on the import border (receives from Strategy/Users/Market/Feedback) and anchors the internal chain (drives solution → hypothesis → experiment).\",\n      outbound_cross_edge_count: 4,\n      inbound_cross_edge_count: 6,\n    },\n    intra_edges: [\n      \"opportunity_drives_solution\",\n      \"opportunity_explores_via_design_concept\",\n      \"opportunity_assessed_by_feasibility_study\",\n      \"opportunity_investigated_via_design_sprint\",\n      \"opportunity_addresses_need\",\n      \"opportunity_pursues_outcome\",\n      \"opportunity_contextualises_job\",\n      \"insight_informs_opportunity\",\n      \"insight_surfaces_opportunity\",\n      \"insight_validates_persona\",\n      \"insight_refines_into_insight\",\n      \"learning_validates_opportunity\",\n      \"evidence_supports_opportunity\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"outcome_reveals_opportunity\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"market_trend_creates_opportunity\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"feature_request_creates_opportunity\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"assumption_becomes_hypothesis\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"opportunity_improves_user_journey\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"insight_informs_opportunity\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"insight_characterises_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"observation_characterises_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"insight_validates_value_proposition\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"feature_tests_hypothesis\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"competitor_feature_inspires_solution\",\n        crosses_into: \"market_competitive\",\n      },\n    ],\n  },\n  {\n    id: \"market_competitive\",\n    label: \"Market & Competitive\",\n    order: 4,\n    shape: \"tributary\",\n    mental_model: \"Landscape → rivals → moves → response.\",\n    operators: [\n      \"product marketer\",\n      \"strategy\",\n      \"researcher\",\n    ],\n    composes_atomic_domains: [\n      \"market_intelligence\",\n    ],\n    entities: [\n      {\n        type: \"competitor\",\n        role: \"anchor\",\n        notes: \"dual P9 container\",\n      },\n      {\n        type: \"competitor_feature\",\n        role: \"leaf\",\n      },\n      {\n        type: \"competitor_signal\",\n        role: \"leaf\",\n        notes: \"a dated competitor move (feature launch, pricing change, ...) emitted by a competitor\",\n      },\n      {\n        type: \"market_trend\",\n        role: \"leaf\",\n      },\n      {\n        type: \"market_segment\",\n        role: \"container\",\n      },\n      {\n        type: \"competitive_analysis\",\n        role: \"container\",\n      },\n      {\n        type: \"classification_axis\",\n        role: \"container\",\n        notes: \"taxonomy dimension of a 2-axis matrix\",\n      },\n      {\n        type: \"classification_value\",\n        role: \"leaf\",\n        notes: \"one position on an axis; competitors classify against values\",\n      },\n    ],\n    anchor: {\n      type: \"competitor\",\n      rationale: \"The spec's clearest dual-pattern entity: identity in \\\"rivals\\\" view, container in \\\"their catalog\\\" view. Stress-tests UCS pattern assignment.\",\n      outbound_cross_edge_count: 1,\n      inbound_cross_edge_count: 4,\n    },\n    intra_edges: [\n      \"competitor_offers_competitor_feature\",\n      \"competitor_emits_competitor_signal\",\n      \"competitive_analysis_analyses_competitor\",\n      \"competitive_analysis_dimensioned_by_classification_axis\",\n      \"classification_axis_includes_classification_value\",\n      \"competitor_classified_as_classification_value\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"export\",\n        edge_id: \"competitor_feature_inspires_solution\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"competitor_feature_inspires_feature\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"market_trend_creates_opportunity\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"competitor_competes_for_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"market_segment_includes_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"positioning_references_competitor\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"positioning_differentiates_from_competitor\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"business_model_targets_market_segment\",\n        crosses_into: \"business_gtm_growth\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"product_shares_competitor_with_product\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"document_describes_competitor\",\n        crosses_into: \"experience_design_brand\",\n      },\n    ],\n  },\n  {\n    id: \"experience_design_brand\",\n    label: \"Experience, Design & Brand\",\n    order: 5,\n    shape: \"multi-hierarchy\",\n    mental_model: \"Journey (over time) + design system (in pieces) + brand (as a whole) + content (what it says).\",\n    operators: [\n      \"designer\",\n      \"UX researcher\",\n      \"brand strategist\",\n      \"content strategist\",\n    ],\n    composes_atomic_domains: [\n      \"ux_design\",\n      \"design_system\",\n      \"brand\",\n      \"content\",\n    ],\n    entities: [\n      {\n        type: \"user_journey\",\n        role: \"anchor\",\n      },\n      {\n        type: \"journey_phase\",\n        role: \"container\",\n      },\n      {\n        type: \"journey_step\",\n        role: \"container\",\n      },\n      {\n        type: \"journey_action\",\n        role: \"leaf\",\n      },\n      {\n        type: \"user_flow\",\n        role: \"container\",\n      },\n      {\n        type: \"screen\",\n        role: \"leaf\",\n      },\n      {\n        type: \"screen_state\",\n        role: \"leaf\",\n      },\n      {\n        type: \"surface\",\n        role: \"container\",\n      },\n      {\n        type: \"wireframe\",\n        role: \"leaf\",\n      },\n      {\n        type: \"prototype\",\n        role: \"leaf\",\n      },\n      {\n        type: \"annotation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"design_concept\",\n        role: \"leaf\",\n      },\n      {\n        type: \"design_question\",\n        role: \"hub\",\n      },\n      {\n        type: \"design_system\",\n        role: \"root\",\n      },\n      {\n        type: \"design_component\",\n        role: \"hub\",\n        notes: \"self-nesting atom→organism\",\n      },\n      {\n        type: \"design_token\",\n        role: \"leaf\",\n      },\n      {\n        type: \"design_pattern\",\n        role: \"leaf\",\n      },\n      {\n        type: \"design_guideline\",\n        role: \"leaf\",\n      },\n      {\n        type: \"interaction_spec\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_identity\",\n        role: \"root\",\n      },\n      {\n        type: \"brand_colour\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_typography\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_imagery\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_voice\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_logo\",\n        role: \"leaf\",\n      },\n      {\n        type: \"brand_asset\",\n        role: \"leaf\",\n      },\n      {\n        type: \"content_piece\",\n        role: \"leaf\",\n      },\n      {\n        type: \"knowledge_base_article\",\n        role: \"leaf\",\n      },\n      {\n        type: \"content_calendar\",\n        role: \"container\",\n      },\n      {\n        type: \"documentation_template\",\n        role: \"leaf\",\n      },\n      {\n        type: \"document\",\n        role: \"leaf\",\n      },\n      {\n        type: \"content_theme\",\n        role: \"hub\",\n      },\n    ],\n    anchor: {\n      type: \"user_journey\",\n      rationale: \"The one entity where time is the primary layout dimension. Stress-tests P9 with ordered, left-to-right sequenced children.\",\n      outbound_cross_edge_count: 3,\n      inbound_cross_edge_count: 2,\n    },\n    intra_edges: [\n      \"user_journey_contains_journey_step\",\n      \"design_system_contains_design_component\",\n      \"brand_identity_coloured_with_brand_colour\",\n      \"design_component_composes_design_component\",\n      \"screen_renders_surface\",\n      \"surface_contains_surface\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"need_reframed_as_design_question\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"feature_occupies_surface\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"surface_serves_job\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"opportunity_explores_via_design_concept\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"user_journey_maps_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"user_flow_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"service_implements_design_component\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"wireframe_specifies_feature\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"content_theme_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n    ],\n  },\n  {\n    id: \"product_delivery\",\n    label: \"Product & Delivery\",\n    order: 6,\n    shape: \"work-breakdown\",\n    mental_model: \"Area → feature → epic → story → task, governed by release / roadmap / theme.\",\n    operators: [\n      \"PM\",\n      \"engineering manager\",\n      \"release manager\",\n      \"delivery lead\",\n    ],\n    composes_atomic_domains: [\n      \"product_spec\",\n      \"program_mgmt\",\n      \"feedback\",\n    ],\n    entities: [\n      {\n        type: \"feature\",\n        role: \"anchor\",\n      },\n      {\n        type: \"feature_area\",\n        role: \"container\",\n        notes: \"self-nesting\",\n      },\n      {\n        type: \"epic\",\n        role: \"container\",\n      },\n      {\n        type: \"user_story\",\n        role: \"container\",\n        notes: \"dual P5\",\n      },\n      {\n        type: \"acceptance_criterion\",\n        role: \"leaf\",\n      },\n      {\n        type: \"task\",\n        role: \"leaf\",\n      },\n      {\n        type: \"bug\",\n        role: \"leaf\",\n      },\n      {\n        type: \"release\",\n        role: \"container\",\n      },\n      {\n        type: \"roadmap\",\n        role: \"container\",\n      },\n      {\n        type: \"roadmap_item\",\n        role: \"leaf\",\n      },\n      {\n        type: \"roadmap_theme\",\n        role: \"container\",\n        notes: \"semantic spanner, not containment\",\n      },\n      {\n        type: \"changelog\",\n        role: \"leaf\",\n      },\n      {\n        type: \"feedback_program\",\n        role: \"container\",\n      },\n      {\n        type: \"feature_request\",\n        role: \"leaf\",\n      },\n      {\n        type: \"feedback_vote\",\n        role: \"leaf\",\n      },\n      {\n        type: \"nps_campaign\",\n        role: \"leaf\",\n      },\n      {\n        type: \"user_advisory_board\",\n        role: \"container\",\n      },\n      {\n        type: \"beta_program\",\n        role: \"leaf\",\n      },\n      {\n        type: \"feedback_theme\",\n        role: \"leaf\",\n      },\n      {\n        type: \"program\",\n        role: \"container\",\n      },\n      {\n        type: \"project\",\n        role: \"container\",\n      },\n      {\n        type: \"milestone\",\n        role: \"leaf\",\n      },\n      {\n        type: \"risk_register\",\n        role: \"container\",\n      },\n      {\n        type: \"change_request\",\n        role: \"leaf\",\n      },\n      {\n        type: \"deliverable\",\n        role: \"leaf\",\n      },\n      {\n        type: \"resource_allocation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"status_report\",\n        role: \"leaf\",\n      },\n      {\n        type: \"planning_cycle\",\n        role: \"container\",\n        notes: \"self-nesting cadence axis\",\n      },\n      {\n        type: \"configuration_axis\",\n        role: \"leaf\",\n        notes: \"the configuration lever whose values select which surface tree the product renders\",\n      },\n    ],\n    anchor: {\n      type: \"feature\",\n      rationale: \"The accountability entity, the narrowest scope answering \\\"what did we commit to?\\\". Every other P4 in the domain is feature-adjacent.\",\n      outbound_cross_edge_count: 4,\n      inbound_cross_edge_count: 4,\n    },\n    intra_edges: [\n      \"feature_area_contains_feature\",\n      \"feature_area_contains_feature_area\",\n      \"feature_decomposed_into_epic\",\n      \"feature_affected_by_bug\",\n      \"epic_specified_by_user_story\",\n      \"user_story_verified_by_acceptance_criterion\",\n      \"task_implements_user_story\",\n      \"roadmap_contains_roadmap_item\",\n      \"roadmap_categorised_by_roadmap_theme\",\n      \"roadmap_schedules_release\",\n      \"release_documented_in_changelog\",\n      \"roadmap_theme_spans_feature_area\",\n      \"milestone_gates_release\",\n      \"roadmap_item_references_feature\",\n      \"feature_request_voted_on_by_feedback_vote\",\n      \"planning_cycle_contains_planning_cycle\",\n      \"planning_cycle_schedules_work_item\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"outcome_delivered_by_feature\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"objective_scoped_to_planning_cycle\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"strategic_theme_scoped_to_planning_cycle\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"outcome_delivered_via_feature_area\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"competitor_feature_inspires_feature\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"bounded_context_contains_feature_area\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"feature_drives_key_result\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"feature_addresses_job\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"feature_tests_hypothesis\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"feature_request_creates_opportunity\",\n        crosses_into: \"discovery_research_validation\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"wireframe_specifies_feature\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"service_powers_feature\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"service_powers_feature_area\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"bug_affects_service\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"test_case_validates_acceptance_criterion\",\n        crosses_into: \"operations_quality\",\n      },\n    ],\n  },\n  {\n    id: \"engineering_platform\",\n    label: \"Engineering & Platform\",\n    order: 7,\n    shape: \"dag\",\n    mental_model: \"Bounded context → service → endpoint/schema/queue → deployment, governed by dependencies and contracts.\",\n    operators: [\n      \"engineer\",\n      \"architect\",\n      \"platform team\",\n      \"ML engineer\",\n    ],\n    composes_atomic_domains: [\n      \"engineering\",\n      \"ai\",\n      \"automation\",\n    ],\n    entities: [\n      {\n        type: \"bounded_context\",\n        role: \"root\",\n      },\n      {\n        type: \"service\",\n        role: \"anchor\",\n      },\n      {\n        type: \"api_endpoint\",\n        role: \"leaf\",\n      },\n      {\n        type: \"api_contract\",\n        role: \"leaf\",\n      },\n      {\n        type: \"database_schema\",\n        role: \"leaf\",\n      },\n      {\n        type: \"aggregate\",\n        role: \"container\",\n      },\n      {\n        type: \"domain_entity\",\n        role: \"leaf\",\n      },\n      {\n        type: \"value_object\",\n        role: \"leaf\",\n      },\n      {\n        type: \"command\",\n        role: \"leaf\",\n      },\n      {\n        type: \"read_model\",\n        role: \"leaf\",\n      },\n      {\n        type: \"domain_event\",\n        role: \"leaf\",\n      },\n      {\n        type: \"code_repository\",\n        role: \"container\",\n        notes: \"external-source\",\n      },\n      {\n        type: \"integration_pattern\",\n        role: \"leaf\",\n      },\n      {\n        type: \"external_api\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_flow\",\n        role: \"leaf\",\n      },\n      {\n        type: \"queue_topic\",\n        role: \"leaf\",\n      },\n      {\n        type: \"library_dependency\",\n        role: \"leaf\",\n      },\n      {\n        type: \"build_artifact\",\n        role: \"leaf\",\n      },\n      {\n        type: \"deployment\",\n        role: \"leaf\",\n      },\n      {\n        type: \"feature_flag\",\n        role: \"leaf\",\n      },\n      {\n        type: \"technical_debt_item\",\n        role: \"leaf\",\n      },\n      {\n        type: \"investigation\",\n        role: \"container\",\n      },\n      {\n        type: \"root_cause\",\n        role: \"container\",\n      },\n      {\n        type: \"symptom\",\n        role: \"leaf\",\n      },\n      {\n        type: \"fix\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_model\",\n        role: \"container\",\n      },\n      {\n        type: \"prompt_template\",\n        role: \"container\",\n      },\n      {\n        type: \"prompt_version\",\n        role: \"leaf\",\n      },\n      {\n        type: \"eval_benchmark\",\n        role: \"container\",\n      },\n      {\n        type: \"eval_run\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_cost_tracker\",\n        role: \"leaf\",\n      },\n      {\n        type: \"hallucination_report\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_guardrail\",\n        role: \"leaf\",\n      },\n      {\n        type: \"model_comparison\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_experiment\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_dataset\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ai_trace\",\n        role: \"container\",\n        notes: \"self-nesting inference chain\",\n      },\n      {\n        type: \"workflow_template\",\n        role: \"container\",\n      },\n      {\n        type: \"workflow_run\",\n        role: \"container\",\n      },\n      {\n        type: \"workflow_artifact\",\n        role: \"leaf\",\n      },\n      {\n        type: \"agent_definition\",\n        role: \"container\",\n      },\n      {\n        type: \"agent_session\",\n        role: \"leaf\",\n      },\n      {\n        type: \"agent_skill\",\n        role: \"leaf\",\n      },\n      {\n        type: \"agent_hook\",\n        role: \"leaf\",\n      },\n      {\n        type: \"agent_task\",\n        role: \"leaf\",\n      },\n      {\n        type: \"review_gate\",\n        role: \"container\",\n      },\n      {\n        type: \"approval_record\",\n        role: \"leaf\",\n      },\n    ],\n    anchor: {\n      type: \"service\",\n      rationale: \"Has 9 hierarchy children, more than any other entity in v0.2. Stress-tests P9 rendering with rich child catalogs.\",\n      outbound_cross_edge_count: 4,\n      inbound_cross_edge_count: 4,\n    },\n    intra_edges: [\n      \"service_exposes_api_contract\",\n      \"service_serves_api_endpoint\",\n      \"service_persisted_in_database_schema\",\n      \"service_publishes_to_queue_topic\",\n      \"service_deployed_as_deployment\",\n      \"service_produces_build_artifact\",\n      \"service_depends_on_library_dependency\",\n      \"service_carries_technical_debt_item\",\n      \"service_toggles_feature_flag\",\n      \"service_affected_by_root_cause\",\n      \"service_investigated_via_investigation\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"bounded_context_contains_feature_area\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"service_powers_feature\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"service_powers_feature_area\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"bug_affects_service\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"incident_caused_by_root_cause\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"service_level_agreement_governs_service\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"service_implements_design_component\",\n        crosses_into: \"experience_design_brand\",\n      },\n    ],\n  },\n  {\n    id: \"business_gtm_growth\",\n    label: \"Business, GTM & Growth\",\n    order: 8,\n    shape: \"multi-hub\",\n    mental_model: \"Value prop → positioning → messaging → funnel → revenue, all anchored on persona.\",\n    operators: [\n      \"founder\",\n      \"product marketer\",\n      \"growth PM\",\n      \"sales\",\n      \"pricing strategist\",\n    ],\n    composes_atomic_domains: [\n      \"business_model\",\n      \"go_to_market\",\n      \"growth\",\n      \"sales\",\n      \"pricing\",\n      \"marketing\",\n      \"ecosystem\",\n    ],\n    entities: [\n      {\n        type: \"business_model\",\n        role: \"root\",\n      },\n      {\n        type: \"value_proposition\",\n        role: \"anchor\",\n      },\n      {\n        type: \"revenue_stream\",\n        role: \"container\",\n      },\n      {\n        type: \"cost_structure\",\n        role: \"leaf\",\n      },\n      {\n        type: \"unit_economics\",\n        role: \"leaf\",\n      },\n      {\n        type: \"partnership\",\n        role: \"leaf\",\n      },\n      {\n        type: \"key_resource\",\n        role: \"leaf\",\n      },\n      {\n        type: \"key_activity\",\n        role: \"leaf\",\n      },\n      {\n        type: \"customer_relationship\",\n        role: \"leaf\",\n      },\n      {\n        type: \"distribution_channel\",\n        role: \"leaf\",\n      },\n      {\n        type: \"pricing_strategy\",\n        role: \"root\",\n      },\n      {\n        type: \"pricing_tier\",\n        role: \"leaf\",\n      },\n      {\n        type: \"discount_strategy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"trial_config\",\n        role: \"leaf\",\n      },\n      {\n        type: \"paywall\",\n        role: \"leaf\",\n      },\n      {\n        type: \"gtm_strategy\",\n        role: \"root\",\n      },\n      {\n        type: \"ideal_customer_profile\",\n        role: \"hub\",\n      },\n      {\n        type: \"positioning\",\n        role: \"hub\",\n      },\n      {\n        type: \"messaging\",\n        role: \"leaf\",\n      },\n      {\n        type: \"content_strategy\",\n        role: \"container\",\n      },\n      {\n        type: \"sales_motion\",\n        role: \"leaf\",\n      },\n      {\n        type: \"demand_gen_program\",\n        role: \"leaf\",\n      },\n      {\n        type: \"territory\",\n        role: \"leaf\",\n      },\n      {\n        type: \"objection\",\n        role: \"leaf\",\n      },\n      {\n        type: \"rebuttal\",\n        role: \"container\",\n      },\n      {\n        type: \"proof_point\",\n        role: \"leaf\",\n      },\n      {\n        type: \"launch\",\n        role: \"leaf\",\n      },\n      {\n        type: \"competitive_battle_card\",\n        role: \"leaf\",\n      },\n      {\n        type: \"funnel\",\n        role: \"root\",\n      },\n      {\n        type: \"funnel_step\",\n        role: \"leaf\",\n      },\n      {\n        type: \"acquisition_channel\",\n        role: \"hub\",\n      },\n      {\n        type: \"cohort\",\n        role: \"leaf\",\n      },\n      {\n        type: \"behavioral_segment\",\n        role: \"container\",\n      },\n      {\n        type: \"growth_loop\",\n        role: \"leaf\",\n      },\n      {\n        type: \"growth_campaign\",\n        role: \"container\",\n      },\n      {\n        type: \"attribution_model\",\n        role: \"leaf\",\n      },\n      {\n        type: \"variant\",\n        role: \"leaf\",\n      },\n      {\n        type: \"account\",\n        role: \"container\",\n      },\n      {\n        type: \"contact\",\n        role: \"leaf\",\n      },\n      {\n        type: \"lead\",\n        role: \"leaf\",\n      },\n      {\n        type: \"deal\",\n        role: \"container\",\n      },\n      {\n        type: \"pipeline_sales\",\n        role: \"container\",\n      },\n      {\n        type: \"pipeline_stage\",\n        role: \"leaf\",\n      },\n      {\n        type: \"quote_document\",\n        role: \"leaf\",\n      },\n      {\n        type: \"subscription\",\n        role: \"container\",\n      },\n      {\n        type: \"invoice\",\n        role: \"leaf\",\n      },\n      {\n        type: \"forecast\",\n        role: \"leaf\",\n      },\n      {\n        type: \"marketing_strategy\",\n        role: \"container\",\n      },\n      {\n        type: \"marketing_channel\",\n        role: \"container\",\n      },\n      {\n        type: \"marketing_campaign_plan\",\n        role: \"container\",\n      },\n      {\n        type: \"email_sequence\",\n        role: \"leaf\",\n      },\n      {\n        type: \"social_post\",\n        role: \"leaf\",\n      },\n      {\n        type: \"seo_keyword\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ad_creative\",\n        role: \"leaf\",\n      },\n      {\n        type: \"press_release\",\n        role: \"leaf\",\n      },\n      {\n        type: \"event\",\n        role: \"leaf\",\n      },\n      {\n        type: \"community_initiative\",\n        role: \"leaf\",\n      },\n      {\n        type: \"partner_program\",\n        role: \"container\",\n      },\n      {\n        type: \"partner_tier\",\n        role: \"leaf\",\n      },\n      {\n        type: \"api_ecosystem\",\n        role: \"container\",\n      },\n      {\n        type: \"marketplace_listing\",\n        role: \"leaf\",\n      },\n      {\n        type: \"developer_portal\",\n        role: \"leaf\",\n      },\n      {\n        type: \"integration_partner\",\n        role: \"leaf\",\n      },\n      {\n        type: \"partner_revenue_share\",\n        role: \"leaf\",\n      },\n    ],\n    anchor: {\n      type: \"value_proposition\",\n      rationale: \"Touches all three sub-domains and crosses into Users, Strategy, and Discovery. Designing it forces resolution of structured slots + scored objections + proof points.\",\n      outbound_cross_edge_count: 5,\n      inbound_cross_edge_count: 3,\n    },\n    intra_edges: [\n      \"business_model_delivers_value_proposition\",\n      \"business_model_earns_via_revenue_stream\",\n      \"business_model_costs_via_cost_structure\",\n      \"business_model_measured_by_unit_economics\",\n      \"business_model_distributes_via_distribution_channel\",\n      \"business_model_maintains_customer_relationship\",\n      \"business_model_requires_key_resource\",\n      \"business_model_performs_key_activity\",\n      \"business_model_partnered_via_partnership\",\n      \"value_proposition_challenged_by_objection\",\n      \"value_proposition_evidenced_by_proof_point\",\n      \"gtm_strategy_targets_ideal_customer_profile\",\n      \"gtm_strategy_positions_via_positioning\",\n      \"gtm_strategy_launches_via_launch\",\n      \"gtm_strategy_arms_with_competitive_battle_card\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"value_proposition_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"value_proposition_addresses_job\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"value_proposition_solves_need\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"messaging_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"positioning_resonates_with_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"ideal_customer_profile_maps_to_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"cohort_represents_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"business_model_targets_market_segment\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"value_proposition_delivers_outcome\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"revenue_stream_drives_metric\",\n        crosses_into: \"analytics_data\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"positioning_references_competitor\",\n        crosses_into: \"market_competitive\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"insight_validates_value_proposition\",\n        crosses_into: \"discovery_research_validation\",\n      },\n    ],\n  },\n  {\n    id: \"analytics_data\",\n    label: \"Analytics & Data\",\n    order: 9,\n    shape: \"polymorphic-target\",\n    mental_model: \"Event → data source → metric → dashboard.\",\n    operators: [\n      \"data scientist\",\n      \"analyst\",\n      \"PM\",\n      \"founder\",\n    ],\n    composes_atomic_domains: [\n      \"data_analytics\",\n    ],\n    entities: [\n      {\n        type: \"metric\",\n        role: \"anchor\",\n        notes: \"canonical home is Strategy; anchors Analytics as the measurement plane\",\n      },\n      {\n        type: \"data_source\",\n        role: \"container\",\n      },\n      {\n        type: \"event_schema\",\n        role: \"leaf\",\n      },\n      {\n        type: \"dashboard\",\n        role: \"container\",\n      },\n      {\n        type: \"data_model\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_domain\",\n        role: \"container\",\n      },\n      {\n        type: \"data_product\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_pipeline\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_lineage\",\n        role: \"leaf\",\n      },\n      {\n        type: \"glossary_term\",\n        role: \"leaf\",\n      },\n      {\n        type: \"report\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_quality_rule\",\n        role: \"leaf\",\n      },\n    ],\n    anchor: {\n      type: \"metric\",\n      rationale: \"The graph's most cross-referenced leaf-type. Inbound from 10+ entity types across 5+ super-domains. Designing its card designs the atomic unit of truth.\",\n      outbound_cross_edge_count: 2,\n      inbound_cross_edge_count: 10,\n    },\n    intra_edges: [\n      \"metric_decomposes_into_metric\",\n      \"metric_drives_metric\",\n      \"metric_guards_metric\",\n      \"metric_validated_by_data_quality_rule\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"outcome_measured_by_metric\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"objective_measured_by_metric\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"key_result_quantified_by_metric\",\n        crosses_into: \"strategy_outcomes\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"service_level_objective_tracks_metric\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"service_level_agreement_measures_metric\",\n        crosses_into: \"operations_quality\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"metric_segmented_by_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"product_shares_metric_with_product\",\n        crosses_into: \"analytics_data\",\n      },\n    ],\n  },\n  {\n    id: \"operations_quality\",\n    label: \"Operations & Quality\",\n    order: 10,\n    shape: \"event-driven\",\n    mental_model: \"Policy → commitment → signal → event → response → learning.\",\n    operators: [\n      \"SRE\",\n      \"security team\",\n      \"QA\",\n      \"compliance officer\",\n      \"customer success\",\n      \"legal\",\n    ],\n    composes_atomic_domains: [\n      \"devops\",\n      \"security\",\n      \"testing\",\n      \"compliance\",\n      \"legal\",\n      \"accessibility\",\n      \"customer_success\",\n      \"localisation\",\n      \"education\",\n      \"team_org\",\n    ],\n    entities: [\n      {\n        type: \"incident\",\n        role: \"anchor\",\n      },\n      {\n        type: \"postmortem\",\n        role: \"leaf\",\n      },\n      {\n        type: \"runbook\",\n        role: \"leaf\",\n      },\n      {\n        type: \"monitor\",\n        role: \"leaf\",\n      },\n      {\n        type: \"service_level_objective\",\n        role: \"hub\",\n      },\n      {\n        type: \"service_level_indicator\",\n        role: \"leaf\",\n      },\n      {\n        type: \"error_budget\",\n        role: \"leaf\",\n      },\n      {\n        type: \"service_level_agreement\",\n        role: \"leaf\",\n      },\n      {\n        type: \"deployment\",\n        role: \"leaf\",\n        notes: \"canonical home is Engineering; release event surfaced to Ops\",\n      },\n      {\n        type: \"alert_rule\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ci_pipeline\",\n        role: \"container\",\n      },\n      {\n        type: \"release_strategy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"on_call_rotation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"infrastructure_component\",\n        role: \"container\",\n      },\n      {\n        type: \"test_plan\",\n        role: \"container\",\n      },\n      {\n        type: \"test_suite\",\n        role: \"container\",\n      },\n      {\n        type: \"qa_session\",\n        role: \"container\",\n      },\n      {\n        type: \"test_case\",\n        role: \"leaf\",\n      },\n      {\n        type: \"test_result\",\n        role: \"leaf\",\n      },\n      {\n        type: \"regression_test\",\n        role: \"leaf\",\n      },\n      {\n        type: \"test_coverage_report\",\n        role: \"leaf\",\n      },\n      {\n        type: \"test_environment\",\n        role: \"leaf\",\n      },\n      {\n        type: \"threat_model\",\n        role: \"root\",\n      },\n      {\n        type: \"threat\",\n        role: \"leaf\",\n      },\n      {\n        type: \"security_control\",\n        role: \"leaf\",\n      },\n      {\n        type: \"security_policy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"vulnerability\",\n        role: \"leaf\",\n      },\n      {\n        type: \"penetration_test\",\n        role: \"leaf\",\n      },\n      {\n        type: \"security_review\",\n        role: \"container\",\n      },\n      {\n        type: \"data_classification\",\n        role: \"leaf\",\n      },\n      {\n        type: \"access_policy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"a11y_standard\",\n        role: \"leaf\",\n      },\n      {\n        type: \"a11y_guideline\",\n        role: \"leaf\",\n      },\n      {\n        type: \"a11y_audit\",\n        role: \"leaf\",\n      },\n      {\n        type: \"a11y_issue\",\n        role: \"leaf\",\n      },\n      {\n        type: \"a11y_annotation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"compliance_requirement\",\n        role: \"leaf\",\n      },\n      {\n        type: \"compliance_framework\",\n        role: \"container\",\n      },\n      {\n        type: \"risk\",\n        role: \"leaf\",\n      },\n      {\n        type: \"data_contract\",\n        role: \"leaf\",\n      },\n      {\n        type: \"audit_log_policy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"security_audit\",\n        role: \"leaf\",\n      },\n      {\n        type: \"customer_feedback\",\n        role: \"leaf\",\n      },\n      {\n        type: \"support_ticket\",\n        role: \"leaf\",\n        notes: \"dual P7\",\n      },\n      {\n        type: \"churn_reason\",\n        role: \"leaf\",\n      },\n      {\n        type: \"customer_health_score\",\n        role: \"leaf\",\n      },\n      {\n        type: \"playbook\",\n        role: \"leaf\",\n      },\n      {\n        type: \"service_blueprint\",\n        role: \"root\",\n      },\n      {\n        type: \"customer_journey_stage\",\n        role: \"container\",\n      },\n      {\n        type: \"touchpoint\",\n        role: \"leaf\",\n      },\n      {\n        type: \"success_milestone\",\n        role: \"leaf\",\n      },\n      {\n        type: \"team\",\n        role: \"container\",\n      },\n      {\n        type: \"department\",\n        role: \"container\",\n      },\n      {\n        type: \"role\",\n        role: \"leaf\",\n      },\n      {\n        type: \"person\",\n        role: \"leaf\",\n      },\n      {\n        type: \"stakeholder\",\n        role: \"leaf\",\n        notes: \"maps_to persona\",\n      },\n      {\n        type: \"team_okr\",\n        role: \"leaf\",\n      },\n      {\n        type: \"retrospective\",\n        role: \"leaf\",\n      },\n      {\n        type: \"dependency\",\n        role: \"leaf\",\n      },\n      {\n        type: \"skill\",\n        role: \"leaf\",\n      },\n      {\n        type: \"ceremony\",\n        role: \"leaf\",\n      },\n      {\n        type: \"capacity_plan\",\n        role: \"leaf\",\n      },\n      {\n        type: \"legal_entity\",\n        role: \"container\",\n      },\n      {\n        type: \"ip_asset\",\n        role: \"leaf\",\n      },\n      {\n        type: \"contract\",\n        role: \"container\",\n      },\n      {\n        type: \"contract_clause\",\n        role: \"leaf\",\n      },\n      {\n        type: \"privacy_policy\",\n        role: \"leaf\",\n      },\n      {\n        type: \"locale\",\n        role: \"container\",\n      },\n      {\n        type: \"translation_key\",\n        role: \"leaf\",\n      },\n      {\n        type: \"translation_bundle\",\n        role: \"container\",\n      },\n      {\n        type: \"locale_config\",\n        role: \"leaf\",\n      },\n      {\n        type: \"cultural_adaptation\",\n        role: \"leaf\",\n      },\n      {\n        type: \"regional_pricing\",\n        role: \"leaf\",\n      },\n      {\n        type: \"education_program\",\n        role: \"container\",\n      },\n      {\n        type: \"tutorial\",\n        role: \"leaf\",\n      },\n      {\n        type: \"walkthrough\",\n        role: \"leaf\",\n      },\n      {\n        type: \"webinar\",\n        role: \"leaf\",\n      },\n      {\n        type: \"certification\",\n        role: \"leaf\",\n      },\n      {\n        type: \"help_video\",\n        role: \"leaf\",\n      },\n      {\n        type: \"learning_path\",\n        role: \"container\",\n      },\n    ],\n    anchor: {\n      type: \"incident\",\n      rationale: \"Forces every other domain to pay attention. References a service (Engineering), may trigger a feature_request (Product), produces a learning (Discovery), may breach an SLA. Cross-domain event propagation test.\",\n      outbound_cross_edge_count: 4,\n      inbound_cross_edge_count: 1,\n    },\n    intra_edges: [\n      \"service_level_objective_measured_by_service_level_indicator\",\n      \"service_level_objective_budgets_as_error_budget\",\n      \"service_level_objective_satisfies_service_level_agreement\",\n      \"incident_analysed_in_postmortem\",\n      \"incident_triggers_postmortem\",\n      \"incident_breaches_service_level_objective\",\n      \"incident_exploits_vulnerability\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"product_experiences_incident\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"import\",\n        edge_id: \"test_case_validates_acceptance_criterion\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"customer_feedback_becomes_feature_request\",\n        crosses_into: \"product_delivery\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"incident_caused_by_root_cause\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"service_level_agreement_governs_service\",\n        crosses_into: \"engineering_platform\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"service_level_objective_tracks_metric\",\n        crosses_into: \"analytics_data\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"user_advisory_board_includes_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"cultural_adaptation_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n      {\n        direction: \"sideways\",\n        edge_id: \"education_program_targets_persona\",\n        crosses_into: \"users_needs\",\n      },\n    ],\n  },\n  {\n    id: \"foundations\",\n    label: \"Foundations\",\n    order: 11,\n    shape: \"polymorphic-target\",\n    mental_model: \"Shared specs and primitives that many products implement, expose, and conform to.\",\n    operators: [\n      \"platform architect\",\n      \"standards author\",\n      \"staff engineer\",\n      \"API designer\",\n    ],\n    composes_atomic_domains: [\n      \"foundations\",\n    ],\n    entities: [\n      {\n        type: \"specification\",\n        role: \"anchor\",\n      },\n      {\n        type: \"primitive\",\n        role: \"container\",\n      },\n      {\n        type: \"operating_lifecycle\",\n        role: \"container\",\n      },\n      {\n        type: \"operating_stage\",\n        role: \"leaf\",\n      },\n    ],\n    anchor: {\n      type: \"specification\",\n      rationale: \"The specification is the rulebook many products point at: they implement, expose, and conform to it, and primitives are defined by it. It is the high-inbound canonical of the Foundations region.\",\n      outbound_cross_edge_count: 0,\n      inbound_cross_edge_count: 6,\n    },\n    intra_edges: [\n      \"specification_extends_specification\",\n      \"specification_competes_with_specification\",\n      \"primitive_defined_by_specification\",\n      \"primitive_composes_primitive\",\n      \"operating_lifecycle_defined_by_specification\",\n      \"operating_lifecycle_contains_operating_stage\",\n    ],\n    boundary_edges: [\n      {\n        direction: \"import\",\n        edge_id: \"journey_phase_realises_operating_stage\",\n        crosses_into: \"experience_design_brand\",\n      },\n      {\n        direction: \"export\",\n        edge_id: \"operating_stage_measured_by_metric\",\n        crosses_into: \"analytics_data\",\n      },\n    ],\n  },\n] as const\n\nexport const UPG_REGION_MAP: Readonly<Record<string, UPGRegion>> =\n  Object.fromEntries(UPG_REGIONS.map((r) => [r.id, r]))\n\nexport function getRegion(id: string): UPGRegion | undefined {\n  return UPG_REGION_MAP[id]\n}\n\nexport function getRegionForEntityType(entityType: string): UPGRegion | undefined {\n  return UPG_REGIONS.find((r) =>\n    r.entities.some((e) => e.type === entityType),\n  )\n}\n\nexport const UPG_REGION_COUNT = UPG_REGIONS.length\n","/**\n * Framework categories and structure patterns. `FrameworkCategory` is the\n * discipline a framework belongs to. `StructurePattern` is the visual\n * topology of its output.\n */\n\n// ─── Categories ─────────────────────────────────────────────────────────────\n\n/** The broad domain a framework belongs to */\nexport type FrameworkCategory =\n  // Core Product\n  | 'prioritization'\n  | 'strategy'\n  | 'discovery'\n  | 'business_model'\n  | 'metrics'\n  | 'validation'\n  | 'planning'\n  | 'competitive'\n  // Design & Research\n  | 'design'\n  | 'ux_research'\n  | 'user_understanding'\n  | 'research'\n  | 'accessibility'\n  | 'feedback_voc'\n  // Engineering & Ops\n  | 'engineering'\n  | 'devops'\n  | 'security'\n  | 'qa_testing'\n  | 'ai_ml'\n  | 'agentic'\n  // Growth & GTM\n  | 'growth'\n  | 'marketing'\n  | 'go_to_market'\n  | 'sales'\n  | 'pricing'\n  // Data, Legal & Ops\n  | 'data_analytics'\n  | 'legal_compliance'\n  | 'customer_success'\n  | 'team_process'\n  | 'program_mgmt'\n  // Content & Portfolio\n  | 'content'\n  | 'education'\n  | 'partnerships'\n  | 'localisation'\n  | 'portfolio'\n\n/** All valid framework categories as a runtime array */\nexport const UPG_FRAMEWORK_CATEGORIES: readonly FrameworkCategory[] = [\n  // Core Product\n  'prioritization',\n  'strategy',\n  'discovery',\n  'business_model',\n  'metrics',\n  'validation',\n  'planning',\n  'competitive',\n  // Design & Research\n  'design',\n  'ux_research',\n  'user_understanding',\n  'research',\n  'accessibility',\n  'feedback_voc',\n  // Engineering & Ops\n  'engineering',\n  'devops',\n  'security',\n  'qa_testing',\n  'ai_ml',\n  'agentic',\n  // Growth & GTM\n  'growth',\n  'marketing',\n  'go_to_market',\n  'sales',\n  'pricing',\n  // Data, Legal & Ops\n  'data_analytics',\n  'legal_compliance',\n  'customer_success',\n  'team_process',\n  'program_mgmt',\n  // Content & Portfolio\n  'content',\n  'education',\n  'partnerships',\n  'localisation',\n  'portfolio',\n] as const\n\n// ─── Structure Patterns ─────────────────────────────────────────────────────\n\n/** The visual / topological shape a framework's structure takes */\nexport type StructurePattern =\n  | 'tree'\n  | 'table'\n  | 'matrix'\n  | 'funnel'\n  | 'collection'\n  | 'quadrant'\n  | 'flow'\n\n/** All valid structure patterns as a runtime array */\nexport const UPG_STRUCTURE_PATTERNS: readonly StructurePattern[] = [\n  'tree',\n  'table',\n  'matrix',\n  'funnel',\n  'collection',\n  'quadrant',\n  'flow',\n] as const\n","/**\n * Relational path resolution: the shared type-composition logic for the\n * `relational` block's edge paths.\n *\n * One implementation, two consumers — the framework validator (which reports\n * malformed paths as authoring errors) and the shape audit (which checks that\n * every type a path reaches is declared in `data.entity_types`). They must agree\n * on what a path means, so they resolve it with the same function rather than\n * two that drift.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\nimport { UPG_EDGE_CATALOG } from '../catalog/edge-catalog.js'\nimport type { RelationalEdgeStep, UPGFramework } from './types.js'\n\ntype EdgeCatalog = Record<string, { source_type: string; target_type: string }>\n\n/** One resolved hop: where the traversal was, and where the step lands it. */\nexport interface ResolvedStep {\n  /** Entity type the traversal is at BEFORE this step */\n  from: string\n  /** Entity type the traversal is at AFTER this step */\n  to: string\n}\n\n/** Why a path failed to resolve. `null` `reason` means it resolved cleanly. */\nexport interface PathResolution {\n  /** The type each step lands on, in order */\n  steps: ResolvedStep[]\n  /** Entity type the whole path lands on, or `null` if it did not resolve */\n  endpoint: string | null\n  /** Human-readable failure, or `null` on success */\n  reason: string | null\n  /** Index of the step that failed, or `-1` */\n  failedAt: number\n}\n\n/**\n * Walk a declared path from a starting entity type.\n *\n * `direction` is read, never inferred: `forward` goes source → target as the\n * catalog declares the edge, `reverse` goes target → source. A step whose\n * starting type does not match the end it claims to enter is a TYPE-COMPOSITION\n * failure and is reported with both types named, because \"invalid path\" without\n * the mismatch is not actionable.\n */\nexport function resolveRelationalPath(\n  spine: string,\n  path: RelationalEdgeStep[],\n  catalog: EdgeCatalog = UPG_EDGE_CATALOG as unknown as EdgeCatalog\n): PathResolution {\n  const steps: ResolvedStep[] = []\n\n  if (path.length === 0) {\n    return { steps, endpoint: null, reason: 'path is empty; a projection must declare at least one step', failedAt: 0 }\n  }\n\n  let current = spine\n\n  for (let i = 0; i < path.length; i++) {\n    const step = path[i]!\n    const entry = catalog[step.edge]\n\n    if (!entry) {\n      return {\n        steps,\n        endpoint: null,\n        failedAt: i,\n        reason: `unknown edge type \"${step.edge}\" — not in the UPG edge catalog`,\n      }\n    }\n\n    if (step.direction !== 'forward' && step.direction !== 'reverse') {\n      return {\n        steps,\n        endpoint: null,\n        failedAt: i,\n        reason: `step direction must be \"forward\" or \"reverse\", got \"${String(step.direction)}\"`,\n      }\n    }\n\n    const entersAt = step.direction === 'forward' ? entry.source_type : entry.target_type\n    const landsOn = step.direction === 'forward' ? entry.target_type : entry.source_type\n\n    if (entersAt !== current) {\n      return {\n        steps,\n        endpoint: null,\n        failedAt: i,\n        reason:\n          `step ${i} (\"${step.edge}\" ${step.direction}) enters at \"${entersAt}\" ` +\n          `but the traversal is at \"${current}\". ` +\n          `The edge is declared ${entry.source_type} -> ${entry.target_type}; ` +\n          `traversing it ${step.direction} requires being at \"${entersAt}\".`,\n      }\n    }\n\n    steps.push({ from: current, to: landsOn })\n    current = landsOn\n  }\n\n  return { steps, endpoint: current, reason: null, failedAt: -1 }\n}\n\n/**\n * Every entity type a framework's relational block touches: the spine, plus each\n * type any path passes through or lands on.\n *\n * INTERMEDIATES COUNT. A type that a path merely passes through is still a type\n * the framework depends on, and an instance of it that no row reaches is exactly\n * as invisible as an unreferenced endpoint — an experiment plan with no runs is\n * the motivating case. Excluding intermediates would let a framework depend on a\n * type it never declares.\n *\n * Unresolvable paths contribute the types they reached before failing; the\n * validator reports the failure itself.\n */\nexport function relationalCoveredEntityTypes(fw: UPGFramework): Set<string> {\n  const covered = new Set<string>()\n  const rel = fw.relational\n  if (!rel) return covered\n\n  covered.add(rel.spine)\n\n  for (const column of rel.columns) {\n    if (column.kind !== 'projection') continue\n    const resolved = resolveRelationalPath(rel.spine, column.path)\n    for (const step of resolved.steps) {\n      covered.add(step.from)\n      covered.add(step.to)\n    }\n  }\n\n  return covered\n}\n","/**\n * Framework validation: validates UPGFramework objects against the spec.\n */\n\nimport { UPG_FRAMEWORK_CATEGORIES, UPG_STRUCTURE_PATTERNS } from './categories.js'\nimport { resolveRelationalPath } from './relational-paths.js'\nimport type {\n  FrameworkSlotPredicate,\n  FrameworkSlotPredicateAtom,\n  RelationalEdgeStep,\n} from './types.js'\n\n// ─── Validation ─────────────────────────────────────────────────────────────\n\n/** Result of validating a UPGFramework object */\nexport interface FrameworkValidationResult {\n  /** Whether the framework passed all required checks */\n  valid: boolean\n  /** Spec violations that must be fixed */\n  errors: string[]\n  /** Best-practice notices that should be reviewed */\n  warnings: string[]\n}\n\n/**\n * Validates a UPGFramework object against the spec.\n *\n * Checks:\n * - Required top-level fields (id, name, version, category, data, structure, presentation, education)\n * - data.entity_types is a non-empty array\n * - structure.pattern is a valid StructurePattern\n * - computed_properties expressions are syntactically valid (balanced parens, valid tokens)\n * - education has required fields (purpose, core_question, when_to_use, when_not_to_use)\n * - category is a valid FrameworkCategory\n *\n * Returns a result with `valid`, `errors`, and `warnings`.\n *\n * @example\n * const result = validateUPGFramework({\n *   id: 'lean_canvas',\n *   name: 'Lean Canvas',\n *   version: '1.0.0',\n *   description: 'One-page business model canvas by Ash Maurya',\n *   category: 'business_model',\n *   origin: { type: 'published', author: 'Ash Maurya', year: 2010 },\n *   structure: { pattern: 'canvas' },\n *   education: {\n *     purpose: 'Validate early-stage business models',\n *     core_question: 'Is this problem worth solving?',\n *     when_to_use: ['pre-launch', 'pivot analysis'],\n *     when_not_to_use: ['mature product optimisation'],\n *   },\n * })\n * // result.valid  === true\n * // result.errors === []\n */\nexport function validateUPGFramework(framework: unknown): FrameworkValidationResult {\n  const errors: string[] = []\n  const warnings: string[] = []\n\n  if (!framework || typeof framework !== 'object') {\n    return { valid: false, errors: ['Framework must be an object'], warnings }\n  }\n\n  const f = framework as Record<string, unknown>\n\n  // ── Required string fields ──────────────────────────────────────────────\n  const requiredStrings = ['id', 'name', 'version', 'description'] as const\n  for (const field of requiredStrings) {\n    if (!f[field] || typeof f[field] !== 'string') {\n      errors.push(`\"${field}\" is required and must be a string`)\n    }\n  }\n\n  // ── Category ────────────────────────────────────────────────────────────\n  if (!f.category || typeof f.category !== 'string') {\n    errors.push('\"category\" is required and must be a string')\n  } else if (!(UPG_FRAMEWORK_CATEGORIES as readonly string[]).includes(f.category as string)) {\n    errors.push(`\"category\" must be one of: ${UPG_FRAMEWORK_CATEGORIES.join(', ')}. Got \"${f.category}\"`)\n  }\n\n  // ── Origin ──────────────────────────────────────────────────────────────\n  if (!f.origin || typeof f.origin !== 'object') {\n    errors.push('\"origin\" is required and must be an object')\n  } else {\n    const origin = f.origin as Record<string, unknown>\n    if (!origin.type || typeof origin.type !== 'string') {\n      errors.push('\"origin.type\" is required and must be a string')\n    }\n    if (!origin.attribution || typeof origin.attribution !== 'string') {\n      warnings.push('\"origin.attribution\" should be a string identifying the creator(s)')\n    }\n  }\n\n  // ── Tags ────────────────────────────────────────────────────────────────\n  if (!Array.isArray(f.tags)) {\n    warnings.push('\"tags\" should be an array of strings')\n  }\n\n  // ── Data spec ───────────────────────────────────────────────────────────\n  if (!f.data || typeof f.data !== 'object') {\n    errors.push('\"data\" is required and must be an object')\n  } else {\n    const data = f.data as Record<string, unknown>\n\n    if (!Array.isArray(data.entity_types) || data.entity_types.length === 0) {\n      errors.push('\"data.entity_types\" is required and must be a non-empty array')\n    } else {\n      (data.entity_types as unknown[]).forEach((et, i) => {\n        if (!et || typeof et !== 'object') {\n          errors.push(`\"data.entity_types[${i}]\" must be an object`)\n          return\n        }\n        const spec = et as Record<string, unknown>\n        if (!spec.type || typeof spec.type !== 'string') {\n          errors.push(`\"data.entity_types[${i}].type\" is required and must be a string`)\n        }\n        if (!spec.role || typeof spec.role !== 'string') {\n          errors.push(`\"data.entity_types[${i}].role\" is required and must be a string`)\n        }\n      })\n    }\n\n    if (!data.required_properties || typeof data.required_properties !== 'object') {\n      errors.push('\"data.required_properties\" is required and must be an object')\n    }\n\n    // Validate computed properties expressions\n    if (Array.isArray(data.computed_properties)) {\n      (data.computed_properties as unknown[]).forEach((cp, i) => {\n        if (!cp || typeof cp !== 'object') {\n          errors.push(`\"data.computed_properties[${i}]\" must be an object`)\n          return\n        }\n        const prop = cp as Record<string, unknown>\n        if (!prop.property || typeof prop.property !== 'string') {\n          errors.push(`\"data.computed_properties[${i}].property\" is required and must be a string`)\n        }\n        if (!prop.expression || typeof prop.expression !== 'string') {\n          errors.push(`\"data.computed_properties[${i}].expression\" is required and must be a string`)\n        } else {\n          const exprError = validateExpression(prop.expression as string)\n          if (exprError) {\n            errors.push(`\"data.computed_properties[${i}].expression\": ${exprError}`)\n          }\n        }\n        if (!prop.entity_type || typeof prop.entity_type !== 'string') {\n          errors.push(`\"data.computed_properties[${i}].entity_type\" is required and must be a string`)\n        }\n      })\n    }\n  }\n\n  // ── Structure spec ──────────────────────────────────────────────────────\n  if (!f.structure || typeof f.structure !== 'object') {\n    errors.push('\"structure\" is required and must be an object')\n  } else {\n    const structure = f.structure as Record<string, unknown>\n    if (!structure.pattern || typeof structure.pattern !== 'string') {\n      errors.push('\"structure.pattern\" is required and must be a string')\n    } else if (!(UPG_STRUCTURE_PATTERNS as readonly string[]).includes(structure.pattern as string)) {\n      errors.push(`\"structure.pattern\" must be one of: ${UPG_STRUCTURE_PATTERNS.join(', ')}. Got \"${structure.pattern}\"`)\n    }\n  }\n\n  // ── Presentation spec ───────────────────────────────────────────────────\n  if (!f.presentation || typeof f.presentation !== 'object') {\n    errors.push('\"presentation\" is required and must be an object')\n  } else {\n    const pres = f.presentation as Record<string, unknown>\n    if (!pres.layout || typeof pres.layout !== 'object') {\n      errors.push('\"presentation.layout\" is required and must be an object')\n    } else {\n      const layout = pres.layout as Record<string, unknown>\n      if (!layout.type || typeof layout.type !== 'string') {\n        errors.push('\"presentation.layout.type\" is required and must be a string')\n      }\n    }\n  }\n\n  // ── Relational spec (optional) ──────────────────────────────────────────\n  //\n  // Only validated when present. A framework without a `relational` block is\n  // unaffected, which is what makes the block additive.\n  //\n  // NOTE, and it is load-bearing: there is deliberately NO mutual-exclusivity\n  // check across columns. Sibling columns admitting the same entity is the JOIN\n  // WORKING, not an authoring bug. Mutual exclusivity is a partition rule and\n  // belongs to predicate zones; enforcing it here would forbid the join this\n  // block exists to express. Do not \"unify\" the two validators.\n  if (f.relational !== undefined) {\n    if (typeof f.relational !== 'object' || f.relational === null || Array.isArray(f.relational)) {\n      errors.push('\"relational\" must be an object when present')\n    } else {\n      const rel = f.relational as Record<string, unknown>\n      errors.push(...validateRelationalSurface(rel))\n\n      // `slots` cannot express an edge path, so a framework that declares a\n      // relational surface AND slots is describing its columns twice, in two\n      // shapes, one of which is known to be lossy.\n      if (Array.isArray(f.slots) && f.slots.length > 0) {\n        warnings.push(\n          '\"relational\" and \"slots\" are both declared. `relational` is authoritative for a join surface; ' +\n            'slots cannot express an edge path and will drift. Remove \"slots\" from this framework.'\n        )\n      }\n\n      // ONE ROSTER, NOT TWO.\n      //\n      // When `relational` is present it IS the column declaration, so\n      // `presentation.layout.columns` must be empty. This is an error rather\n      // than a reconciliation warning on purpose: a roster duplicated in two\n      // places and kept in step by hand is exactly how the pre-repoint package\n      // copies came to disagree on all five of this framework's columns while\n      // every gate stayed green. Policing a duplicate is weaker than not having\n      // one.\n      const presLayout = (f.presentation as Record<string, unknown> | undefined)?.layout as\n        | Record<string, unknown>\n        | undefined\n      if (presLayout?.type === 'table' && Array.isArray(presLayout.columns) && presLayout.columns.length > 0) {\n        errors.push(\n          `\"presentation.layout.columns\" declares ${presLayout.columns.length} columns, but \"relational\" is ` +\n            'the authoritative roster for a join surface. Empty the presentation columns; do not maintain both.'\n        )\n      }\n    }\n  }\n\n  // ── Education spec ──────────────────────────────────────────────────────\n  if (!f.education || typeof f.education !== 'object') {\n    errors.push('\"education\" is required and must be an object')\n  } else {\n    const edu = f.education as Record<string, unknown>\n    if (!edu.purpose || typeof edu.purpose !== 'string') {\n      errors.push('\"education.purpose\" is required and must be a string')\n    }\n    if (!edu.core_question || typeof edu.core_question !== 'string') {\n      errors.push('\"education.core_question\" is required and must be a string')\n    }\n    if (!Array.isArray(edu.when_to_use)) {\n      errors.push('\"education.when_to_use\" is required and must be an array')\n    }\n    if (!Array.isArray(edu.when_not_to_use)) {\n      errors.push('\"education.when_not_to_use\" is required and must be an array')\n    }\n  }\n\n  validateSlotPredicates(f.slots, errors)\n\n  return { valid: errors.length === 0, errors, warnings }\n}\n\n// ─── Predicate zones ────────────────────────────────────────────────────────\n\nconst PREDICATE_SCOPES = ['entity', 'framework'] as const\nconst PREDICATE_OPS = ['eq', 'in', 'gte', 'lt', 'band'] as const\n\n/**\n * The set of values an atom admits, in one of two shapes.\n *\n * `discrete` — an explicit set (`eq`, `in`).\n * `interval` — a half-open numeric range `[lo, hi)`, with ±Infinity for an\n * unbounded end (`gte` is `[n, ∞)`, `lt` is `(-∞, n)`, `band` is `[min, max)`).\n */\ntype AdmittedValues =\n  | { kind: 'discrete'; values: ReadonlyArray<string | number | boolean> }\n  | { kind: 'interval'; lo: number; hi: number }\n\nfunction admits(atom: FrameworkSlotPredicateAtom): AdmittedValues {\n  switch (atom.op) {\n    case 'eq':\n      return { kind: 'discrete', values: [atom.value] }\n    case 'in':\n      return { kind: 'discrete', values: atom.value }\n    case 'gte':\n      return { kind: 'interval', lo: atom.value, hi: Number.POSITIVE_INFINITY }\n    case 'lt':\n      return { kind: 'interval', lo: Number.NEGATIVE_INFINITY, hi: atom.value }\n    case 'band':\n      return { kind: 'interval', lo: atom.value[0], hi: atom.value[1] }\n  }\n}\n\n/**\n * Whether two atoms on the SAME (scope, property) cannot both hold.\n *\n * Proof by empty intersection of admitted values. A discrete value that is not\n * a number can never satisfy a numeric interval, so it counts as outside it —\n * which is the same rule as \"absence is not a value\", applied to type mismatch.\n */\nfunction atomsCannotBothHold(\n  a: FrameworkSlotPredicateAtom,\n  b: FrameworkSlotPredicateAtom,\n): boolean {\n  const x = admits(a)\n  const y = admits(b)\n\n  if (x.kind === 'discrete' && y.kind === 'discrete') {\n    return !x.values.some((v) => y.values.includes(v))\n  }\n  if (x.kind === 'interval' && y.kind === 'interval') {\n    // Half-open [lo, hi): they overlap iff each starts before the other ends.\n    return !(x.lo < y.hi && y.lo < x.hi)\n  }\n  const set = x.kind === 'discrete' ? x : (y as Extract<AdmittedValues, { kind: 'discrete' }>)\n  const range = x.kind === 'interval' ? x : (y as Extract<AdmittedValues, { kind: 'interval' }>)\n  return !set.values.some((v) => typeof v === 'number' && v >= range.lo && v < range.hi)\n}\n\n/**\n * Whether two sibling predicates are PROVABLY disjoint — the test that decides\n * whether a framework's zones are mutually exclusive.\n *\n * Two conjunctions cannot both hold if they share a `(scope, property)` on\n * which their atoms cannot both hold: one such property is enough, because an\n * entity would have to satisfy both atoms on it simultaneously.\n *\n * Note the direction: this returns `true` only when disjointness is PROVED.\n * An unprovable pair is rejected by the validator, not accepted. Over-rejection\n * costs the author a loud error they fix by adding a discriminating atom;\n * accepted overlap costs a silent misclassification at render time. See\n * Amendment 1 §B of the zone-predicate-hook decision.\n *\n * Exported so the renderer resolves membership with the same rule the validator\n * enforced, rather than a second implementation that can drift from it.\n */\nexport function predicatesProvablyDisjoint(\n  a: FrameworkSlotPredicate,\n  b: FrameworkSlotPredicate,\n): boolean {\n  for (const atomA of a) {\n    for (const atomB of b) {\n      if (\n        atomA.scope === atomB.scope &&\n        atomA.property === atomB.property &&\n        atomsCannotBothHold(atomA, atomB)\n      ) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\n/** Narrow one element of a `predicate` array, collecting shape errors. */\nfunction parseAtom(\n  atom: unknown,\n  where: string,\n  errors: string[],\n): FrameworkSlotPredicateAtom | null {\n  if (!atom || typeof atom !== 'object' || Array.isArray(atom)) {\n    errors.push(`${where} must be an object`)\n    return null\n  }\n  const a = atom as Record<string, unknown>\n  let ok = true\n\n  if (typeof a.scope !== 'string' || !PREDICATE_SCOPES.includes(a.scope as never)) {\n    errors.push(`${where}.scope must be one of: ${PREDICATE_SCOPES.join(', ')}`)\n    ok = false\n  }\n  if (typeof a.property !== 'string' || a.property.length === 0) {\n    errors.push(`${where}.property is required and must be a non-empty string`)\n    ok = false\n  }\n  if (typeof a.op !== 'string' || !PREDICATE_OPS.includes(a.op as never)) {\n    errors.push(`${where}.op must be one of: ${PREDICATE_OPS.join(', ')}`)\n    return null\n  }\n\n  switch (a.op) {\n    case 'eq':\n      if (!['string', 'number', 'boolean'].includes(typeof a.value)) {\n        errors.push(`${where}.value must be a string, number, or boolean for op \"eq\"`)\n        ok = false\n      }\n      break\n    case 'in':\n      if (\n        !Array.isArray(a.value) ||\n        a.value.length === 0 ||\n        !a.value.every((v) => typeof v === 'string' || typeof v === 'number')\n      ) {\n        errors.push(`${where}.value must be a non-empty array of strings or numbers for op \"in\"`)\n        ok = false\n      }\n      break\n    case 'gte':\n    case 'lt':\n      if (typeof a.value !== 'number' || !Number.isFinite(a.value)) {\n        errors.push(`${where}.value must be a finite number for op \"${a.op}\"`)\n        ok = false\n      }\n      break\n    case 'band':\n      if (\n        !Array.isArray(a.value) ||\n        a.value.length !== 2 ||\n        !a.value.every((v) => typeof v === 'number' && Number.isFinite(v))\n      ) {\n        errors.push(`${where}.value must be a [min, max] pair of finite numbers for op \"band\"`)\n        ok = false\n      } else if ((a.value as number[])[0] >= (a.value as number[])[1]) {\n        errors.push(\n          `${where}.value is an empty band: min (${(a.value as number[])[0]}) must be less than max (${(a.value as number[])[1]}). The interval is half-open [min, max)`,\n        )\n        ok = false\n      }\n      break\n  }\n\n  return ok ? (a as unknown as FrameworkSlotPredicateAtom) : null\n}\n\n/**\n * Validate predicate zones: atom shapes, then pairwise mutual exclusivity.\n *\n * Enforces the determinism rules the zone-predicate contract declares. The\n * exclusivity check is load-bearing beyond authoring hygiene: the zone-move\n * write policy (Amendment 2) is safe ONLY because no sibling predicate can\n * admit the value a drag writes. Weaken this check and that policy silently\n * weakens with it.\n */\nfunction validateSlotPredicates(slots: unknown, errors: string[]): void {\n  if (!Array.isArray(slots)) return\n\n  const zones: Array<{\n    where: string\n    entityTypeId: string | null\n    predicate: FrameworkSlotPredicate\n  }> = []\n\n  slots.forEach((slot, i) => {\n    if (!slot || typeof slot !== 'object') return\n    const s = slot as Record<string, unknown>\n    if (s.predicate === undefined || s.predicate === null) return\n\n    const label = typeof s.label === 'string' && s.label.length > 0 ? ` (\"${s.label}\")` : ''\n    const where = `\"slots[${i}]${label}.predicate\"`\n\n    if (!Array.isArray(s.predicate)) {\n      errors.push(\n        `${where} must be an array of atoms. A slot's membership rule is a conjunction, even when it has one atom`,\n      )\n      return\n    }\n    if (s.predicate.length === 0) {\n      errors.push(\n        `${where} must not be empty. A zero-atom predicate matches every entity, which is a catch-all cell — declare the property that decides membership`,\n      )\n      return\n    }\n\n    const atoms = s.predicate.map((atom, j) => parseAtom(atom, `${where}[${j}]`, errors))\n    if (atoms.some((a) => a === null)) return\n\n    zones.push({\n      where: `slots[${i}]${label}`,\n      entityTypeId: typeof s.entityTypeId === 'string' ? s.entityTypeId : null,\n      predicate: atoms as FrameworkSlotPredicateAtom[],\n    })\n  })\n\n  for (let i = 0; i < zones.length; i++) {\n    for (let j = i + 1; j < zones.length; j++) {\n      const a = zones[i]\n      const b = zones[j]\n\n      // Slots typed to different entities can never contend for the same\n      // entity, so exclusivity is satisfied structurally.\n      if (a.entityTypeId && b.entityTypeId && a.entityTypeId !== b.entityTypeId) continue\n\n      if (predicatesProvablyDisjoint(a.predicate, b.predicate)) continue\n\n      const shared = a.predicate\n        .filter((x) => b.predicate.some((y) => y.scope === x.scope && y.property === x.property))\n        .map((x) => `${x.scope}.${x.property}`)\n      const hint = shared.length\n        ? `They constrain the same properties (${[...new Set(shared)].join(', ')}) without separating on any of them`\n        : `They constrain no property in common, so an entity can satisfy both`\n\n      errors.push(\n        `\"${a.where}\" and \"${b.where}\" have predicates that are not provably disjoint, so an entity could land in both zones. ${hint}. Add an atom that separates them — for example, a value range on one property that the other excludes`,\n      )\n    }\n  }\n}\n\n/**\n * Validates a computed-property math expression.\n *\n * Checks:\n * - Balanced parentheses\n * - Only allowed tokens: identifiers, numbers, operators (+, -, *, /), parens, whitespace\n *\n * Returns null if valid, or an error message string.\n */\nfunction validateExpression(expr: string): string | null {\n  // Check for empty expression\n  if (expr.trim().length === 0) {\n    return 'Expression must not be empty'\n  }\n\n  // Check balanced parentheses\n  let depth = 0\n  for (const ch of expr) {\n    if (ch === '(') depth++\n    if (ch === ')') depth--\n    if (depth < 0) return 'Unbalanced parentheses: unexpected closing paren'\n  }\n  if (depth !== 0) {\n    return 'Unbalanced parentheses: missing closing paren'\n  }\n\n  // Check for valid tokens only: identifiers (a-z, _, digits), numbers, operators, parens, whitespace, dots\n  const tokenPattern = /^[\\w\\s+\\-*/().]+$/\n  if (!tokenPattern.test(expr)) {\n    return `Expression contains invalid characters. Allowed: identifiers, numbers, +, -, *, /, (, ), .`\n  }\n\n  return null\n}\n\n/**\n * Validates a `relational` surface block.\n *\n * Every failure here is an AUTHORING error and is loud by design: a malformed\n * relational block produces a surface that renders something plausible and wrong\n * (a column of the first member of an unordered set, a cell that is blank\n * whether the edge is missing or merely empty), which is the exact class of\n * defect this block was introduced to remove. Failing at authoring time is the\n * only point at which it is cheap.\n *\n * Returns a list of error strings; empty means valid.\n */\nfunction validateRelationalSurface(rel: Record<string, unknown>): string[] {\n  const errors: string[] = []\n\n  // ── Spine ───────────────────────────────────────────────────────────────\n  const spine = rel.spine\n  if (!spine || typeof spine !== 'string') {\n    errors.push('\"relational.spine\" is required and must be a string (the entity type whose instances are the rows)')\n  }\n\n  // ── Columns ─────────────────────────────────────────────────────────────\n  if (!Array.isArray(rel.columns) || rel.columns.length === 0) {\n    errors.push('\"relational.columns\" is required and must be a non-empty array')\n    return errors\n  }\n\n  const seenIds = new Set<string>()\n\n  for (let i = 0; i < rel.columns.length; i++) {\n    const col = rel.columns[i]\n    const at = `\"relational.columns[${i}]\"`\n\n    if (!col || typeof col !== 'object' || Array.isArray(col)) {\n      errors.push(`${at} must be an object`)\n      continue\n    }\n\n    const c = col as Record<string, unknown>\n\n    // Stable id, unique within the surface. Labels are display strings and\n    // cannot be the reference key: `sort.column` must survive relabelling.\n    if (!c.id || typeof c.id !== 'string') {\n      errors.push(`${at}.id is required and must be a string`)\n    } else if (seenIds.has(c.id)) {\n      errors.push(`${at}.id \"${c.id}\" is duplicated; column ids must be unique within a surface`)\n    } else {\n      seenIds.add(c.id)\n    }\n\n    if (!c.label || typeof c.label !== 'string') {\n      errors.push(`${at}.label is required and must be a string`)\n    }\n\n    switch (c.kind) {\n      case 'field': {\n        if (!c.property || typeof c.property !== 'string') {\n          errors.push(`${at}.property is required on a field column and must be a string`)\n        }\n        // A field column reads the ROW's own property, so it must not declare an\n        // entity type. Permitting one would re-create the artefact this block\n        // removes: a column that looks like a second zone holding the spine type.\n        if ('entityTypeId' in c) {\n          errors.push(\n            `${at} is a field column and must NOT declare \"entityTypeId\" — its entity is the spine by definition. ` +\n              `A field column that names a type is the slot-forced shape this block replaces.`\n          )\n        }\n        if ('path' in c) {\n          errors.push(`${at} is a field column and must NOT declare \"path\"; use kind:\"projection\" to traverse edges`)\n        }\n        break\n      }\n\n      case 'computed': {\n        if (!c.expression || typeof c.expression !== 'string') {\n          errors.push(`${at}.expression is required on a computed column and must be a string`)\n        } else {\n          const exprError = validateExpression(c.expression)\n          if (exprError) errors.push(`${at}.expression: ${exprError}`)\n        }\n        break\n      }\n\n      case 'projection': {\n        if (!Array.isArray(c.path) || c.path.length === 0) {\n          errors.push(\n            `${at}.path is required on a projection column and must be a non-empty array of { edge, direction } steps`\n          )\n        } else {\n          let stepShapeOk = true\n          for (let s = 0; s < c.path.length; s++) {\n            const step = c.path[s]\n            if (!step || typeof step !== 'object' || Array.isArray(step)) {\n              errors.push(`${at}.path[${s}] must be an object { edge, direction }`)\n              stepShapeOk = false\n              continue\n            }\n            const st = step as Record<string, unknown>\n            if (!st.edge || typeof st.edge !== 'string') {\n              errors.push(`${at}.path[${s}].edge is required and must be a string`)\n              stepShapeOk = false\n            }\n            // Direction is explicit and never inferred: endpoint types cannot\n            // disambiguate a self-edge, of which the catalog has several.\n            if (st.direction !== 'forward' && st.direction !== 'reverse') {\n              errors.push(\n                `${at}.path[${s}].direction is required and must be \"forward\" or \"reverse\" (never inferred)`\n              )\n              stepShapeOk = false\n            }\n          }\n\n          // Type composition: only checkable once the steps are well-shaped and\n          // the spine is known.\n          if (stepShapeOk && typeof spine === 'string') {\n            const resolved = resolveRelationalPath(spine, c.path as RelationalEdgeStep[])\n            if (resolved.reason) {\n              errors.push(`${at}.path does not compose from spine \"${spine}\": ${resolved.reason}`)\n            }\n          }\n        }\n\n        if (!Array.isArray(c.fields) || c.fields.length === 0) {\n          errors.push(`${at}.fields is required on a projection column and must be a non-empty array of property keys`)\n        }\n\n        if (c.limit !== undefined && (typeof c.limit !== 'number' || !Number.isInteger(c.limit) || c.limit < 1)) {\n          errors.push(`${at}.limit must be a positive integer when present (it truncates rendering, never membership)`)\n        }\n        break\n      }\n\n      default:\n        errors.push(`${at}.kind must be one of: field, computed, projection. Got \"${String(c.kind)}\"`)\n    }\n  }\n\n  // ── Sort ────────────────────────────────────────────────────────────────\n  // Declared, never inferred. The renderer contributes no default row order, so\n  // an unresolvable sort reference is an error rather than a fallback.\n  const sort = rel.sort\n  if (!sort || typeof sort !== 'object' || Array.isArray(sort)) {\n    errors.push('\"relational.sort\" is required and must be an object { column, direction }')\n  } else {\n    const s = sort as Record<string, unknown>\n    if (!s.column || typeof s.column !== 'string') {\n      errors.push('\"relational.sort.column\" is required and must be a string (a column id)')\n    } else if (seenIds.size > 0 && !seenIds.has(s.column)) {\n      errors.push(\n        `\"relational.sort.column\" is \"${s.column}\", which is not a declared column id. ` +\n          `Declared ids: ${[...seenIds].join(', ')}`\n      )\n    }\n    if (s.direction !== 'asc' && s.direction !== 'desc') {\n      errors.push('\"relational.sort.direction\" is required and must be \"asc\" or \"desc\"')\n    }\n  }\n\n  return errors\n}\n","/**\n * Canonical `.upg` serialisation, the `upg fmt` reference implementation.\n *\n * The same logical graph always serialises to byte-identical output, regardless\n * of which tool wrote it. This is the linchpin of UPG-577: every writer (MCP\n * server, CLI, SDK, cloud export, AI agents via MCP) calls this one serialiser,\n * so git diffs reflect MEANING, not formatting.\n *\n * Anchored on RFC 8785 (JSON Canonicalization Scheme) for the\n * object-internal rules, with two deliberate deviations for the git-review\n * lifecycle: (1) pretty-print (2-space, one element per line, LF) rather than\n * JCS's compact single line; (2) semantic sort of the set-like arrays\n * (`nodes`, `edges`, `cross_edges`, `tags`) rather than JCS's preserve-as-is.\n *\n * https://unifiedproductgraph.org/spec | MIT\n */\n\n// Namespace import (not `import { createHash }`): a named import binds the\n// member at module-load, which throws in browser bundlers that externalise\n// `node:crypto` (e.g. Vite-based apps that import this package for its type\n// registry and property schema on the client). A namespace defers the\n// `.createHash` access to call-time — only Node writers (CLI/MCP/SDK/cloud)\n// ever call it, never browsers.\nimport * as nodeCrypto from 'node:crypto'\nimport type { UPGBaseNode } from '../shapes/base-node.js'\nimport type { UPGEdge } from '../shapes/edges.js'\nimport type {\n  UPGDocument,\n  UPGPortfolioDocument,\n  UPGCrossEdge,\n  UPGProduct,\n  UPGProductStage,\n} from '../shapes/document.js'\n\n/**\n * The on-disk canonical serialisation version, written to `$upg.format_version`.\n * Distinct from `UPG_VERSION` (the catalogue/spec version, written to\n * `$upg.spec_version`): the *serialisation* can evolve independently of the\n * *schema*. Bumped to 1.0.0 for the canonical-form + `$upg` header release\n * (UPG-577), the first format version actually written to disk.\n */\nexport const UPG_CANONICAL_FORMAT_VERSION = '1.0.0' as const\n\n/** Underlying cryptographic hash primitive used to compute the digest. */\nconst INTEGRITY_HASH_PRIMITIVE = 'sha256' as const\n/** Hex chars of digest retained: 32 hex = 128 bits (a truncation of SHA-256). */\nconst INTEGRITY_DIGEST_HEX = 32\n/**\n * Public label for the integrity digest, recorded in `$upg.integrity.algorithm`.\n * It is SHA-256 truncated to 128 bits, so the label must say so: a reader that\n * recomputes a full `sha256` would get 64 chars and never match the stored 32.\n * The \"sha256-128\" form mirrors the SHA-512/256 truncation convention.\n */\nconst INTEGRITY_ALGORITHM = 'sha256-128' as const\n\n// ─── The `$upg` header ──────────────────────────────────────────────────────\n\n/** Provenance block inside the `$upg` header. Holds the volatile fields. */\nexport interface UPGHeaderProvenance {\n  /** The tool that produced this document */\n  tool: string\n  /** Optional tool version */\n  tool_version?: string\n  /** ISO 8601 timestamp of export (volatile, excluded from the integrity body) */\n  exported_at?: string\n  /** Optional workspace/project identifier in the source tool */\n  workspace_id?: string\n}\n\n/** Integrity block inside the `$upg` header, checksum of the canonical BODY. */\nexport interface UPGHeaderIntegrity {\n  /** Hash algorithm label, e.g. \"sha256-128\" (SHA-256 truncated to 128 bits) */\n  algorithm: string\n  /** Hex checksum of the canonical serialisation of the body (product + nodes + edges) */\n  body: string\n}\n\n/**\n * The reserved `$upg` header object. Consolidates the previously-scattered\n * metadata (`upg_version`, `source`, `exported_at`, `_integrity`) into one\n * leading object so a reader gets instant orientation and tools can read\n * metadata without parsing the whole graph.\n */\nexport interface UPGHeader {\n  /** Serialisation/format version (this serialiser's contract) */\n  format_version: string\n  /** Spec (catalogue) version the graph conforms to */\n  spec_version: string\n  /** \"portfolio\" for portfolio documents; omitted for single-product */\n  kind?: 'portfolio'\n  /**\n   * Workspace member kind for single-product graphs (0.10.0, #45): `org_rollup`\n   * (company umbrella), `watched` (monitored intelligence graph), or\n   * `operating_function` (a function a team operates, not a product it ships;\n   * 0.17.0). Omitted for ordinary products (the default). Distinct from `kind`,\n   * which is the portfolio-vs-product document discriminator.\n   */\n  member_kind?: 'org_rollup' | 'watched' | 'operating_function'\n  /** Summary mirror of the root product (single-product docs) */\n  product?: { id: string; title: string; stage?: string }\n  /** Summary mirror of the organisation (portfolio docs) */\n  organization?: { id: string; title: string }\n  /** One-line description, mirrored from the product/org for at-a-glance orientation */\n  summary?: string\n  /** Element counts, for cheap size reads without walking the graph */\n  counts: Record<string, number>\n  /** Provenance, who/what last wrote this, and when (volatile) */\n  provenance: UPGHeaderProvenance\n  /** Tamper-evidence over the canonical body */\n  integrity: UPGHeaderIntegrity\n}\n\n// ─── JCS-style canonicalisation of open values ───────────────────────────────\n\n/**\n * Recursively canonicalise an arbitrary JSON value per RFC 8785 object rules:\n * object keys sorted ascending by UTF-16 code unit; array element ORDER\n * preserved (arrays are meaningful sequences); scalars untouched. Used for\n * open objects (`properties`) and any nested value we do not pin by hand.\n */\nfunction canonicalizeOpen(value: unknown): unknown {\n  if (Array.isArray(value)) return value.map(canonicalizeOpen)\n  if (value !== null && typeof value === 'object') {\n    const out: Record<string, unknown> = {}\n    for (const key of Object.keys(value as Record<string, unknown>).sort(byCodeUnit)) {\n      out[key] = canonicalizeOpen((value as Record<string, unknown>)[key])\n    }\n    return out\n  }\n  return value\n}\n\n/** Code-unit (UTF-16) ascending comparison, NEVER locale-aware (must be stable across machines). */\nfunction byCodeUnit(a: string, b: string): number {\n  return a < b ? -1 : a > b ? 1 : 0\n}\n\n/** True when a value is \"empty\" and should be omitted from canonical output (ADR A.5). */\nfunction isEmpty(value: unknown): boolean {\n  if (value === null || value === undefined) return true\n  if (typeof value === 'string') return value.length === 0\n  if (Array.isArray(value)) return value.length === 0\n  if (typeof value === 'object') return Object.keys(value as object).length === 0\n  return false\n}\n\n/**\n * Build an object with keys emitted in `keyOrder` first (skipping empty\n * optionals), then any remaining keys JCS-sorted. `forceKeys` are emitted even\n * when empty (the required identity fields). Values for keys named in\n * `openKeys` are canonicalised recursively (open objects like `properties`).\n */\nfunction orderedObject(\n  source: Record<string, unknown>,\n  keyOrder: string[],\n  opts: { forceKeys?: string[]; openKeys?: string[] } = {},\n): Record<string, unknown> {\n  const force = new Set(opts.forceKeys ?? [])\n  const open = new Set(opts.openKeys ?? [])\n  const out: Record<string, unknown> = {}\n  const emit = (key: string) => {\n    if (!(key in source)) return\n    const raw = source[key]\n    if (!force.has(key) && isEmpty(raw)) return\n    out[key] = open.has(key) ? canonicalizeOpen(raw) : raw\n  }\n  for (const key of keyOrder) emit(key)\n  for (const key of Object.keys(source).sort(byCodeUnit)) {\n    if (!keyOrder.includes(key)) emit(key)\n  }\n  return out\n}\n\n// ─── Drift repair (ADR A.6) ──────────────────────────────────────────────────\n\n/**\n * Repair double-encoded JSON drift: some historical writers stored\n * `properties`/`tags` as JSON *strings* instead of structured values. If a\n * field that must be an object/array holds a string that parses to the\n * expected type, restructure it (idempotent). Otherwise throw, never guess.\n */\nfunction repairNodeDrift(node: UPGBaseNode): UPGBaseNode {\n  const out: UPGBaseNode = { ...node }\n  if (typeof out.properties === 'string') {\n    out.properties = parseDriftString(out.properties, 'object', `node ${node.id}.properties`) as Record<\n      string,\n      unknown\n    >\n  }\n  if (typeof (out.tags as unknown) === 'string') {\n    out.tags = parseDriftString(out.tags as unknown as string, 'array', `node ${node.id}.tags`) as string[]\n  }\n  return out\n}\n\nfunction parseDriftString(raw: string, expect: 'object' | 'array', where: string): unknown {\n  let parsed: unknown\n  try {\n    parsed = JSON.parse(raw)\n  } catch {\n    throw new Error(`[upg fmt] ${where} is a string that is not valid JSON: ${truncate(raw)}`)\n  }\n  const ok = expect === 'array' ? Array.isArray(parsed) : parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n  if (!ok) throw new Error(`[upg fmt] ${where} is a string that does not parse to a JSON ${expect}: ${truncate(raw)}`)\n  return parsed\n}\n\nfunction truncate(s: string): string {\n  return s.length > 60 ? s.slice(0, 57) + '...' : s\n}\n\n/**\n * Derive the one-line `$upg.summary` from a description: first non-empty line,\n * capped. Kept short on purpose, the header is orientation, not a copy of the\n * product body. Always re-derived on serialise, so it cannot drift.\n */\nfunction deriveSummary(description?: string): string | undefined {\n  if (!description) return undefined\n  const firstLine = description.split('\\n').map((l) => l.trim()).find((l) => l.length > 0)\n  if (!firstLine) return undefined\n  return firstLine.length > 200 ? firstLine.slice(0, 197) + '...' : firstLine\n}\n\n// ─── Element ordering for the set-like arrays (ADR A.2) ──────────────────────\n\nfunction sortNodes(nodes: UPGBaseNode[]): UPGBaseNode[] {\n  return [...nodes].sort((a, b) =>\n    byCodeUnit(a.type ?? '', b.type ?? '') ||\n    byCodeUnit(a.slug ?? a.title ?? '', b.slug ?? b.title ?? '') ||\n    byCodeUnit(a.id ?? '', b.id ?? ''),\n  )\n}\n\nfunction sortEdges<T extends { source: string; target: string; type: string; id: string }>(edges: T[]): T[] {\n  return [...edges].sort((a, b) =>\n    byCodeUnit(a.source ?? '', b.source ?? '') ||\n    byCodeUnit(a.target ?? '', b.target ?? '') ||\n    byCodeUnit(a.type ?? '', b.type ?? '') ||\n    byCodeUnit(a.id ?? '', b.id ?? ''),\n  )\n}\n\n// ─── Per-object canonical key order (ADR A.1) ────────────────────────────────\n\n/**\n * Canonical serialisation order for a node's top-level keys.\n *\n * Deliberately a SUPERSET of `UPG_BASE_NODE_FIELDS`: it also orders tolerated\n * non-base keys (`lifecycle_status`, `sort_order`) so that a graph carrying one\n * still serialises deterministically. `base-node-fields.test.ts` asserts the\n * subset relation in the other direction, which is the one that can regress: a\n * base field declared and never added here would silently drop out of canonical\n * ordering. Never assert equality, which would fail on the two tolerated keys\n * and push the next author to delete them.\n *\n * Exported at 0.33.0 so that assertion can be written; consumers that need to\n * classify base fields use `UPG_BASE_NODE_FIELDS`, not this.\n */\nexport const NODE_KEY_ORDER = [\n  'id', 'type', 'title', 'slug', 'aliases', 'key', 'description', 'tags', 'status',\n  'archived', 'archived_at',\n  'lifecycle_status', 'source_id', 'source_type', 'mapping_confidence',\n  'external_tool', 'external_ref', 'external_id', 'external_links',\n  'created_at', 'updated_at', 'sort_order', 'properties',\n]\n/**\n * Canonical key order for a within-graph edge.\n *\n * @remarks\n * EXPORTED AT 0.34.0 so the subset assertion can be written, exactly as\n * `NODE_KEY_ORDER` was exported at 0.33.0 and for the same reason. K1 of the\n * 0.33.0 bundle fixed this class for nodes and left both edge twins as\n * hand-maintained, unexported, unasserted consts — and the very next release\n * added a field to `UPGEdge`, which is the regression the node-side assertion\n * exists to prevent. `canonical-format.test.ts` asserts every declared `UPGEdge`\n * key appears here. A SUBSET, never equality, for the reason the node comment\n * gives: an equality check would fail on tolerated keys and push the next author\n * to delete them.\n */\nexport const EDGE_KEY_ORDER = ['id', 'source', 'target', 'type', 'mapping_confidence', 'provenance', 'properties']\n/**\n * Canonical key order for a portfolio cross-product edge. The third instance of\n * the class `NODE_KEY_ORDER` fixed at 0.33.0, exported at 0.34.0 with the same\n * subset assertion.\n *\n * @remarks\n * NO `provenance` ENTRY, deliberately. 0.34.0 added `provenance?` to `UPGEdge`\n * and NOT to `UPGCrossEdge`, so an entry here would order a key that cannot be\n * written. The assertion is the point of touching this const at all: it is the\n * direction that can regress, and the next field added to `UPGCrossEdge` now\n * cannot go unordered.\n *\n * `properties` WAS MISSING UNTIL 0.34.0, and the new assertion found it on its\n * first run. It has been declared on `UPGCrossEdge` since 0.10.0 (the parity\n * assessment a `feature_rivals_competitor_feature` cross-edge carries), and it\n * fell through to the sorted-tail pass instead: deterministic, so nothing was\n * corrupt, but positioned alphabetically among unlisted keys rather than in the\n * slot the shape implies. That is precisely the regression the node twin got a\n * guard for at 0.33.0, sitting unnoticed in the edge twin for eleven minors.\n *\n * Measured before changing it, because a canonical-order edit rewrites bytes:\n * across all 61 cross-edges in the estate, ZERO carry `properties`. So no file\n * re-serialises differently and the fix is free today, which it would not have\n * been after the first parity assessment landed.\n */\nexport const CROSS_EDGE_KEY_ORDER = ['id', 'source', 'target', 'type', 'source_product_id', 'target_product_id', 'mapping_confidence', 'properties', 'alias', 'relevance', 'audience_role']\nconst PRODUCT_KEY_ORDER = ['id', 'title', 'description', 'stage', 'properties']\n\nfunction canonicalNode(node: UPGBaseNode): Record<string, unknown> {\n  const repaired = repairNodeDrift(node) as unknown as Record<string, unknown>\n  // tags: sort + de-duplicate (unordered label set). aliases: preserve order (append-only history).\n  if (Array.isArray(repaired.tags)) {\n    repaired.tags = [...new Set(repaired.tags as string[])].sort(byCodeUnit)\n  }\n  return orderedObject(repaired, NODE_KEY_ORDER, { forceKeys: ['id', 'type', 'title'], openKeys: ['properties'] })\n}\n\nfunction canonicalEdge(edge: UPGEdge): Record<string, unknown> {\n  return orderedObject(edge as unknown as Record<string, unknown>, EDGE_KEY_ORDER, {\n    forceKeys: ['id', 'source', 'target', 'type'],\n    openKeys: ['properties'],\n  })\n}\n\nfunction canonicalCrossEdge(edge: UPGCrossEdge): Record<string, unknown> {\n  return orderedObject(edge as unknown as Record<string, unknown>, CROSS_EDGE_KEY_ORDER, {\n    forceKeys: ['id', 'source', 'target', 'type'],\n    // `properties` is an OPEN bag and must be canonicalised like every other one\n    // (node, edge, product all pass it). Without this, two writers emitting the\n    // same parity assessment with their keys in a different order produce\n    // different bytes, which breaks contract 3 of this format: input key order\n    // does not change the output. Free to fix today and measured as such: zero\n    // of the 61 cross-edges in the estate carry properties.\n    openKeys: ['properties'],\n  })\n}\n\nfunction canonicalProduct(product: Record<string, unknown>): Record<string, unknown> {\n  return orderedObject(product, PRODUCT_KEY_ORDER, { forceKeys: ['id', 'title'], openKeys: ['properties'] })\n}\n\n/**\n * Reconcile the root product summary against its canonical node.\n *\n * The product lives in two places: the root `doc.product` summary (mirrored into\n * the `$upg` header) and, once graph tools operate on it, a `type: 'product'`\n * node in `doc.nodes` sharing the product's id. Graph edits (`update_node`, batch\n * ops) touch the node, so the root summary and the header drift, a product can\n * read `concept` / \"304 types\" in the header while the node already says `launch`\n * / \"313 types\". Treat the node as the source of truth and overlay its live\n * title, description, and stage onto the root, so the body block, the derived\n * summary, and the header all re-derive from current data on every write. This\n * is self-healing: a file that already drifted is corrected on its next write.\n * No matching node (product is root-only): returned unchanged.\n *\n * STAGE AUTHORITY (0.30.1). Because this overlay runs on EVERY serialize, the\n * node — not the summary — is the authoritative store of a product's stage, and\n * `$upg.product.stage` / `doc.product.stage` are its denormalised projection.\n * The corollary is a rule every writer must obey: **a stage write that touches\n * only the summary is a no-op on disk**, because this function re-derives the\n * summary from the untouched node before the bytes are written. `updateProduct`\n * and `update_node` therefore write the node carriers too (sdk `lib/workspace.ts`,\n * `lib/tools.ts` §B). Resolution order below is the SAME order those writers and\n * `get_graph_digest` read in — `properties.stage`, then `status` — so the\n * serialiser can never disagree with what a read reports. (Two different\n * precedence orders in one system is precisely how a silent no-op survives:\n * the writer synced the header from `properties.stage` while the serialiser\n * overlaid `status` back over it.)\n */\nfunction effectiveRootProduct(doc: UPGDocument): UPGProduct {\n  const node = doc.nodes?.find((n) => n.type === 'product' && n.id === doc.product.id)\n  if (!node) return doc.product\n  // A product's lifecycle status IS its stage, the same axis (grammar/lifecycles),\n  // and `properties.stage` is the spec's declared carrier for it on a product node\n  // (the `properties.stage → status` lift was deliberately retired in 0.9.10 #33\n  // because product stage is its own 9-phase axis). Prefer the declared carrier,\n  // fall back to `status`, then to the summary.\n  const propStage = (node.properties as Record<string, unknown> | undefined)?.stage\n  const nodeStage =\n    (typeof propStage === 'string' ? (propStage as UPGProductStage) : undefined) ??\n    (node.status as UPGProductStage | undefined)\n  return {\n    ...doc.product,\n    title: node.title ?? doc.product.title,\n    description: node.description ?? doc.product.description,\n    stage: nodeStage ?? doc.product.stage,\n  }\n}\n\n// ─── Body assembly + checksum ────────────────────────────────────────────────\n\n/** The canonical body of a single-product doc: product + sorted nodes + sorted edges. */\nfunction singleBody(doc: UPGDocument): Record<string, unknown> {\n  return {\n    product: canonicalProduct(effectiveRootProduct(doc) as unknown as Record<string, unknown>),\n    nodes: sortNodes(doc.nodes ?? []).map(canonicalNode),\n    edges: sortEdges(doc.edges ?? []).map(canonicalEdge),\n  }\n}\n\n/** The canonical body of a portfolio doc. */\nfunction portfolioBody(doc: UPGPortfolioDocument): Record<string, unknown> {\n  const products = [...(doc.products ?? [])]\n    .sort((a, b) => byCodeUnit(a.id ?? '', b.id ?? ''))\n    .map((p) => {\n      const { nodes, edges, ...rest } = p\n      return {\n        ...canonicalProduct(rest as unknown as Record<string, unknown>),\n        nodes: sortNodes(nodes ?? []).map(canonicalNode),\n        edges: sortEdges(edges ?? []).map(canonicalEdge),\n      }\n    })\n  return {\n    organization: orderedObject(doc.organization as unknown as Record<string, unknown>, ['id', 'title', 'description', 'logo_url', 'industry'], { forceKeys: ['id', 'title'] }),\n    product_areas: [...(doc.product_areas ?? [])]\n      .sort((a, b) => byCodeUnit(a.id ?? '', b.id ?? ''))\n      .map((a) => orderedObject(a as unknown as Record<string, unknown>, ['id', 'title', 'description', 'parent_area_id', 'strategic_priority', 'products'], { forceKeys: ['id', 'title'] })),\n    portfolios: [...(doc.portfolios ?? [])]\n      .sort((a, b) => byCodeUnit(a.id ?? '', b.id ?? ''))\n      .map((p) => orderedObject(p as unknown as Record<string, unknown>, ['id', 'title', 'description', 'parent_portfolio_id', 'hierarchy_model', 'products'], { forceKeys: ['id', 'title'] })),\n    products,\n    cross_edges: sortEdges(doc.cross_edges ?? []).map(canonicalCrossEdge),\n    // Registry tier (shared vocabulary). Emitted only when non-empty so existing\n    // portfolio files without a registry stay byte-identical. Canonical entities\n    // are normal nodes, serialised with the same node/edge canonical rules.\n    ...(doc.registry && doc.registry.nodes.length > 0\n      ? {\n          registry: {\n            nodes: sortNodes(doc.registry.nodes).map(canonicalNode),\n            ...(doc.registry.edges && doc.registry.edges.length > 0\n              ? { edges: sortEdges(doc.registry.edges).map(canonicalEdge) }\n              : {}),\n          },\n        }\n      : {}),\n    // Append-only classification-history stream (0.11.0). Emitted only when\n    // non-empty so existing portfolio files without it stay byte-identical.\n    // Each entry is a competitor_signal node (serialised with the node rules).\n    ...(doc.signals && doc.signals.length > 0\n      ? { signals: sortNodes(doc.signals).map(canonicalNode) }\n      : {}),\n  }\n}\n\n// ─── Header counts derivation ───────────────────────────────────────────────\n//\n// `$upg.counts` is DERIVED data: a cheap size read that must always equal the\n// body it sits above. It is written by the serialiser and — since the\n// `checkHeaderSeal` addition — read back by verifiers. Both call the SAME\n// derivation below, so the writer and the verifier can never disagree about\n// what the counts should be. (Before this extraction the derivation was inline\n// in the two serialise paths and nothing read it back, which is precisely how a\n// git-merged file could declare 1274 nodes while holding 1275 and still pass\n// every drift class clean.)\n\n/** Element counts for a single-product document, as stamped into `$upg.counts`. */\nexport function deriveSingleCounts(doc: UPGDocument): Record<string, number> {\n  return { nodes: doc.nodes?.length ?? 0, edges: doc.edges?.length ?? 0 }\n}\n\n/**\n * Element counts for a portfolio document, as stamped into `$upg.counts`.\n *\n * `products` counts only `product`-kind members (0.10.0, #45): a watched\n * competitor-intelligence graph, the org_rollup umbrella graph, or an\n * operating_function graph (0.17.0) is registered for reference but is not a\n * product under management. Members carry `member_kind` (absent = product,\n * back-compat); the non-product kinds are surfaced separately so the breakdown\n * stays legible, and are OMITTED when zero so existing portfolio files without\n * them stay byte-identical.\n */\nexport function derivePortfolioCounts(doc: UPGPortfolioDocument): Record<string, number> {\n  const members = (doc.products ?? []) as Array<{ member_kind?: string }>\n  const memberKindOf = (p: { member_kind?: string }) => p.member_kind ?? 'product'\n  const watchedCount = members.filter((p) => memberKindOf(p) === 'watched').length\n  const rollupCount = members.filter((p) => memberKindOf(p) === 'org_rollup').length\n  const operatingFunctionCount = members.filter((p) => memberKindOf(p) === 'operating_function').length\n  return {\n    products: members.filter((p) => memberKindOf(p) === 'product').length,\n    ...(watchedCount > 0 ? { watched_products: watchedCount } : {}),\n    ...(rollupCount > 0 ? { org_rollups: rollupCount } : {}),\n    ...(operatingFunctionCount > 0 ? { operating_functions: operatingFunctionCount } : {}),\n    product_areas: doc.product_areas?.length ?? 0,\n    portfolios: doc.portfolios?.length ?? 0,\n    cross_edges: doc.cross_edges?.length ?? 0,\n  }\n}\n\n/** Dispatching form of the two count derivations above. */\nexport function deriveCounts(doc: UPGDocument | UPGPortfolioDocument): Record<string, number> {\n  return isPortfolio(doc)\n    ? derivePortfolioCounts(doc as UPGPortfolioDocument)\n    : deriveSingleCounts(doc as UPGDocument)\n}\n\n/**\n * Deterministic checksum of the canonical body (volatile fields excluded by\n * construction, the body has no timestamps). Hex, first 32 chars.\n */\nexport function computeBodyChecksum(doc: UPGDocument | UPGPortfolioDocument): string {\n  const body = isPortfolio(doc) ? portfolioBody(doc) : singleBody(doc as UPGDocument)\n  // JSON.stringify with no indent: the hash input only needs to be deterministic,\n  // and key order is already canonical from the body builders.\n  const content = JSON.stringify(body)\n  return nodeCrypto.createHash(INTEGRITY_HASH_PRIMITIVE).update(content).digest('hex').slice(0, INTEGRITY_DIGEST_HEX)\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function isPortfolio(doc: UPGDocument | UPGPortfolioDocument): doc is UPGPortfolioDocument {\n  return (doc as UPGPortfolioDocument).type === 'portfolio' || 'cross_edges' in doc\n}\n\nexport interface SerializeOptions {\n  /** Override the export timestamp (default: omitted; writers set provenance.exported_at). */\n  exportedAt?: string\n  /** Who/what is writing (maps to provenance). Falls back to the doc's `source`. */\n  source?: { tool: string; tool_version?: string; workspace_id?: string }\n}\n\n/**\n * Serialise a UPG document to its canonical on-disk form (the `$upg` header\n * envelope). Idempotent and writer-agnostic: the same logical graph always\n * yields byte-identical output. Always ends with a single trailing newline.\n */\nexport function serializeCanonical(\n  doc: UPGDocument | UPGPortfolioDocument,\n  opts: SerializeOptions = {},\n): string {\n  if (isPortfolio(doc)) return serializePortfolioWithHeader(doc as UPGPortfolioDocument, opts)\n  return serializeSingleWithHeader(doc as UPGDocument, opts)\n}\n\n/** Build the volatile-aware provenance block shared by both envelopes. */\nfunction buildProvenance(doc: UPGDocument | UPGPortfolioDocument, opts: SerializeOptions): Record<string, unknown> {\n  const source = opts.source ?? doc.source ?? { tool: 'unknown' }\n  return orderedObject(\n    {\n      tool: source.tool,\n      tool_version: source.tool_version,\n      workspace_id: source.workspace_id,\n      exported_at: opts.exportedAt ?? doc.exported_at,\n    },\n    ['tool', 'tool_version', 'workspace_id', 'exported_at'],\n    { forceKeys: ['tool'] },\n  )\n}\n\n/** Single-product canonical form: the `$upg` header envelope (Layer 1 + Layer 2). */\nfunction serializeSingleWithHeader(doc: UPGDocument, opts: SerializeOptions): string {\n  const body = singleBody(doc)\n  const product = effectiveRootProduct(doc)\n  const header: Record<string, unknown> = {\n    format_version: UPG_CANONICAL_FORMAT_VERSION,\n    spec_version: doc.upg_version,\n    product: orderedObject(\n      { id: product.id, title: product.title, stage: product.stage },\n      ['id', 'title', 'stage'],\n      { forceKeys: ['id', 'title'] },\n    ),\n  }\n  const summary = deriveSummary(product.description)\n  if (summary) header.summary = summary\n  header.counts = deriveSingleCounts(doc)\n  // Member kind (0.10.0, #45): stamp non-default kinds so the graph carries its\n  // own posture (org_rollup / watched / operating_function); ordinary products\n  // stay clean (absent).\n  if (\n    doc.member_kind === 'org_rollup' ||\n    doc.member_kind === 'watched' ||\n    doc.member_kind === 'operating_function'\n  ) {\n    header.member_kind = doc.member_kind\n  }\n  header.provenance = buildProvenance(doc, opts)\n  header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) }\n\n  return JSON.stringify({ $upg: header, ...body }, null, 2) + '\\n'\n}\n\n/** Portfolio canonical form: the `$upg` header envelope (kind: \"portfolio\"). */\nfunction serializePortfolioWithHeader(doc: UPGPortfolioDocument, opts: SerializeOptions): string {\n  const body = portfolioBody(doc)\n  const org = doc.organization\n  const header: Record<string, unknown> = {\n    format_version: UPG_CANONICAL_FORMAT_VERSION,\n    spec_version: doc.upg_version,\n    kind: 'portfolio',\n    organization: orderedObject(\n      { id: org.id, title: org.title },\n      ['id', 'title'],\n      { forceKeys: ['id', 'title'] },\n    ),\n  }\n  const summary = deriveSummary(org.description)\n  if (summary) header.summary = summary\n  // See derivePortfolioCounts for the member-kind rules behind `counts.products`.\n  header.counts = derivePortfolioCounts(doc)\n  header.provenance = buildProvenance(doc, opts)\n  header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) }\n\n  return JSON.stringify({ $upg: header, ...body }, null, 2) + '\\n'\n}\n\n/**\n * Parse a `.upg` file's text into the in-memory `UPGDocument` /\n * `UPGPortfolioDocument` (flat) shape, accepting BOTH the canonical `$upg`\n * envelope and the legacy flat envelope. Drift (A.6) is repaired on the way in,\n * so a parse → serialise round-trip is clean. This is the one read path.\n */\nexport function parseUpg(text: string): UPGDocument | UPGPortfolioDocument {\n  return normalizeDocument(JSON.parse(text))\n}\n\n/**\n * Normalise an already-parsed object (canonical `$upg` envelope OR legacy flat)\n * into the flat in-memory document shape, repairing drift.\n */\nexport function normalizeDocument(obj: unknown): UPGDocument | UPGPortfolioDocument {\n  const raw = obj as Record<string, unknown>\n  const header = raw.$upg as UPGHeader | undefined\n\n  // Resolve the metadata regardless of envelope.\n  const upg_version = (header?.spec_version ?? raw.upg_version) as string\n  const provenance = header?.provenance\n  const exported_at = (provenance?.exported_at ?? raw.exported_at) as string | undefined\n  const source = provenance\n    ? { tool: provenance.tool, tool_version: provenance.tool_version, workspace_id: provenance.workspace_id }\n    : (raw.source as UPGDocument['source'])\n  // For canonical ($upg) files, integrity lives in `$upg.integrity.body` and is\n  // recomputed on every serialise, we deliberately do NOT reconstruct the\n  // legacy `_integrity` field here (its checksum uses a different algorithm; a\n  // mismatch would falsely flag the file as tampered). Legacy flat files keep\n  // their `_integrity` untouched so the existing tamper-detection path is intact.\n  const _integrity = header ? undefined : (raw._integrity as UPGDocument['_integrity'])\n\n  const isPortfolioDoc = raw.type === 'portfolio' || header?.kind === 'portfolio' || 'cross_edges' in raw\n\n  if (isPortfolioDoc) {\n    const out: UPGPortfolioDocument = {\n      upg_version,\n      type: 'portfolio',\n      exported_at: exported_at ?? '',\n      source: (source as UPGPortfolioDocument['source']) ?? { tool: 'unknown' },\n      organization: raw.organization as UPGPortfolioDocument['organization'],\n      product_areas: (raw.product_areas as UPGPortfolioDocument['product_areas']) ?? [],\n      portfolios: (raw.portfolios as UPGPortfolioDocument['portfolios']) ?? [],\n      products: ((raw.products as UPGPortfolioDocument['products']) ?? []).map((p) => ({\n        ...p,\n        nodes: (p.nodes ?? []).map((n) => repairNodeDrift(n)),\n        edges: p.edges ?? [],\n      })),\n      cross_edges: (raw.cross_edges as UPGPortfolioDocument['cross_edges']) ?? [],\n    }\n    // Registry tier: read back when present, repairing node drift on the\n    // canonical entities the same way product nodes are repaired. Absent on\n    // legacy portfolios — left undefined so the field stays optional.\n    const rawRegistry = raw.registry as\n      | { nodes?: UPGBaseNode[]; edges?: UPGEdge[] }\n      | undefined\n    if (rawRegistry && Array.isArray(rawRegistry.nodes)) {\n      out.registry = {\n        nodes: rawRegistry.nodes.map((n) => repairNodeDrift(n)),\n        ...(Array.isArray(rawRegistry.edges) ? { edges: rawRegistry.edges } : {}),\n      }\n    }\n    // Append-only classification-history stream (0.11.0). Read back when\n    // present; absent on portfolios that have never recorded a move, so the\n    // field stays optional.\n    const rawSignals = raw.signals as UPGBaseNode[] | undefined\n    if (Array.isArray(rawSignals) && rawSignals.length > 0) {\n      out.signals = rawSignals.map((n) => repairNodeDrift(n))\n    }\n    return out\n  }\n\n  const out: UPGDocument = {\n    upg_version,\n    exported_at: exported_at ?? '',\n    source: (source as UPGDocument['source']) ?? { tool: 'unknown' },\n    product: raw.product as UPGDocument['product'],\n    nodes: ((raw.nodes as UPGBaseNode[]) ?? []).map((n) => repairNodeDrift(n)),\n    edges: (raw.edges as UPGEdge[]) ?? [],\n  }\n  // Lift $upg.member_kind back into the in-memory doc (0.10.0, #45). Legacy flat\n  // files may carry a top-level member_kind; read either.\n  const memberKind = (header?.member_kind ?? raw.member_kind) as UPGDocument['member_kind'] | undefined\n  if (memberKind === 'org_rollup' || memberKind === 'watched' || memberKind === 'operating_function') {\n    out.member_kind = memberKind\n  }\n  if (_integrity) out._integrity = _integrity\n  return out\n}\n\n/**\n * The `upg fmt` operation on raw text: parse (either envelope) → re-serialise\n * canonical. Idempotent: `formatUpgText(formatUpgText(x)) === formatUpgText(x)`.\n */\nexport function formatUpgText(text: string, opts: SerializeOptions = {}): string {\n  return serializeCanonical(parseUpg(text), opts)\n}\n\n/** True iff `text` is already in canonical form (used by `upg fmt --check`). */\nexport function isCanonical(text: string): boolean {\n  // Preserve the existing provenance so the check does not flag a benign\n  // timestamp/source difference as non-canonical.\n  const parsed = parseUpg(text)\n  return text === serializeCanonical(parsed)\n}\n\n// ─── Header seal verification ───────────────────────────────────────────────\n//\n// `$upg.counts` and `$upg.integrity` are DERIVED: the serialiser computes both\n// from the body it is about to write. Until now nothing read them back, so a\n// file whose header and body had fallen out of step looked perfectly healthy to\n// every reader — `normalizeDocument` drops both fields on the way in, and the\n// in-memory document therefore has no memory of what the file CLAIMED.\n//\n// That gap is reachable without malice. Two branches each append one node to the\n// same graph; git merges the body cleanly (different array positions) but sees\n// `\"nodes\": 1273 → 1274` on both sides as the SAME one-line change and takes it\n// once. The merged file declares 1274 and holds 1275, with no conflict marker\n// anywhere. `upg fmt --check` catches it (byte-canonicality implies a fresh\n// header) but any reader that goes straight to the body does not.\n//\n// `checkHeaderSeal` closes that: it compares a file's header against that same\n// file's body. It is a self-consistency check on the ARTIFACT, so it needs no\n// session state and makes no claim about anyone's in-memory edits.\n\n/** One `$upg.counts` field whose declared value disagrees with the body. */\nexport interface UPGHeaderCountsMismatch {\n  /** The counts key, e.g. `nodes`, `edges`, `products`, `cross_edges`. */\n  field: string\n  /** What `$upg.counts` claims (0 when the key is absent from the header). */\n  declared: number\n  /** What the body actually holds (0 when the key is not derived for this doc). */\n  actual: number\n}\n\n/** The `$upg.integrity.body` seal disagreeing with a recomputation over the body. */\nexport interface UPGHeaderIntegrityMismatch {\n  /** The algorithm label the header declares, e.g. `sha256-128`. */\n  algorithm: string\n  /** The checksum recorded in `$upg.integrity.body`. */\n  declared: string\n  /** The checksum recomputed from the body as it stands. */\n  computed: string\n}\n\n/** Verdict of `checkHeaderSeal`: is a `.upg` file's header true to its own body? */\nexport interface UPGHeaderSealReport {\n  /**\n   * False for a legacy flat file with no `$upg` block. Nothing was declared, so\n   * nothing can be stale: both drift arrays are empty and both `*_checked`\n   * flags are false. Never treat a headerless file as drifted.\n   */\n  header_present: boolean\n  /** True when `$upg.counts` was compared against the body. */\n  counts_checked: boolean\n  /** True when `$upg.integrity.body` was recomputed and compared. */\n  integrity_checked: boolean\n  /**\n   * Why a check was skipped despite a header being present — an unrecognised\n   * `format_version` (the body layout the seal was computed over may differ from\n   * this serialiser's), an unrecognised `integrity.algorithm`, or a missing\n   * block. Absent when everything applicable was checked.\n   */\n  skipped_reason?: string\n  /** Per-field counts disagreements. Empty when the counts are true. */\n  counts_drift: UPGHeaderCountsMismatch[]\n  /** At most one entry: the body seal is either intact or it is not. */\n  integrity_drift: UPGHeaderIntegrityMismatch[]\n}\n\n/**\n * Compare a parsed `.upg` object's `$upg` header against its own body.\n *\n * Both checks are gated on `format_version` matching this serialiser's\n * {@link UPG_CANONICAL_FORMAT_VERSION}: the counts keys and the canonical body\n * layout are contracts OF a format version, so a file written under a different\n * one must not be judged by this one's rules. A future format bump therefore\n * degrades to \"not checked\" rather than to a wall of false positives.\n *\n * Pure and read-only — it neither repairs the document nor touches the file.\n * `upg fmt` is the repair: it recomputes both fields from the body it writes.\n *\n * @param obj An already-parsed `.upg` document (canonical `$upg` envelope or\n *   legacy flat). Pass the RAW parse, not a normalised document — normalisation\n *   is what discards the header this function exists to read.\n */\nexport function checkHeaderSeal(obj: unknown): UPGHeaderSealReport {\n  const raw = obj as Record<string, unknown>\n  const header = raw?.$upg as UPGHeader | undefined\n\n  const report: UPGHeaderSealReport = {\n    header_present: !!header,\n    counts_checked: false,\n    integrity_checked: false,\n    counts_drift: [],\n    integrity_drift: [],\n  }\n  if (!header) return report\n\n  if (header.format_version !== UPG_CANONICAL_FORMAT_VERSION) {\n    report.skipped_reason =\n      `format_version \"${header.format_version}\" is not this serialiser's ` +\n      `\"${UPG_CANONICAL_FORMAT_VERSION}\"; counts keys and body layout are ` +\n      `format-version contracts, so neither seal can be judged here.`\n    return report\n  }\n\n  // Normalise once: the derivations and the checksum both operate on the\n  // in-memory document shape, exactly as the serialiser did when it stamped\n  // the header. parse → normalise → derive reproduces the write-time inputs.\n  const doc = normalizeDocument(raw)\n\n  // ── counts ────────────────────────────────────────────────────────────────\n  const declaredCounts = (header.counts ?? {}) as Record<string, unknown>\n  const actualCounts = deriveCounts(doc)\n  if (header.counts === undefined) {\n    report.skipped_reason = 'header has no `counts` block to compare.'\n  } else {\n    report.counts_checked = true\n    // Union of both key sets: a header key we no longer derive is stale in one\n    // direction (e.g. `watched_products: 1` left behind after the last watched\n    // member was removed — the serialiser omits that key at zero), and a\n    // derived key the header never mentions is stale in the other.\n    const fields = new Set([...Object.keys(declaredCounts), ...Object.keys(actualCounts)])\n    for (const field of [...fields].sort()) {\n      const declaredRaw = declaredCounts[field]\n      const declared = typeof declaredRaw === 'number' ? declaredRaw : 0\n      const actual = actualCounts[field] ?? 0\n      if (declared !== actual) report.counts_drift.push({ field, declared, actual })\n    }\n  }\n\n  // ── integrity ─────────────────────────────────────────────────────────────\n  const integrity = header.integrity\n  if (!integrity || typeof integrity.body !== 'string') {\n    report.skipped_reason = report.skipped_reason ?? 'header has no `integrity.body` seal to compare.'\n  } else if (integrity.algorithm !== INTEGRITY_ALGORITHM) {\n    // A different algorithm is not drift — we simply cannot recompute it. Say so\n    // rather than reporting a guaranteed-mismatching digest as tampering.\n    report.skipped_reason =\n      report.skipped_reason ??\n      `integrity.algorithm \"${integrity.algorithm}\" is not \"${INTEGRITY_ALGORITHM}\"; ` +\n        `the declared digest cannot be recomputed here.`\n  } else {\n    report.integrity_checked = true\n    const computed = computeBodyChecksum(doc)\n    if (computed !== integrity.body) {\n      report.integrity_drift.push({\n        algorithm: integrity.algorithm,\n        declared: integrity.body,\n        computed,\n      })\n    }\n  }\n\n  return report\n}\n\n/**\n * Text-level form of {@link checkHeaderSeal}: strips a leading UTF-8 BOM, parses,\n * and checks. The BOM strip mirrors the load path — editors that prepend one\n * would otherwise make `JSON.parse` throw on a file that is otherwise valid.\n *\n * @throws SyntaxError when `text` is not valid JSON.\n */\nexport function checkHeaderSealText(text: string): UPGHeaderSealReport {\n  const noBom = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text\n  return checkHeaderSeal(JSON.parse(noBom))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX,2BAA2B;AAAA,MAC3B,0BAA0B;AAAA,IAC5B;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,IACd,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,yBAAyB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;A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MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX,2BAA2B;AAAA,MAC3B,0BAA0B;AAAA,IAC5B;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,IACd,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,yBAAyB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AA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ACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,Q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","names":["req","req","slotAliases","out"]}