Found while diagnosing H2 parity on x86 (#836 follow-up). The legacy frs_spine root transform yields person.age as int64; uk_runtime/graph.py declares the CREATE cell as float64, so every graph stage sees a float age from node 0 while the legacy StagePlan sees an integer until age_tail disaggregates. Parity holds because the transforms cast, and #842 closes the downstream consequences at the stages that care (frs_education casts its output explicitly), but the declaration should match what the root produces, with age_tail owning the dtype change it makes.
Proposed: declare person.age as int64 on create_uk_frs, and have age_tail (which rewrites age) declare its output dtype explicitly. Then the fixture regenerates (tools/graph_uk_spine_fixture.py) and H2 stays byte-exact.
Left for the UK spine lane rather than changed underneath #835/#842/#844, which all touch uk_runtime/graph.py.
🤖 Generated with Claude Code
Found while diagnosing H2 parity on x86 (#836 follow-up). The legacy
frs_spineroot transform yieldsperson.ageasint64;uk_runtime/graph.pydeclares the CREATE cell asfloat64, so every graph stage sees a float age from node 0 while the legacy StagePlan sees an integer untilage_taildisaggregates. Parity holds because the transforms cast, and #842 closes the downstream consequences at the stages that care (frs_educationcasts its output explicitly), but the declaration should match what the root produces, withage_tailowning the dtype change it makes.Proposed: declare
person.ageasint64oncreate_uk_frs, and haveage_tail(which rewritesage) declare its output dtype explicitly. Then the fixture regenerates (tools/graph_uk_spine_fixture.py) and H2 stays byte-exact.Left for the UK spine lane rather than changed underneath #835/#842/#844, which all touch
uk_runtime/graph.py.🤖 Generated with Claude Code