v0.28.3.ru.md
docs/i18n/release-notes/v0.28.3.ru.md
Tesserae v0.28.3 — лимит в один ход у экстрактора и то, во что он молча обошёлся
<!-- translations:start -->
English · 한국어 · 中文 · 日本語 · Español · Français · Deutsch
<!-- translations:end -->
Released 2026-07-31 · PyPI · GitHub release · pip install --upgrade tesserae==0.28.3
Один флаг. Он жил в Claude-экстракторе с самого первого коммита конвейера и на машине с настроенными MCP-серверами полностью лишал LLM-извлечение работоспособности — при этом не роняя компиляцию.
--max-turns 1 никогда не был решением
Обе точки вызова Claude CLI запускали:
claude -p --output-format text --max-turns 1
--max-turns считает вызовы инструментов, а не ответы. Если в конфигурационном каталоге CLI есть MCP-серверы или хуки, первым действием модели может стать вызов инструмента — и единственный ход на этом заканчивается. CLI завершается с кодом 1 и сообщением Reached max turns (1), не выдав ни байта JSON.
Tesserae перехватывает это и откатывается к детерминированному извлечению: сбой провайдера не должен прерывать компиляцию. В итоге компиляция «удавалась», граф выглядел правдоподобно, а LLM не вносила в него ничего.
Флаг никто не выбирал. Он появился вместе с первым коммитом конвейера, а три месяца спустя ClaudeCLIJsonClient скопировал его дословно — потому что в его docstring сказано, что он «повторяет паттерн run_claude_cli». Ни одно сообщение коммита его не упоминает.
Одноразовый вызов на самом деле означает --strict-mcp-config
Смысл лимита был в том, чтобы «ответить один раз и не запускать агентный цикл». Правильное выражение этого — не загружать MCP-серверы вовсе, тогда не останется инструмента, на который можно потратить ход:
claude -p --output-format text --strict-mcp-config
Первый ответ модели и есть результат, а настроенный MCP-сервер больше не может «заморить» вызов. Исправлены обе точки вызова, а регрессионный тест утверждает, что лимит ходов не вернётся ни в одну из них.
Проверьте, не стоил ли этот баг графа вам
Сбой невидим в итоговой сводке компиляции — он живёт только в логе:
grep -c 'Reached max turns' <ваш лог компиляции>
Любое значение больше нуля означает, что эти файлы были извлечены детерминированно; повторная компиляция на этой версии их восстановит. На собственном графе проекта возврат настоящего LLM-извлечения поднял число узлов с 5 155 до 13 182 — детерминированный откат стоил примерно 60% графа.
То, что компиляция рапортует об успехе, потеряв LLM-извлечение на большинстве файлов, — отдельный дефект: он отслеживается в #92 и здесь не исправлен. Этот релиз убирает одну причину молчаливого отката, но не саму молчаливость.
Обновление с v0.28.2
Прямая замена. Изменений в API, схеме и конфигурации нет. Если ваши прошлые компиляции пострадали, перекомпилируйте и заберите недостающее извлечение — кэшированные ответы LLM в ~/.tesserae/llm_cache переиспользуются, так что платить придётся только за файлы, которые тогда откатились.