# IR Status and Decoupling Notes This is a scratch note about the current Geolog IR design. ## Short answer The IR does not look badly designed, but it does look weakly decoupled. That means: - as a prototype lowering target, it looks reasonable - as a long-term architecture boundary, it looks too entangled ## Why it does not look bad The current IR already does useful work: - it lowers elaborated Geolog theories into a concrete form - it makes tables and laws explicit - it captures important constraints like `foreignKeys` and `total` - it gives the project a real intermediate form to build on So this does not look like a failed design. It looks like an early design that already has a clear purpose. ## Why it looks weakly decoupled The current IR already commits to one specific execution story: a relational one. That shows up in a few ways: - the core data structures are already database-shaped: `Table`, `primaryKey`, `Atom`, `Law` - lowering generates synthetic laws like `foreignKeys` and `total` - those laws are named through path conventions rather than through a more explicit semantic kind - some lowering behavior depends on already-built table state - schema, constraints, and part of the execution model are all mixed together in one layer None of these choices are necessarily wrong. But together they make the IR less clean as a neutral interface. ## Practical interpretation The current IR is best understood as: - a good first lowering target - a relationalized theory representation - not yet a stable, backend-neutral execution contract In particular, it still seems to be missing the runtime pieces that a full Geolog engine would need: - chase state - fresh witness generation - branch tracking - equality merging - provenance - scheduling metadata ## Main architectural concern Right now, the IR seems to combine too many concerns in one place: 1. lowered theory structure 2. relational schema shape 3. logical constraints 4. hints of runtime semantics That makes it harder to swap backends or introduce a cleaner runtime layer later. ## Likely direction A better factored design would probably split the current role into two layers. ### 1. Lowered theory IR This layer would describe: - declarations - dependencies - logical constraints - enough type information to preserve meaning It should stay as backend-neutral as possible. ### 2. Runtime or backend IR This layer would describe: - query plans - execution strategy - chase state - branch identity - witness allocation - equality classes - provenance and scheduling That would let the current IR remain useful without forcing it to carry every concern. ## Bottom line The current IR is not badly designed for an early-stage compiler pipeline. But if the project wants a strong separation between: - source semantics - lowered theory - runtime execution - backend-specific storage and planning then the current IR is too tightly coupled to be the final architecture boundary.