[importlinter]
root_package = accountable_record

# ============================================================
# Directional contracts: the pipeline is a one-way spine.
# A stage may never import a later stage, and the orchestration
# layer (pipeline/) may never import any stage.
# ============================================================

[importlinter:contract:pipeline-does-not-import-stages]
name = Pipeline must not import stage packages
type = forbidden
source_modules =
    accountable_record.pipeline
forbidden_modules =
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-010-does-not-import-later-stages]
name = Stage 010 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_010_identity
forbidden_modules =
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-020-does-not-import-later-stages]
name = Stage 020 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_020_contract
forbidden_modules =
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-030-does-not-import-later-stages]
name = Stage 030 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_030_sources
forbidden_modules =
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-040-does-not-import-later-stages]
name = Stage 040 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_040_elements
forbidden_modules =
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-050-does-not-import-later-stages]
name = Stage 050 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_050_catalog
forbidden_modules =
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-060-does-not-import-later-stages]
name = Stage 060 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_060_exports
forbidden_modules =
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-070-does-not-import-later-stages]
name = Stage 070 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_070_resolution
forbidden_modules =
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-080-does-not-import-later-stages]
name = Stage 080 must not import later stages
type = forbidden
source_modules =
    accountable_record.stage_080_reports
forbidden_modules =
    accountable_record.stage_090_verify

# ============================================================
# Vocabulary-vs-behavior contracts: each stage's base/ namespace
# is its durable, shareable vocabulary (constants, diagnostics,
# model, scalars). Stage behavior modules (everything outside base/)
# may NOT reach sideways into another stage's behavior modules.
# Cross-stage coupling, where it is allowed at all, happens only
# through base/ vocabulary or through an explicit transition module.
# ============================================================

[importlinter:contract:stage-010-behavior-isolated]
name = Stage 010 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
forbidden_modules =
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify
ignore_imports =
    accountable_record.stage_010_identity.* -> accountable_record.stage_010_identity.base.*

[importlinter:contract:stage-020-behavior-isolated]
name = Stage 020 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-030-behavior-isolated]
name = Stage 030 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-040-behavior-isolated]
name = Stage 040 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-050-behavior-isolated]
name = Stage 050 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_050_catalog.build
    accountable_record.stage_050_catalog.export
    accountable_record.stage_050_catalog.index
    accountable_record.stage_050_catalog.transform
    accountable_record.stage_050_catalog.validation
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-060-behavior-isolated]
name = Stage 060 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_060_exports.index
    accountable_record.stage_060_exports.plan
    accountable_record.stage_060_exports.transform
    accountable_record.stage_060_exports.validation
    accountable_record.stage_060_exports.write
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
    accountable_record.stage_050_catalog.build
    accountable_record.stage_050_catalog.export
    accountable_record.stage_050_catalog.index
    accountable_record.stage_050_catalog.transform
    accountable_record.stage_050_catalog.validation
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-070-behavior-isolated]
name = Stage 070 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_070_resolution.graph
    accountable_record.stage_070_resolution.lock
    accountable_record.stage_070_resolution.lock_builder
    accountable_record.stage_070_resolution.resolve
    accountable_record.stage_070_resolution.transform
    accountable_record.stage_070_resolution.validation
    accountable_record.stage_070_resolution.verify
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
    accountable_record.stage_050_catalog.build
    accountable_record.stage_050_catalog.export
    accountable_record.stage_050_catalog.index
    accountable_record.stage_050_catalog.transform
    accountable_record.stage_050_catalog.validation
    accountable_record.stage_060_exports.index
    accountable_record.stage_060_exports.plan
    accountable_record.stage_060_exports.transform
    accountable_record.stage_060_exports.validation
    accountable_record.stage_060_exports.write
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:stage-080-behavior-isolated]
name = Stage 080 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_080_reports.collect
    accountable_record.stage_080_reports.compare
    accountable_record.stage_080_reports.index
    accountable_record.stage_080_reports.plan
    accountable_record.stage_080_reports.render
    accountable_record.stage_080_reports.transform
    accountable_record.stage_080_reports.validation
    accountable_record.stage_080_reports.ops
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
    accountable_record.stage_050_catalog.build
    accountable_record.stage_050_catalog.export
    accountable_record.stage_050_catalog.index
    accountable_record.stage_050_catalog.transform
    accountable_record.stage_050_catalog.validation
    accountable_record.stage_060_exports.index
    accountable_record.stage_060_exports.plan
    accountable_record.stage_060_exports.transform
    accountable_record.stage_060_exports.validation
    accountable_record.stage_060_exports.write
    accountable_record.stage_090_verify

[importlinter:contract:stage-090-behavior-isolated]
name = Stage 090 behavior must not import other stages' behavior modules
type = forbidden
source_modules =
    accountable_record.stage_090_verify.transform
    accountable_record.stage_090_verify.validation
