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", }, ], }