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 — прерывать ход ради отложимой операции не стоит (у/clearstop-first обоснован: без него результат очистки неверен), TOCTOU-окно между проверкой иCompactAgentсознательно принято. Заодно задействован ранее игнорируемый параметрkeyвhandleCompact. Тесты: новыйloop_compact_test.go—TestHandleCompact_BusyGuard(отказ с_compact_status=busy,CompactAgentне вызван) иTestHandleCompact_IdleProceeds(idle — ровно один вызов, подтверждение с_turn_end).- Слеш-команды с пробелами по краям больше не уходят в LLM (#387):
isPriorityCommandсравнивала сырую строку —/stopс хвостовым пробелом обрабатывалась как обычное сообщение. Парсер переписан вpriorityCommand(content) string(TrimSpace + ToLower → каноническое имя либо “”) и используется единой точкой: run-лейнloop.runи диспетчерhandlePriorityCommand(switch по нормализованному имени). ТестTestIsPriorityCommand→TestPriorityCommandс кейсами трима ("/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удалён). Статус ADR2026-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-композер предлагает только валидные команды через автодополнение.