Split
Growth-time routing predicate over a feature Row. The tree engine (RegressionTree) only ever calls direction to route an observation to a child, so any feature representation can drive growth by supplying its own Splits — for example a downstream library's typed, constraint-coupled splits over a non-vector row.
The interface is intentionally open and non-serializable: it is the in-memory SPI for growing trees over arbitrary features. Wire-portable splits over a dense VectorView context live under the SerializableSplit hierarchy, which the serializable tree snapshots (TreeNodeResult) embed.