Backlog from the code review, all verified building: - SD ownership barrier (Loop_SetSdBusy): while sd_module reads or writes the track buffers from core 0, the audio path performs no writes to them and MIDI/touch cannot re-arm recording or erasing. A MIDI track select during a save used to produce a WAV mixing old and new audio; a pending erase corrupted the saved take. - MTLooper_ToggleSource now actually drives the ES8388 (ES8388_SetInputCh 0 = mic on LIN1/RIN1, 1 = line on LIN2/RIN2). Only the AC101 path was wired, so on this board the UI claimed 'Microphone' while the input stayed on line. - loop() prescalers were off by SAMPLE_BUFFER_SIZE: one iteration is a block, not a sample. loop_1Hz fired every 48 s; MIDI was processed every ~70 ms, long enough to overflow the 256 byte serial RX buffer on dense controller sweeps. MIDI is now polled once per block. - Box-3 tempo button wrapped to 60 BPM, below the looper floor (~85 BPM for an 11.3 s max loop), so it looked broken. Wraps to 90 now. - link RX byte counter on the console (wiring diagnostics). - CI runs the host protocol tests (C + pytest) and builds the Box-3 firmware in the espressif/idf:v5.4 container.