1.2.8

Removed (#387)

  • Команда /restart удалена (#387) — аудит показал недокоманду с багом: после рецикла сессионного актора литерал /restart доставлялся новому актору как обычное inbound-сообщение, персистился в историю как user-строка и запускал полноценный LLM-ход (агент «отвечал» на команду, _turn_end приходил от этого хода через safety-net); на саму команду не было ни статусного ответа, ни divider’а, активный ход отменялся жёстко — без graceful-очереди и чекпоинта; описание «Перезапустить сессию агента с начала» не соответствовало поведению — история и fileStates не сбрасывались, новый актор лишь перечитывал ту же историю; фронтендный спец-кейс (chat.svelte.ts, комментарий «the process is killed» — ложь: рециклилась горутина, а не процесс) удалён, теперь enterAwaitingTurn() безусловно. Пользовательской ценности рецикл горутины не нёс (/stop + /clear покрывают сценарии). Удалено: строка в AgentCommands(), ветка диспетчера, TestHandlePriorityCommand_RestartActorSharesRunCtx (инвариант #358 остаётся покрыт обычным Start-путём — routeToActor всегда получает runCtx); identity-гвард removeActor и re-валидация актора в handleClear (#347) сохранены как инварианты, комментарии переформулированы без привязки к /restart.

Fixed (#387)

  • /compact больше не гоняется с активным ходом (#387): командная компакция не проверяла занятость актора и могла пройти посреди хода — CompactAgent гонял бы свои DELETE/INSERT с live-персистом runner’а (ADR 2026-08-20, #280). Теперь busy-guard по образцу handleStop (шаг 1): при занятом акторе — отказ «Компакция отклонена: ход ещё активен. Остановите его (/stop) или дождитесь завершения.» с _turn_end + _compact_status=busy; отказ вместо stop-first — прерывать ход ради отложимой операции не стоит (у /clear stop-first обоснован: без него результат очистки неверен), TOCTOU-окно между проверкой и CompactAgent сознательно принято. Заодно задействован ранее игнорируемый параметр key в handleCompact. Тесты: новый loop_compact_test.goTestHandleCompact_BusyGuard (отказ с _compact_status=busy, CompactAgent не вызван) и TestHandleCompact_IdleProceeds (idle — ровно один вызов, подтверждение с _turn_end).
  • Слеш-команды с пробелами по краям больше не уходят в LLM (#387): isPriorityCommand сравнивала сырую строку — /stop с хвостовым пробелом обрабатывалась как обычное сообщение. Парсер переписан в priorityCommand(content) string (TrimSpace + ToLower → каноническое имя либо “”) и используется единой точкой: run-лейн loop.run и диспетчер handlePriorityCommand (switch по нормализованному имени). Тест TestIsPriorityCommandTestPriorityCommand с кейсами трима ("/stop "→команда, "/ stop"→нет) и {"/restart", ""} (команда удалена). Комментарий в channels/websocket.go (wsControlAction) обновлён на новое имя.

Docs (#387)

  • docs/features-matrix.md §7 переписан под реальность: убраны несуществующие CommandRouter (4 тира маршрутизации), /status, /new, /dream, /dream-log, /dream-restore, /history, /help (рудимент nanobot-эры из ADR) — таблица теперь описывает реальные /stop, /compact (+busy-guard), /clear и push-стратегии message_push_strategy; сводная строка раздела 7 — «⚠️ 3 из 8» вместо «✅ Полностью». docs/guide/getting-started.md больше не обещает /new и /dream — перечислены реальные три команды. docs/roadmap.md: строка «CommandRouter + слеш-команды» с несуществующим пакетом internal/command/ заменена на фактическое состояние (internal/agent/, без CommandRouter, /restart удалён). Статус ADR 2026-05-04-слеш-команды обновлён: «частично реализовано, сузено» с описанием фактического покрытия (только priority-категория). Проверки: go test ./... -count=1, golangci-lint run ./..., npm run check, npm test (866), make build-cross — зелёные. ocr review — 2 находки, обе отклонены с обоснованием: (1) high «удаление фронтендного спец-кейса /restart — регрессия, индикатор busy залипнет» — предпосылки находки опираются на удаляемый ложный комментарий «the process is killed»: /restart никогда не убивал процесс (рециклилась горутина актора), _turn_end приходил от последующего хода на литерал через safety-net, а после удаления команды /restart — обычное сообщение, завершающееся штатным ходом; (2) low «опечатки вроде /compcat молча уходят в LLM» — pre-existing поведение (так работало и isPriorityCommand), UI-композер предлагает только валидные команды через автодополнение.