0.134.68

Fixed

  • Consolidator зависал навечно после ~22 мая: GetMessages(agentID, limit) делал ORDER BY id ASC LIMIT 500 — возвращал самые старые 500 сообщений. Consolidator с курсором (например consolidator_cursor:1:shared = 1537) фильтровал id > cursor, но все 500 загруженных сообщений были ≤ курсора → facts_extracted: 0 каждый прогон, курсор не двигался. Добавлен новый метод GetMessagesAfterID(agentID, afterID, limit)WHERE id > $afterID ORDER BY id ASC LIMIT $limit, теперь Consolidator грузит только непрочитанные. В production: ~2 недели отсутствовали новые факты → Dream не запускался → soul_evolved не обновлялся → “самопознание” агента остановилось.

Added

  • Stall-детектор в ConsolidatorService: при 6+ подряд пустых прогонах Consolidator (24 часа при интервале 4ч) логирует ERROR consolidator stall detected с деталями (cursor, max_message_id, unprocessed_messages) и сбрасывает счётчик. Следующий подобный баг не проживёт незамеченным.
  • Логирование Dream при пропуске: когда Dream не находит новых фактов после курсора, теперь пишет DEBUG dream skipped: no new facts after cursor с деталями (total_facts, cursor). Раньше полностью молчал — невозможно было отличить «нечего обрабатывать» от «система сломалась».
  • Health-check с memory статусом: GET /readyz?memory=true и GET /api/v1/health?memory=true теперь возвращают секцию memory с per-agent статусом: last_dream_run, dream_action_count, active_facts_count, consolidator_cursor, max_message_id, unprocessed_messages. даёт видимую индикацию в API/WebUI.
  • Новые Store-методы: GetMessagesAfterID, CountMessagesAfterID, GetMaxMessageID, GetLastDreamRun (SQLite + PostgreSQL + DualStore).

Tests

  • TestGetMessagesAfterID_BasicFiltering, TestGetMessagesAfterID_Limit, TestGetMessagesAfterID_EmptyResult, TestGetMessagesAfterID_ZeroCursor, TestGetMessagesAfterID_NonExistentAgent, TestGetMessagesAfterID_IsolatedPerAgent — покрытие нового Store-метода.
  • TestCountMessagesAfterID, TestGetMaxMessageID — покрытие вспомогательных методов.
  • TestConsolidator_SeesMessagesAfterCursor — репродукция баги (факты извлекаются из сообщений после курсора).
  • TestConsolidator_LargeDatasetCursorReach — 600 сообщений + курсор + 100 новых → факт извлекается (та самая production-ситуация).
  • TestConsolidator_CursorDoesNotStuckOnLargeDataset — интеграционный тест без застревания.
  • TestConsolidatorService_StallDetector, TestConsolidatorService_StallDetectorNoMessages — stall-детектор корректно сбрасывает/не сбрасывает счётчик.
  • TestDream_SkippedLogsCursor — Dream корректно логирует пропуск.