Skip to content

Follow-up (v0.8.14): deferred review findings — Live mode + Viewer playback #69

Description

@ljchang

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:195liveEdits 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions