0.167.17
Fixed
- Адресация замечаний
ocr reviewпо батчу компакции (#282/#284/#285/#286). (1)TruncateToolResult: стоимость маркера\n[... truncated ...]\nвычитается из бюджета — результат больше не превышаетmaxTokensна ~5 токенов; документирован+0.5-запас хвоста. (2)archiveToConversation(memory): битый JSONtool_callsбольше не выбрасывает tool-вызовы из handoff молча —slog.Warn+ рендер сырого блоба<raw>…</raw>; добавлен общий кап входа сводкиcompactConversationRunes=250kрун с маркером обрезки (сотни tool-результатов × 2000 рун раздули бы вход за контекст модели сводки — clampDynamicSummaryMaxTokensограничивает только выход); ошибкаGetRecentMessagesпри поиске userID теперь логируется (раньше — невидимая деградация до shared-scope консолидации). (3) Дедупликация набора диалоговых ролей: каноническийstore.IsDialogRole/dialogRoles+ пин-тестTestDialogRoleFilterSync, сверяющий SQL-константыdialogRoleFilter(SQLite) иpgDialogRoleFilter(PostgreSQL) с каноном — список в memory и SQL больше не может разъехаться молча. (4) Хрупкий хардкод фолбэка бюджета:memory.FallbackHistoryBudgetTokensэкспортирован и зажат пин-тестомTestAutocompactFallbackBudgetMatchesпротивagent.ComputeBudget(DefaultContextMaxTokens).History. (5)tokens.isCJKRuneдополнен Unicode-блоками (Extensions C–H, Compatibility Ideographs, CJK Strokes, Enclosed CJK, Bopomofo); package-doc уточняет калибровку ±20% (латиница/CJK) и консервативный вес кириллицы 0.4; docTruncateByTokensфиксирует контрактmaxTokens <= 0 → "". (6)marshalArgsNoEscape(compressor) документирован как best-effort + debug-лог при ошибке кодирования; фолбэк emergencyCompact помечен best-effort (инвариант последнего user не гарантируется). JSDocCompactionConfigвtypes.tsпереписан без внутреннего противоречия (union всех схем, включая legacy-only поля). Ложные срабатывания ревью (guardmaxTokens<=0вTruncateByTokensсуществует; тест зелёный) — отклонены с обоснованием. Принятые LOW без правки: O(N) rune-подсчётCount(осознанный трейд-офф точности; вызовы линейны по истории), rune-аллокация вcompressTruncate(только путь summarization), float-накопление вCount(погрешность ~1e-10 на 400k рун),renderArchiveMessageпокрыт опосредованно тестамиarchiveToConversation. Тесты:TestArchiveToConversation_MalformedToolCalls_RendersRaw,_TotalRunesCap,TestDialogRoleFilterSync,TestIsDialogRole,TestAutocompactFallbackBudgetMatches; полныйgo test ./...зелёный,golangci-lint — 0 issues,npm run check — 0 ошибок.