Follow-up to #66 and #499. Comparing the pinned current spawn/stdio.rs with Home exposes a missing ArrayBuffer-copy step: Rust copies the selected byte slice into a runtime-owned buffer before retaining it, while Home retains the caller's original ArrayBuffer/view in ArrayBuffer.Strong.
A native probe on published a21f735fc passes a 2 MiB Uint8Array filled with byte 65 as stdin, immediately fills the caller's view with byte 66, and has the child read stdin after 50 ms. The child receives all 2,097,152 bytes changed to 66. The native call returned successfully, but the queued input no longer reflects the bytes passed at spawn. Holding the JS wrapper also does not prevent the caller from transferring/detaching its underlying buffer.
Port the selected source's owned copy (including view offsets/lengths) and verify unchanged content after immediate mutation or transfer/detachment. Cover ArrayBuffer, typed/DataView slices and Node Buffer views without replacing the native process/writer path. Retain the unchanged upstream input-stream and spawn suites. Source pin: 4982b91e3702094330f3be3883354c52b8c01323.
This is separate from extra-stdio validation/rejected Blob cleanup (#499) and FilePoll deregistration (#501). Do not infer memory safety merely from keeping a Strong reference to a detachable ArrayBuffer.