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 хоронил бы рецидив навсегда →
dedupTTL30 мин; zero-valuelastBodyглотил первое пустое тело (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).