let d = import "core.ncl" in

{
  lift_out_practice = d.make_node {
    id          = "lift-out-practice",
    name        = "Component Lift-Out",
    pole        = 'Yang,
    level       = 'Practice,
    description = "A component developed inside a host project is extracted as an independent peer project when it passes the four-criterion test: orthogonal concern, plurality of consumers, divergent release cadence, and path-agnostic config. The extracted project registers in ontoref before any code moves.",
    adrs        = ["adr-016-component-lift-out-pattern"],
  },

  lift_readiness_practice = d.make_node {
    id          = "lift-readiness",
    name        = "Lift Readiness Evaluation",
    pole        = 'Spiral,
    level       = 'Practice,
    description = "Before extracting a component, four criteria are evaluated: (1) orthogonal concern — the component's domain is not the host's domain; (2) consumer plurality — at least two distinct callers exist or are imminent; (3) release cadence divergence — the component's lifecycle does not match the host's; (4) config path-agnostic — the component can receive its config from any caller without importing host infrastructure.",
    adrs        = ["adr-016-component-lift-out-pattern"],
  },

  premature_decomposition_tension = d.make_node {
    id          = "premature-decomposition",
    name        = "Premature Decomposition Tension",
    pole        = 'Yin,
    level       = 'Tension,
    description = "Extracting a component before it has proven orthogonality and multiple consumers creates coordination overhead without autonomy benefits. The four-criterion gate is the safeguard.",
  },

  host_coupling_tension = d.make_node {
    id          = "host-coupling",
    name        = "Host Coupling Tension",
    pole        = 'Yin,
    level       = 'Tension,
    description = "A component that imports host-project infrastructure (config loaders, schema registries, workspace crates) cannot be an independent peer. Host coupling is the primary blocker for lift-out and must be severed at extraction time.",
  },

  edges = [
    d.make_edge {
      from   = "lift-readiness",
      to     = "lift-out-practice",
      kind   = 'FlowsTo,
      note   = "readiness evaluation gates the extraction decision",
    },
    d.make_edge {
      from   = "premature-decomposition",
      to     = "lift-out-practice",
      kind   = 'TensionWith,
      note   = "extracting too early defeats the purpose",
    },
    d.make_edge {
      from   = "host-coupling",
      to     = "lift-readiness",
      kind   = 'LimitedBy,
      note   = "coupling to host infrastructure fails criterion 4",
    },
  ],
}
