Skip to content

English | Русский

Что изменилось в 1.9 ​

Страница для того, кто обновляется. Прежде чем читать, что сломается, стоит знать, ради чего.

Что такое 1.9, в трёх пунктах ​

📏 Релиз, который перестал верить себе на слово. 1.8 отвечала на вопрос «принуждает ли фреймворк к дисциплине». 1.9 не задаёт вопрос — она делает два утверждения о продукте и требует, чтобы каждое было измерено: существенная экономия токенов и повышенное качество разработки на любой модели.

И одно из двух ИЗМЕРЕНО ОДИН РАЗ — и на этой паре экономии нет; сказано здесь, а не в сноске. Телеметрия числа по-прежнему не производит: из 57 251 строки входные токены несут 233 (0%), а базы сравнения «без TAUSIK» в ней не существует ни одной. В смене #225 было 0 строк из 4 777 — прибор сдвинулся, но до числа не дошёл. Для телеметрии это ОТСУТСТВИЕ величины, а не измеренный ноль. Число дал другой прибор — парный replay на фиксированном корпусе (протокол, §7): десять одинаковых вопросов о репозитории, один коммит, одна модель, обвязка с rag-first подсказками против той же обвязки без них. С подсказками дороже: 198 848 против 195 055 токенов нового контекста и вывода (+1,9 %), 326 323 против 292 715 байт результатов исследования (+11,5 %), а search_code, который подсказки рекомендуют, не вызван ни разу ни с ними, ни без них (0 из 62 и 0 из 76 вызовов). Это один отсчёт на одном корпусе, в этой паре — не опровержение экономии вообще: повтор одного и того же условия разошёлся на 13 %, больше самой дельты. Обещание остаётся тем, что релиз обязался измерить; как факт публикуется только измеренное: экономии нет на этой паре, и подсказки не меняют выбор инструмента.

🔢 Ноль перестал выдаваться за измерение. Величина, которую нельзя получить, теперь ОТСУТСТВУЕТ, а не равна нулю. Это звучит как мелочь, пока не посмотреть на числа: телеметрия 55 471 раз утверждала, что работа стоила $0.00, и пиннинг модели не срабатывал НИ РАЗУ за 231 смену. Оба дефекта выглядели как «функция никому не нужна».

