# ============================================================================= # Projet : AIR — Accounting Intermediate Representation # Auteur : Simon-Pierre Boucher # Contact : contact@spboucher.ai # Fichier : compiler.py # Description : Top-level AIC entry point — AIR document + ALSL policies -> CompiledJournal. # ============================================================================= """compile_document(): the deterministic core of AIR. Same AIR document + same policy set => byte-identical journal, always. No LLM, no network, no clock inside this function. """ from __future__ import annotations from aic.diagnostics import Diagnostic from aic.pass_manager import PassManager from aic.passes.classification import ClassificationPass from aic.passes.fx import FxPass from aic.passes.posting import PostingPass from aic.passes.tax import TaxPass from aic.passes.validation import ValidationPass from aic.unit import CompilationUnit from alsl.model import PolicySet from core.events import AirDocument from core.journal import CompiledJournal DEFAULT_PIPELINE = [ ValidationPass(), ClassificationPass(), TaxPass(), FxPass(), PostingPass(), ] def _optimized_pipeline() -> list: from aic.passes.optimize import ( DuplicateDetectionPass, FusionPass, NettingPass, ) return [ ValidationPass(), DuplicateDetectionPass(), ClassificationPass(), TaxPass(), FxPass(), PostingPass(), NettingPass(), FusionPass(), ] def compile_document( document: AirDocument, policies: PolicySet, pipeline: list | None = None, optimize: bool = False, ) -> tuple[CompiledJournal, list[Diagnostic]]: """Compile an AIR document into a journal. Raises CompilationError on errors. optimize=True adds the Phase 6 passes (duplicate detection, netting, fusion); the invariant is still verified after every pass. """ if pipeline is None: pipeline = _optimized_pipeline() if optimize else DEFAULT_PIPELINE unit = CompilationUnit(document=document, policies=policies) manager = PassManager(pipeline) manager.run(unit) journal = CompiledJournal( entries=list(unit.entries), provenance=unit.provenance, policy_set=policies.name, policy_version=policies.version, ) return journal, unit.diagnostics