Deferred findings from the high-effort whole-branch review of #67 (v0.8.13). The default-path / red-test findings were fixed in that PR (commit 5dc2873); these five are in experimental Live mode or Viewer playback edge cases and are tracked here for v0.8.14.
Experimental Live mode (off by default)
frontend/src/routes/Generate.svelte:202 — selection jumps to the wrong identity on a tracking drop. If IOU tracking misses the selected face for a single frame, the guard reassigns selSlot to res.faces[0].slot and loadFaceEdit() overwrites the controls with another person's values; when the original reappears it never reverts, so edits silently apply to the wrong person. Fix: don't reassign selSlot on a transient miss (grace period / only drop after N consecutive misses).
frontend/src/routes/Generate.svelte:195 — liveEdits grows unbounded → request-header overflow. Stale slots are never pruned and the full map is JSON-serialized into the X-Face-Edits-Map header every frame. If the server hands out monotonically increasing slot ids, the header eventually exceeds the max size and live editing stops mid-session. Fix: prune slots no longer present (or cap the map); confirm the server reuses slot ids 0–3.
Viewer playback (edge cases)
frontend/src/lib/components/ViewerVideoStage.svelte:116 — micro-seek stutter when frame-times unavailable. The strict [frameStartTime, frameEndTime) interval test vs Math.round(t*fps) round/floor mismatch re-seeks every time playback crosses into the upper half of a frame interval, so normal playback visibly stutters on sessions without frame-times (e.g. analyze sessions). Fix: restore a tolerance (≈0.5/fps) in the fallback path.
frontend/src/routes/Viewer.svelte:301 — frame-times overlay misalignment on frame-count mismatch. The mapping assumes the k-th unique fex frame aligns to the k-th video packet PTS (arr[uniq[k]] = times[k]); a subsampled/variable-rate recording or video-without-matching-fex desyncs the overlay. Fix: map by actual frame index, not positional zip.
frontend/src/routes/Viewer.svelte:130 — fps source change desyncs overlay. Mapping now uses frames_written/duration_seconds instead of the stored metadata fps; when frame-times are unavailable and wall-clock duration ≠ content duration, the overlay maps to the wrong frame. Fix: prefer metadata fps, fall back to derived.
Deferred findings from the high-effort whole-branch review of #67 (v0.8.13). The default-path / red-test findings were fixed in that PR (commit
5dc2873); these five are in experimental Live mode or Viewer playback edge cases and are tracked here for v0.8.14.Experimental Live mode (off by default)
frontend/src/routes/Generate.svelte:202— selection jumps to the wrong identity on a tracking drop. If IOU tracking misses the selected face for a single frame, the guard reassignsselSlottores.faces[0].slotandloadFaceEdit()overwrites the controls with another person's values; when the original reappears it never reverts, so edits silently apply to the wrong person. Fix: don't reassignselSloton a transient miss (grace period / only drop after N consecutive misses).frontend/src/routes/Generate.svelte:195—liveEditsgrows unbounded → request-header overflow. Stale slots are never pruned and the full map is JSON-serialized into theX-Face-Edits-Mapheader every frame. If the server hands out monotonically increasing slot ids, the header eventually exceeds the max size and live editing stops mid-session. Fix: prune slots no longer present (or cap the map); confirm the server reuses slot ids 0–3.Viewer playback (edge cases)
frontend/src/lib/components/ViewerVideoStage.svelte:116— micro-seek stutter when frame-times unavailable. The strict[frameStartTime, frameEndTime)interval test vsMath.round(t*fps)round/floor mismatch re-seeks every time playback crosses into the upper half of a frame interval, so normal playback visibly stutters on sessions without frame-times (e.g. analyze sessions). Fix: restore a tolerance (≈0.5/fps) in the fallback path.frontend/src/routes/Viewer.svelte:301— frame-times overlay misalignment on frame-count mismatch. The mapping assumes the k-th unique fex frame aligns to the k-th video packet PTS (arr[uniq[k]] = times[k]); a subsampled/variable-rate recording or video-without-matching-fex desyncs the overlay. Fix: map by actual frame index, not positional zip.frontend/src/routes/Viewer.svelte:130— fps source change desyncs overlay. Mapping now usesframes_written/duration_secondsinstead of the stored metadata fps; when frame-times are unavailable and wall-clock duration ≠ content duration, the overlay maps to the wrong frame. Fix: prefer metadata fps, fall back to derived.