🖧 Гарантии называются по правилам, а не по хостам. Пять сред получали один текст правил, обещавший автоматическое принуждение; на двух из пяти это было неправдой (замер смены #225; Codex стал шестым хостом позже в этом же релизе и на тех же условиях — см. ниже). Теперь каждый хост читает то, что для него действительно развёрнуто, — и раздельно по правилам, потому что «здесь всё — инструкции» на хосте без хуков тоже неправда: закрытие задачи там отказывается.

Полный список правок: CHANGELOG.ru.md. Эта страница — не пересказ: в разделе 1.9 CHANGELOG больше 250 записей (нижнюю границу держит tests/test_release_notes_1_9.py), а сюда отобрано то, что меняет опыт ОБНОВЛЕНИЯ.


ЛОМАЮЩИЕ ИЗМЕНЕНИЯ ​

Этот раздел — единственный источник текста будущего тега. Он существует именно поэтому: у 1.8 ломающее изменение трастовых тиров осталось в CHANGELOG и не попало в заметки к тегу, а опубликованный тег уже не перевыпустить.

1. Гейт записи, не сумевший прочитать БД, теперь ОТКАЗЫВАЕТ, а не пропускает ​

Было. Если scope_write_gate не мог открыть .tausik/tausik.db — файл заблокирован, повреждён, недоступен, — он пропускал запись. Молча.

Стало. Отказ. Гейт, который не смог проверить, не имеет права отчитываться так же, как гейт, который проверил и разрешил.

Касается ли это меня. Да, если вы работаете при заблокированной или недоступной БД: раньше запись проходила, теперь будет отклонена с объяснением. Разблокируйте БД (обычно достаточно закрыть параллельный процесс) или снимите гейт осознанно через конфиг. Обход TAUSIK_SKIP_HOOKS=1 по-прежнему работает и по-прежнему телеметрируется.

2. Транспорт Notion удалён ​

Было. Общую базу знаний можно было зеркалить в Notion workspace: tausik brain init/status/sync/move/draft/publish, MCP-сервер tausik-brain с семью инструментами, навык /brain и два хука, искавшие в brain перед web fetch.

Стало. Ничего из этого не поставляется. Общее хранилище локальное и файловое — ~/.tausik-knowledge, — и --global у decide и memory add — единственный способ, которым запись покидает проект. tausik knowledge import-brain по-прежнему читает локальный файл зеркала ~/.tausik-brain/brain.db, так что уже зазеркаленное не теряется.

Касается ли это меня. Только если вы пользовались brain. Bootstrap поверх чекаута 1.8 удаляет устаревшую запись tausik-brain из каждого управляемого конфига хоста, и IDE перестаёт писать MCP-ошибку о сервере, которого нет. Выполните tausik knowledge import-brain один раз, если в зеркале есть записи, нужные в общем хранилище.


Что ещё изменится при обновлении ​

Схема БД: 44 → 62 ​

Восемнадцать миграций накатываются автоматически при первом обращении (числа здесь держит тест tests/test_release_notes_1_9.py против того, что выпустил тег v1.9.0).

Известная проблема, исправлена в 1.10. Обновление базы 1.8 версией 1.9.0 падает на v53 (duplicate column name: tz_ref) и оставляет schema_version на 44 (github#51, gitlab#18). Обновляйтесь сразу на 1.10: цепочка пропускает ADD COLUMN, который у таблицы уже есть, и штампует версию после каждой миграции, так что прерванное обновление продолжается с места остановки. Базу, которую уже сломало обновление 1.9.0, поднимает тот же прогон. Перед каждой создаётся резервная копия .tausik/tausik.db.bak.v<старая>; лишние чистятся tausik db prune --keep N.

Самая заметная — v58: колонки токенов и стоимости в usage_events стали допускать NULL. NULL означает «не измерено» и это не то же самое, что 0. Миграция перевела в NULL 55 307 строк, о которых доказуемо известно, что измерения не было, и не тронула ни одной строки с настоящим числом.

Последние невелики, но о них стоит знать: v59 позволяет ребру графа сказать, что оно НАБЛЮДАЛОСЬ, а не выведено; v60 записывает тест, который никогда не видели красным; v62 ставит индекс на tasks.defect_of — без него tausik status на базе с историей (1504 закрытых задачи) тратил 5,3 с в одной EXISTS, а хук SessionStart отваливался по таймауту 6 с и молча не доставлял контекст; после индекса запрос идёт 5 мс, status — 0,3 с, хук — 0,9 с; v61 добавляет tasks.tracker_refs — первую колонку tasks после v43, и именно на ней поймали пост-миграцию, которая пересобирала tasks по замороженному списку колонок v43 и стирала любую позднюю. Пересборка починена в этом же релизе — после себя она накладывает каждую позднюю колонку заново, — так что база, обновляющаяся с версии до v43, колонку сохраняет (tests/test_migration_v43_model_mismatch.py).

Стоимость и модель: то, что раньше молчало ​

  • Ноль больше не выдаётся за измерение. calculate_cost_usd возвращает отсутствие для модели без цены и 0.0 для модели с ценой ноль — раньше оба случая давали 0.0, и различить их было нечем.
  • Расход смены был завышен вдвое на 156 сменах из 160; итог теперь говорит, какая его часть посчитана по отозванной арифметике.
  • Цены живут в конфиге проекта, и его слово главнее поставляемой таблицы. Тариф — это ПАРА чисел (вход и выход), а не одно.
  • Модель смены записывается. Раньше sessions.model_id был пуст во всех 231 сменах, поэтому пиннинг модели (RENAR 10.13) не срабатывал ни разу. Источник — цепочка: TAUSIK_AGENT_MODEL → переменные хоста → провайдер хоста. Из имени хоста модель НЕ выводится: Claude Code, направленный на другой endpoint, работает на модели того endpoint'а.

Гейты: молчание перестало быть вариантом ​

  • Гейт без реализации и без команды блокирует, а не молчит.
  • Отвергнутое переопределение команды гейта блокирует; подмена дефолтом делала отказ невидимым.
  • ruff гоняется и на триггере verify, а не только на commit.
  • Новый гейт cross_model_parity: различие между хостами, делящими точку расширения, обязано быть НАЗВАНО. Он не требует одинаковости — у Cursor нет точки расширения, — но необъявленное различие блокирует. Срабатывает только на правках слоя хостов.

Прогон тестов ​

  • Лента идёт параллельно по умолчанию (-n auto в addopts). Нужен pytest-xdist; без него pytest выйдет с «unrecognized arguments: -n».
  • Выборка по импортам, а не по именам — область дешёвого прогона стала шире, половина корпуса перестала быть недосягаемой.
  • pyproject.toml больше не обещает tausik verify --full, которого никогда не существовало.

Новые команды ​

КомандаЧто делает
tausik coherenceРепозиторный вопрос, которого не задавал ни один гейт: что в дереве перестало сходиться
tausik audit evidenceСсылки на доказательства в закрытых задачах больше не гниют молча

Codex — шестой хост, и утверждение кончается там, где кончился замер ​

bootstrap.py --ide codex (и --ide all) разворачивает Codex CLI: MCP-сервер tausik-project, зарегистрированный в ПРОЕКТНОМ .codex/config.toml, тот же набор навыков, что у Claude, в .codex/skills/, суб-агенты, порождённые из канонического Markdown в .codex/agents/*.toml, и .codex/hooks.json, собранный из ТОЙ ЖЕ декларации хуков, что профиль Claude (абсолютные пути — у Codex нет переменной рабочей области). Поддержка — обещание релиза потому, что её доказал настоящий Codex-хост, а не потому, что файлы существуют: в живой приёмке Codex вызвал tausik_status и получил структурированный ответ, его каталог показал i-have-adhd и агента tausik-reviewer, а запрещённая Path('outside.txt').write_text(...) была отклонена до появления файла.

Граница, названная здесь один раз. Этот отказ произошёл под профилем хуков, которому пользователь ДОВЕРИЛ в Codex. Та же операция при сгенерированном, но недоверенном профиле выполнилась до конца — ни один хук не сработал. На диске эти состояния неотличимы, поэтому Rule 1 и ACL записи на Codex — hard как только вы доверили хуки проекта, а недоверенный профиль не принуждает ничего. Матрица принуждения несёт это условие в обеих строках, и тест его там удерживает.

Быстрый старт самого агента ​

agent-quickstart.md (EN/RU) написан для агента, читающего его первым: подключение на своём хосте — каждый хост, который разворачивает bootstrap, Codex с условием доверия, — проверка, затем цикл точными вызовами с ответами и отказами, которые он реально увидит; каждый снят с живого прогона и удерживается кодом через tests/test_agent_quickstart.py.

Контекст: между проектами, между сменами, через сжатие ​

Глобальная настройка больше не носит чужой проект. В 1.8 ~/.tausik/config.json пользовательского яруса мог принести в ваш проект ослабление, включённое для другого (auto_verify: true от соседа). Теперь ослабление яруса «пользователь» живёт в секции projects по абсолютному пути проекта; tausik doctor называет каждое действующее ослабление MACHINE-WIDE или проектным и показывает чужие записи отдельно.

task start приносит память по релевантности. Сверх хвоста по недавности в CLAUDE.md старт, возобновление и task show печатают блок Relevant memory (N), собранный из объявления самой задачи; пустой ответ назван вместе с термами.

Файл правил получил раздел «Компакция». Он говорит, что переносить через сжатие контекста дословно. Файл правил preserve-if-exists: на уже забутстрапленном проекте раздел появится только после удаления сгенерированного файла и повторного bootstrap.

knowledge export --redacted маскирует пути, адреса, URL и имена проектов типизированными заглушками перед публикацией общей памяти.

Режим caveman стал контрактом ответа, а не только длиной: форма done → verified by → left → your call, пять названных исключений и проверка перед отправкой — внутри той же директивы, без второго режима.

Экономия вывода: два рычага, оба выключены осознанно ​

read_ledger (не платить дважды за неизменившийся файл) и байтовая крышка на вывод команды поставляются, но по умолчанию выключены, и по каждому есть решение с числом. Включение — ваш выбор, не наш по умолчанию.


См. также ​

  • publishing.md — две линии репозитория и почему опубликованный тег не двигается
  • enforcement-coverage.md — что принуждается на вашем хосте и чем
  • cost-telemetry.md — как читать стоимость после v58