ID

R432

Status

Backlog

Bucket

structural

Priority

4

Theme

classification-model

Blocked by

decompose-sourcekey

Created

2026-07-04

Updated

2026-07-04

Collapse SplitTableField and RecordTableField into one source-gated leaf

The R333 beachhead: collapse ChildField.SplitTableField and ChildField.RecordTableField into one leaf gated on the source fact. Thread A measured the two component-identical (11 shared components, both TableTargetField + BatchKeyField; only emitsSingleRecordPerKey() and sourceShape() differ), and both child sides already lower to the same load<X> rows-method and fetcher; Split’s only extra, the parent-key projection, already lands via collectRequiredProjectionColumns in the parent type’s $fields. Collapsing with zero residue retires one cross-product axis with no generator rewrite and produces the lowering’s first executable proof (R333 "First slice").

The re-query unification fork this depended on was settled 2026-07-04 (R333 open questions): full merge, laundered key. The keyed re-query is one primitive f(keys, correlation); the source endpoint contributes only how the key tuple is lifted (a locator read gated on the held object’s shape), never visible to the query unit; correlation is the FK column pairs for split and PK self-identity for re-fetch (the degenerate case R333 already names). So the outcome is one leaf whose record-sourced arm is the reentry case, not two leaves sharing machinery.

Scope notes for Spec pickup: the lookup twin (SplitLookupTableField / RecordLookupTableField) mirrors the same merge; decide at Spec whether it rides along or follows as its own slice. This merge adds the parent-projection containment check: a validate-time (or pipeline-tier) assertion that, for a coordinate whose key tuple is lifted off the parent’s held object, each key column appears in the enclosing anchor’s projection set (collectRequiredProjectionColumns); R425 is the bug you get without it. This is a facts-level referential-integrity check, distinct from the level-1 closure oracle (which checks method-name resolution only) ; naming the invariant without the check would be exactly the false-invariant family the design principles warn about. Acceptance is execution-tier equivalence (same rows, same order) plus the @classified corpus classifying unchanged; byte-for-byte generated-output equality is explicitly not required. Sequenced after R431 (decompose-sourcekey); feeds R314.