1.7.4

Fixed (#402)

  • Parse-error WARN’и извлечения фактов теперь несут тело ответа, а не только длину (#402; прод: consolidate агента 2 падал с «invalid character ‘U’…» на 32-байтном не-JSON — судить «мусор от модели vs plain-text ошибка прокси» было невозможно, консолидация памяти фактически не работала). Новый общий хелпер internal/logguard.ParseFailLogger: WARN с усечённым телом (200 рун, rune-safe через internal/truncate), антиспам-дедуп — устойчиво одинаковое тело логируется полным WARN’ом один раз, повторы деградируют до Debug (TTL 30 минут: рецидив после паузы снова WARN), пустое тело — валидный сигнал (первое появление WARN, seen-флаг отделяет «тела ещё не было» от «предыдущее было пустым»). Подключён в трёх местах с идентичным анти-паттерном «raw_len only»: Consolidator.callExtraction (extract facts ×2), Dream.analyze (dream parse ×2), kg-экстрактор (extractChunked зовёт извлечение per-chunk — без дедупа одна ошибка прокси спамила бы на каждый чанк). Пакет нейтральный (logguard), т.к. memory → knowledgegraph по импортам и memory-хелпер kg недоступен. Осознанно без слоя редакции: фрагменты тела в логе — и есть диагностика (замечено в godoc пакета).

Review (#402)

  • ocr review — 3 раунда, 2 → 4 → 4 находок, все исправлены либо подтверждены как «no change needed» самим ревьюером (проверка конкурентности — критическая секция корректна, slog вне локда). Исправлены: дедуп без TTL хоронил бы рецидив навсегда → dedupTTL 30 мин; zero-value lastBody глотил первое пустое тело (LLMResponse{Content:""} достижим из collectStream) → seen-флаг + тест; kg-вариант без дедупа спамил бы per-chunk → перевод на общий хелпер; no-copy комментарии (sync.Mutex по значению в полях трёх владельцев, go vet -copylocks); godoc: нулевое значение готово к использованию, конструктор не нужен. Проверки: go test ./... -count=1, golangci-lint run (0), go vet, make build-cross (6 платформ) — зелёные. Тесты: «оба ответа мусор» (контракт тихого нуля сохранён: фактов 0, err nil, 2 вызова; первый WARN с телом, retry с тем же телом — Debug), дедуп повторов (2 WARN / 2 Debug на чередование тел), усечение длинного HTML, пустое тело (первое WARN, повтор Debug).