[tool:pytest] asyncio_mode = auto testpaths = tests pythonpath = . [ruff] target-version = py314 line-length = 100 src = src,tests [ruff.lint] select = E,F,I,N,W,UP [importlinter] root_package = src [importlinter:contract:1] name = Integrations cannot import domain type = forbidden source_modules = src.integrations forbidden_modules = src.domain [importlinter:contract:2] name = Capability layer cannot import hosting-provider-specific code type = forbidden source_modules = src.domain.capabilities src.domain.project_auth src.domain.forms src.domain.feature_packs forbidden_modules = src.domain.hosting.adapters src.domain.hosting.runtime_projection src.domain.hosting.w4p_activation src.domain.hosting.w4p_workflow src.domain.hosting.routing_plane # FeaturePackProvisioner.reconcile() delegates to the pre-existing worker task # (legitimate -- CLAUDE.md: "heavy operations belong in workers"), which itself # transits through codegen/deployment orchestration many hops down. That deep chain # is worker/codegen plumbing, not the capabilities layer making a hosting decision -- # cut here so the contract checks what it's meant to: capabilities' own direct and # near imports, not every worker task they're allowed to invoke. ignore_imports = src.domain.capabilities.adapters -> src.workers.tasks.reconcile_project_capabilities