Immutable holdout extensions need parent-lineage validation

Observed 2026-09-08 in ender-inference at integration commit 3167717 (read-only source inspection plus synthetic rows): recomputing a split manifest over an enlarged cohort is not an immutable extension. With the current earlier-partition-wins duplicate rule, adding an earlier train-period exact duplicate can quarantine a previously frozen test row and admit the new row to train. A reusable safe pattern is a separate extension receipt: validate the parent manifest, never rewrite parent assignments, run legacy splitting only for new rows, then overlay a union-find across parent+new using typed call, opaque identity, and exact-input edges. Quarantine whole new components that touch frozen heldout/quarantine or bridge frozen splits; bind parent manifest/assignment digests and new candidate bindings; recompute the receipt on validation. This preserves generic splitter compatibility while making lineage and supplemental heldout membership explicit. Separately, model-facing tool contracts should be rooted in an external pin that requires exact ordered names plus a canonical digest of the full schemas; self-consistent per-row hashes are insufficient. No private data or run outputs were used.