taskMovesUpdate() decides to home and then calls setMove(&SERVO_MOVE_HOME, true). A command handled by taskTerminal() in between replied <CMD> BEGIN but was immediately overwritten by TAILHM; the tail only went home. The vTaskSuspend(tMove) in setMove() didn't stop updateMove() partway through, and on UART builds (no core affinity) both tasks can run at once. Move state changes are now serialized by a recursive mutex held across updateMove(), setMove(), setDSSPMove() and stopServos().taskMovesUpdate() suspended itself when it started a random move (setRandMove() → setMove() → vTaskSuspend(tMove) from the same task). The suspend/resume pair is replaced by the mutex above.Serial is written from a task running on the other core from its interrupt handler. Its ISR ignores a short FIFO write while HWCDC::write() commits the FIFO from the calling core. All console output now goes through a single writer task pinned to the ISR core, and application tasks are pinned to ARDUINO_RUNNING_CORE on USB CDC builds.USB_CDC_TX_BUFFER_SIZE), which absorbs the periodic 2–6 ms host SOF dropouts instead of evicting queued output.Source_Capabilities from inside PD_UFP.run(). The source abandons the negotiation if the Request doesn't arrive within its 24–30 ms SenderResponseTimer. Since 0775052, run() was called from taskBattUpdate(), which runs every 30 ms, so the reply was often late. The result depended on timing and on the charger: soft or hard resets, or a fallback to 5 V. PD now runs in its own task, woken by the FUSB302 interrupt, and replies within about 3–4 ms.CHARGE COMPLETE notification. With a charger slower than 500 ms to reach PS_RDY, the firmware could also act on the previous charger's 12 V reading, enabling fast charging and skipping the 15 V/9 V fallback before the new negotiation finished.PD_UFP.init().Get_Src_Cap sent immediately on attach. The library's 350 ms t_TypeCSinkWaitCap timer wasn't restarted on attach, so it requested capabilities before the charger sent them. Some chargers answered with a Soft_Reset.b093b59 was lost in revert 6d8cfb6. Detection now runs while idle and is suspended during moves, when servo motion disturbs the readings.clapModeIsOn and prevClapModeIsOn could cause a spurious or missed CLAP ARMED edge on startup.ARMED and DISARMED console messages to Clap, Listen, and Tilt Modes that now emits correctly on the edge detection of those modes transitioning state.Log module (include/Log.h, src/Log.cpp) for thread-safe console output:Serial.write(), so lines from different tasks can't interleave.logPrintf(), logPrintln(), logPuts(), and logFlush() to drain the queue before a blocking operation or power-off.LOG_DEBUG* (FDEBUG) and LOG_TERM* (FDEBUG || TERMINAL) macros replace the per-call #if defined(…) guards.~, and FDEBUG builds print ~ LOG: N message(s) dropped or truncated ~.src/ is migrated from Serial.print* to Log.h. The printed text is unchanged; lines that were built from several Serial.print() calls are now sent as one message.DBG_PRINTLN (and therefore SEND_MSG) uses logPrintln().logFlush() is called before every PIN_HOLD power-off, and replaces Serial.flush() before blocking homing.Serial.flush() between pieces.xTaskCreatePinnedToCore(…, RTOS_APP_TASK_CORE). The pin applies to USB CDC builds only; UART builds (Flutter, Mini, MiTail) keep no core affinity.taskPDUpdate() task (priority 2, static allocation, created only on hardware with USB PD). It is woken by a falling-edge interrupt on the FUSB302 IRQ line (PIN_ATTACH), or every 10 ms to run the library's timers. It also owns all charger control pins; the charge holdoff check moved here from taskBattUpdate().Log.h instead of PD_UFP.print_status(Serial), which wrote to Serial directly. Output is deferred while FUSB302 events are pending, so it never delays a reply.taskPDUpdate().updateMove() no longer calls logFlush() before homing (FDEBUG builds). The log queue already preserves output order. The flush was a leftover from the old Serial.flush() and delayed homing, and with the new mutex any incoming command, by up to the 1 s flush timeout.lpf_s instance and its pre-loop seed call. Both were orphaned in 9f25f3a when the classifier got its own filter state.Definitions.h now includes Log.h.FDEBUG): deprecated ++ on volatile, an unused static function, and debug-only variables in initServos().PD_Micro: added apply_init_power_config(). The init()/init_PPS() configuration is saved and reapplied on detach. On detach the library now also clears the source capabilities, pending request, and wait states.tPD and RTOS_TASKPDUPD_STACKSIZE.Initial release of TailControl unified firmware.