forbidden_modules =
    accountable_record.stage_010_identity.citation
    accountable_record.stage_010_identity.manifest
    accountable_record.stage_010_identity.repository
    accountable_record.stage_010_identity.transform
    accountable_record.stage_010_identity.validation
    accountable_record.stage_010_identity.versioning
    accountable_record.stage_020_contract.adapt
    accountable_record.stage_020_contract.check
    accountable_record.stage_020_contract.context
    accountable_record.stage_020_contract.load
    accountable_record.stage_020_contract.transform
    accountable_record.stage_020_contract.validation
    accountable_record.stage_020_contract.version_authority
    accountable_record.stage_030_sources.discover
    accountable_record.stage_030_sources.load
    accountable_record.stage_030_sources.registry
    accountable_record.stage_030_sources.transform
    accountable_record.stage_030_sources.validation
    accountable_record.stage_040_elements.discover
    accountable_record.stage_040_elements.load
    accountable_record.stage_040_elements.registry
    accountable_record.stage_040_elements.transform
    accountable_record.stage_040_elements.validation
    accountable_record.stage_050_catalog.build
    accountable_record.stage_050_catalog.export
    accountable_record.stage_050_catalog.index
    accountable_record.stage_050_catalog.transform
    accountable_record.stage_050_catalog.validation
    accountable_record.stage_060_exports.index
    accountable_record.stage_060_exports.plan
    accountable_record.stage_060_exports.transform
    accountable_record.stage_060_exports.validation
    accountable_record.stage_060_exports.write
    accountable_record.stage_070_resolution.graph
    accountable_record.stage_070_resolution.lock
    accountable_record.stage_070_resolution.lock_builder
    accountable_record.stage_070_resolution.resolve
    accountable_record.stage_070_resolution.transform
    accountable_record.stage_070_resolution.validation
    accountable_record.stage_070_resolution.verify

# ============================================================
# Transition contracts: cross-stage producers live ONLY in
# transitions/, and only the command layer may invoke them.
# Stages and the pipeline runner must not import transitions.
# ============================================================

[importlinter:contract:stages-do-not-import-transitions]
name = Stages must not import transition modules
type = forbidden
source_modules =
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify
forbidden_modules =
    accountable_record.transitions

[importlinter:contract:pipeline-does-not-import-transitions]
name = Pipeline orchestration must not import transition modules
type = forbidden
source_modules =
    accountable_record.pipeline
forbidden_modules =
    accountable_record.transitions

[importlinter:contract:transitions-import-only-base]
name = Transitions may import stage base vocabulary, not stage behavior
type = forbidden
source_modules =
    accountable_record.transitions
forbidden_modules =
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify
ignore_imports =
    accountable_record.transitions.** -> accountable_record.stage_060_exports.base.**
    accountable_record.transitions.** -> accountable_record.stage_070_resolution.base.**

# ============================================================
# Leaf contracts: foundational modules depend on nothing internal
# (except the errors leaf, which boundary/ is permitted to use for
# typed failures). These guarantees keep the substrate portable.
# ============================================================

[importlinter:contract:errors-is-a-leaf]
name = errors must not import any internal package
type = forbidden
source_modules =
    accountable_record.errors
forbidden_modules =
    accountable_record.boundary
    accountable_record.utils
    accountable_record.pipeline
    accountable_record.commands
    accountable_record.transitions
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:boundary-is-a-leaf]
name = boundary may import only errors, nothing higher
type = forbidden
source_modules =
    accountable_record.boundary
forbidden_modules =
    accountable_record.utils
    accountable_record.pipeline
    accountable_record.commands
    accountable_record.transitions
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:utils-is-a-leaf]
name = utils must not import any internal package
type = forbidden
source_modules =
    accountable_record.utils
forbidden_modules =
    accountable_record.boundary
    accountable_record.errors
    accountable_record.pipeline
    accountable_record.commands
    accountable_record.transitions
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify

[importlinter:contract:pipeline-base-is-vocabulary]
name = pipeline base vocabulary must not import pipeline behavior
type = forbidden
source_modules =
    accountable_record.pipeline.base
forbidden_modules =
    accountable_record.pipeline.runner
    accountable_record.pipeline.stages
    accountable_record.pipeline.context
    accountable_record.pipeline.diagnostic_mapping
    accountable_record.pipeline.manifest_schema
    accountable_record.pipeline.repository_profile
    accountable_record.pipeline.type_checks

[importlinter:contract:pipeline-ops-over-base-only]
name = Pipeline ops may use base and boundary, not wiring or stages
type = forbidden
source_modules =
    accountable_record.pipeline.ops
forbidden_modules =
    accountable_record.pipeline.runner
    accountable_record.pipeline.stages
    accountable_record.pipeline.context
    accountable_record.transitions
    accountable_record.stage_010_identity
    accountable_record.stage_020_contract
    accountable_record.stage_030_sources
    accountable_record.stage_040_elements
    accountable_record.stage_050_catalog
    accountable_record.stage_060_exports
    accountable_record.stage_070_resolution
    accountable_record.stage_080_reports
    accountable_record.stage_090_verify
