1.2.3

Fixed (#380)

  • Очистка файлов LLM-логов больше не зависит от расширения и формата имени (#380): раньше PurgeOldLogs удаляла только *.jsonl с датой YYYY-MM-DD в имени — любые другие файлы в llm-logs/<agentID>/ (эволюция формата, например вынос тел в отдельные .json, или ручное попадание) остались бы навсегда. Теперь возраст определяется по дате в имени независимо от расширения (последнее расширение срезается через filepath.Ext), при неудаче парсинга — fallback на mtime файла: каталог полностью принадлежит подсистеме, политика «старше cutoff — удалить» гарантирует отсутствие утечек любого происхождения. Недатированные файлы НЕ попадают в RemovedKeys (ключа для БД у них нет), датированные — дедуплицированы по <agentID>/<date> (при сосуществовании .jsonl+.json одной даты ключ один, а Purged считает каждый файл — задокументировано в godoc). Опустевшие после очистки каталоги агентов удаляются (корень llm-logs/ не трогается); ошибки удаления файла/каталога (кроме IsNotExist) логируются на debug и не дают попробовать удалить заведомо непустой каталог. Тесты: расширены TestPurgeOldLogs (старые .jsonl/.json удаляются, свежие и недатированные-свежие остаются), новые TestPurgeOldLogs_UndatedFileFallsBackToMtime (os.Chtimes → удаление по mtime) и TestPurgeOldLogs_RemovesEmptyAgentDirs (опустевший каталог удалён, живой и корень остаются). ocr review — 5 находок: 4 закрыты (godoc дедупликации, единый русский godoc, лог ошибок удаления каталога, agentDirEmpty=false при неудачном удалении файла), security-high (mtime-fallback может удалить «чужие» файлы) отклонён с обоснованием: прямое требование issue — консервативная политика именно гарантирует «в llm-logs ничего старше cutoff», каталог llm-logs/<agentID>/ по дизайну не предназначен для посторонних файлов.