The owner's live profile on the 30 s clip (17 -> 32 -> ~52 GB) is now
attributed by measurement (a per-stage RAM sampler outside the tree:
psutil RSS/commit + StageBar marks, 128-frame CPU fixture, x6.07):
- the paste stage's gradual per-tick growth is the round-18 output
buffer's lazy page commit (16 x 19.44 MB per 16-frame group) - the
contract floor being paid, not a leak;
- the first stage's +15 GB is the caller-owned input IMAGE materializing
into the working set as the detection loop reads it (dRSS +2.3 GB,
dCommit +0 B on the raw-input run) - not pack-owned;
- the static audit found no whole-clip float32 copy of the input in the
pack (the only advanced-indexing gather of the input is the
max_clip_length-bounded :1132).
Two pack-owned O(N) items remained and are removed:
- FIX 1: the mixed-case faces np.stack gather (~611 MB owner-scale) is
replaced by LazyFaceSource - the caller's face stack served per group
(a view when contiguous, a group-sized copy when scattered) through a
faces_provider seam mirroring frame_provider; the all-eligible
pass-through gate keeps handing the raw stack.
- FIX 2: the fallback tail converts per gray group (_flush_fallback_group,
the indexed write) - one group's stack + transient (<= 20 x 4.86 MB),
independent of the fallback count, instead of a whole-fallback stack
plus its ~10x conversion transient; the device-canvas and host tails
keep their whole-stack form.
Gate: 6 failed, 580 passed, 16 skipped, 7 deselected - the 6 are the
owner's own asset/example edits, unchanged; 11 new pins (byte identity,
no-copy censuses, the cross-group boundary, the one-whole-clip-buffer
count).