0.167.34

Fixed

  • Graceful shutdown core на Windows вместо гарантированного Kill (A-023 — P2). stopCore в internal/tray/lifecycle.go слал syscall.SIGTERM безусловно: на Windows Process.Signal(SIGTERM) не поддерживается (runtime возвращает ошибку, которая молча глоталась через _ =) — core всегда убивался через Kill() по GracefulShutdownTimeout (30с) без возможности корректно завершиться (закрыть БД, слить логи, остановить HTTP). Платформенно-разделённые signals_unix.go/signals_windows.go: POSIX — прежний SIGTERM; Windows — GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid) в process group core (core создаётся в startCore с CREATE_NEW_PROCESS_GROUP, чтобы событие не уходило и supervisor’у). Go-runtime транслирует CTRL_BREAK в SIGINT (runtime/os_windows.go ctrlHandler), который main.go уже слушает — core-код не потребовал изменений (проверено по исходникам Go 1.26: SIGBREAK-константы не существует, CTRL_C и CTRL_BREAK оба → SIGINT; комментарий в main.go фиксирует эту зависимость). Windows-сборка TaigaClaw консольная (без -H windowsgui) — требование общей консоли для GenerateConsoleCtrlEvent выполняется; при недоставке события stopCore уходит в прежний сценарий Kill-по-таймауту. Задокументировано в комментариях кода. Тесты (unix): interruptCore доставляет перехватываемый сигнал реальному процессу (shell с trap 'exit 42' TERM + ready-барьер против гонки установки обработчика — exit-код 42 доказывает graceful-путь, а не Kill); nil-Process возвращает ошибку, а не паникует. Windows-путь проверен кросс-сборкой.