Objective
Goal 3's [3-1] through [3-4] were built against provisional placeholder types (AstNode, EmlNode, generic vocab sets) while [1-2]/[2-1] weren't merged yet. Those real contracts now exist on goal2 (src/geml/contracts/ast.py's ASTNode/ASTEdge, src/geml/eml/ir.py's One/Variable/EML). This issue swaps the placeholders for the real thing.
Owned paths (adjust to actual file locations once confirmed)
src/geml/graph/validate.py — AST_VOCAB/EML_VOCAB placeholders
src/geml/dag/ast.py — AstNode → real ASTNode/ASTEdge
src/geml/dag/eml.py — EmlNode → real One/Variable/EML
src/geml/dag/direct_eml.py — add emit_add/emit_multiply/emit_divide/emit_power using the real formulas in compiler_core.py/compiler_arithmetic.py (currently only emit_exp/emit_ln exist)
src/geml/interfaces/eml_dag_cost.py — update in lockstep, since it depends on dag/eml.py
Tasks
Replace AstNode/EmlNode placeholder dataclasses with the real Pydantic contracts
Replace the placeholder AST_VOCAB/EML_VOCAB sets with whatever the real contracts expose
Add direct/memoized constructors for add, multiply, divide, power (formulas already verified real, from compiler_core.py/compiler_arithmetic.py)
Re-run all of [3-1]–[3-8]'s existing test suites to confirm nothing regresses
Acceptance criteria
All existing Goal 3 tests still pass against the real contracts
No provisional/placeholder types remain in any Goal 3 module
New add/multiply/divide/power audit cases pass in [3-5]'s equivalence audit
Objective
Goal 3's [3-1] through [3-4] were built against provisional placeholder types (AstNode, EmlNode, generic vocab sets) while [1-2]/[2-1] weren't merged yet. Those real contracts now exist on goal2 (src/geml/contracts/ast.py's ASTNode/ASTEdge, src/geml/eml/ir.py's One/Variable/EML). This issue swaps the placeholders for the real thing.
Owned paths (adjust to actual file locations once confirmed)
src/geml/graph/validate.py — AST_VOCAB/EML_VOCAB placeholders
src/geml/dag/ast.py — AstNode → real ASTNode/ASTEdge
src/geml/dag/eml.py — EmlNode → real One/Variable/EML
src/geml/dag/direct_eml.py — add emit_add/emit_multiply/emit_divide/emit_power using the real formulas in compiler_core.py/compiler_arithmetic.py (currently only emit_exp/emit_ln exist)
src/geml/interfaces/eml_dag_cost.py — update in lockstep, since it depends on dag/eml.py
Tasks
Replace AstNode/EmlNode placeholder dataclasses with the real Pydantic contracts
Replace the placeholder AST_VOCAB/EML_VOCAB sets with whatever the real contracts expose
Add direct/memoized constructors for add, multiply, divide, power (formulas already verified real, from compiler_core.py/compiler_arithmetic.py)
Re-run all of [3-1]–[3-8]'s existing test suites to confirm nothing regresses
Acceptance criteria
All existing Goal 3 tests still pass against the real contracts
No provisional/placeholder types remain in any Goal 3 module
New add/multiply/divide/power audit cases pass in [3-5]'s equivalence audit