The WEFAX decoder decoded content but chopped a single chart into many short PNG "chunks". Two heuristics fought each other: in State::Receiving the carrier-loss watchdog finalized the image after only 30 low-correlation scan lines (~15 s at 120 LPM), and the Idle variance auto-start then re-triggered on the still-present carrier ~3 s later, starting a fresh image. Ordinary HF fading (QSB) of 5-20 s therefore split every chart into a stream of tiny images. Reference decoders (fldigi) keep one continuous image per APT cycle up to a large line cap and only stop on the APT stop tone or genuine signal loss. Align with that model: - Raise the end-of-transmission watchdog to 120 low-correlation lines (~60 s at 120 LPM) so normal fades ride through within one image. - Gate the variance-based auto-start to fire at most once per session (auto_start_used). After the first image a new one starts only on an APT start tone or an explicit reset, so trailing carrier/noise can no longer spawn a second image. reset() re-arms it. - Cap a single image at 3000 lines to bound memory on an open carrier. - Require a 2 s (was 1 s) APT tone sustain, cutting false Stop detections on busy image content that momentarily hits ~450 transitions/s. Also make line slicing drift-free: 120 LPM at 11025 Hz is 5512.5 samples per line, and slicing on the rounded integer accumulated a fractional-sample error every line (slow horizontal slant). Boundaries are now derived from the exact fractional line length (samples_per_line_f64) so the error never accumulates. Adds regression tests for the single-auto-start invariant and zero slicer drift over 1000 lines. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UiK871ht2uPFBHtMbxy3wD Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>