0.167.16

Changed

  • Компакция теперь производит структурированный инженерный handoff-документ вместо аннотации «2-5 предложений» ( — P1). Оба промпта компакции (agent.resolveSummary — «Ответь кратким содержанием ключевых тем… 2-5 предложений» и AutoCompact.generateSummary — «Summarize this conversation in concise bullet points») запрашивали общую прозу, после которой агент терял практически всю рабочую информацию: какие файлы правил, какие команды запускал, какие ошибки получил, что решил и что осталось. Хуже того, вход AutoCompact выбрасывал role="tool" целиком и не рендерил ToolCalls вовсе, а каждое сообщение обрезалось до 500 байт байтовым срезом, рвущим UTF-8 посередине. Фикс: (1) новый единый memory.CompactionHandoffPrompt с обязательными markdown-секциями — исходная задача, все сообщения пользователя, файлы (пути+фрагменты), команды (успех/ошибка/коды), ошибки и исправления, решения и отвергнутые варианты, незавершённое и следующий шаг — применён в обоих местах (temperature 0.3→0.1 для фактологичности); (2) построение входа вынесено в archiveToConversation: role=tool рендерится («[результат exec]: exit code 1…»), ToolCalls ассистента парсятся и рендерятся с аргументами, служебные роли (tool_call_history/tool_iteration/summary) и старый маркер [Resumed Session] на вход не попадают (сводка больше не сжимает предыдущую сводку); (3) обрезка rune-safe (truncateRunes): сообщения/tool-результаты до 2000 рун, аргументы до 1000 — вместо 500 байт; (4) SummaryRatio 25→10 (clamp 1024..8192 сохранён): структурированный документ с секциями требует больше места, чем аннотация; (5) messagesToText в compressor — синхронно: аргументы 200→1000 рун, результаты 500→2000 рун, обрезка rune-safe, аргументы tool-вызовов маршализуются без HTML-экранирования (&& больше не превращается в \u0026\u0026 и не портит команды в сводке); (6) оценка входа len(conversation)/4 заменена на tokens.Count (консистентно с rune-метрикой #282). Маркеры [Resumed Session]/[Сжатый контекст] и их потребители (MarkdownRenderer, chat_history, compactionSummary.ts) не изменены. Тесты: tool/ToolCalls/команды/коды ошибок присутствуют в тексте для LLM; обрезка длинных сообщений utf8.ValidString в memory и agent; [Resumed Session] не протекает на вход; служебный/пустой архив → пустой вход (LLM не вызывается); TestDynamicSummaryMaxTokens перекалиброван под 1/10.