📋 MixBox Changelog

Pending items come from the most recent July 2026 codebase audit and were all re-verified against current source on 2026-08-20 — every one of the eleven is still present in the tree; resolved incidents are kept below for history.

Pending (July 2026 Audit)

PackageFix neededWhy
audio-coreNormalize pydub samples before converting to floatsFallback returns PCM-scale values (e.g. 32767) instead of [-1, 1] when librosa fails to decode, making normalization unreachable
audio-coreHandle nonpositive tempos before octave foldingadjust_bpm_octave guards only bpm_min/bpm_max, never tempo, so a zero tempo makes while tempo < bpm_min: tempo *= 2 spin forever — a hang detect_bpm’s try/except cannot catch, not a raised math error. Observed live 2026-08-20: librosa.beat.beat_track returns tempo 0.0 for the pure 440 Hz sine fixture, so tests/test_audio_core.py::TestFeatures::test_detect_bpm never terminates and any pytest run that selects slow hangs on it; the other six TestFeatures tests pass in about 8 s each
hitscanPass an onset-strength envelope to beat trackinglibrosa.beat.beat_track should receive an explicitly computed onset-strength envelope
hitscanConstruct cached report results with the declared fieldCached report results are currently built from mismatched fields
hitscanShip and resolve the HTML report templatecompile_report fails to resolve or ship the template
hitvidRead metadata from the relocated upload pathThe job moves the file, then reads audio metadata from the old path
hitvidPass the generated placeholder artwork to the encoderPlaceholder art is generated when album artwork is missing but never reaches the video encoder
dj-engineAlign delay configuration fields with the delay callableConfig-model delay fields do not map to the arguments the delay effect callable expects
dj-engineRead the delayed sample instead of the current sampleDelay logic processes the current sample rather than fetching from the delay buffer
dj-engineForward parametric EQ arguments by nameThe AudioSegment branch calls parametric_eq(y, bands, sr) positionally, binding bands into the sample_rate slot and sr into center_freq; the fabricated zero-gain band is then skipped, so the branch is a silent no-op that discards every configured band — a genuine mismatch, not merely brittle style
dj-engineReject zero tempo in the octave candidate loop_adjust_bpm_octave guards only the range bounds, so a tempo of 0 makes the while t < bpm_max * 4: t *= 2 candidate loop spin forever — an uncatchable hang rather than a caught beat-matching failure

Resolved History

AreaIncidentResolution
GUI & OperationsStandalone review runtime crashCrash while building live /ws/timeline plans fixed
GUI & OperationsPublic review surface offlineNginx/TLS configuration repaired and traffic redirected to HTTPS
GUI & OperationsMissing /settings routeAdded the missing views/settings_view.py (fixing the ImportError) and removed the duplicate @ui.page route registrations
GUI & OperationsSettingsViewModel type mismatchapp_storage parameter handling corrected
GUI & OperationsConfig load bugGUI loads config.yaml instead of relying purely on Pydantic defaults
GUI & OperationsHost/port bindingsHardcoded hostname replaced with 0.0.0.0 binds for robust networking
Transition & EngineReview-surface rolesRoles clarified between the NiceGUI /preview operator workflow and the external OpenDAW research surface (historical decision; OpenDAW remains external research)
Transition & EngineFilter-sweep double attenuationmixer.py:_apply_filter_sweep no longer attenuates the filter twice
Transition & EngineHybrid review reload bugReloading an identical plan payload is no longer ignored in the timeline review UI