y83 code / журнал

Журнал релизов 0.8: часть 8 из 9

Полная ветка 0.8 из журнала проекта. Записи идут от свежих к старым, текст взят из CHANGELOG.md без правок — это тот же журнал, что читают разработчик и агент.

записей в ветке
251
приложение
185
бэкенд
59
архив сборок
7
период
19 августа 2026 — 24 октября 2026
страниц
8 из 9

журнал

Релизы ветки 0.8

Здесь записи 211–240 из 251: релизы приложения и бэкенда плюс записи архива сборок — каждая запись со своим набором правок.

0.8.33

18 сентября 2026

Fixed

  • Потерянный ход виден раньше: тишина в активном ходе — 4 минуты (было 10) до сверки статуса хода с сервером; снимок thread/list и возврат из фона гасят залипший ход сразу, а не через десять минут
  • «thinking…» больше не залипает после сворачивания: подписка на live-события треда — это thread/resume, и после обрыва WS новый сокет её не восстанавливал: turn/completed терялся, WorkingBar вечно показывал «thinking…», а лечил только перезаход. Теперь после реконнекта (и на возврате из фона) активный тред перечитывается: подписка, страница ходов и сверка активного хода одной функцией reconcileTurn (ход жив — оставляем, сервер закрыл — гасим, у сервера другой активный ход — принимаем его)
  • Снимок thread/list гасит потерянный ход: раньше он обновлял только карту статусов, и залипший turnActive не сбрасывался
  • Карточки не меняются под руками, пока читаешь историю вверху: видимое окно ленты замораживается, когда пользователь уходит от хвоста — новые карточки, сводки хода и перестановки (diff к концу блока и т.п.) идут в полный список и появляются при возврате к низу. Счётчик непрочитанных считается по полному списку, а не по видимому окну
  • Лента не дёргается при новых сообщениях во время скролла: ручное восстановление позиции больше не срабатывает во время драга/флинга, а если анкерный элемент исчез (мердж карточек) — возвращаемся к ближайшему соседу

0.8.32

18 сентября 2026

Added

  • Лимиты FreeBuff в приложении: карточка провайдера показывает баланс Freebucks (5/25), время сброса, tier, активную оплаченную сессию и цену каждой модели в fb/час; пикер моделей в Codex — бейдж цены и пометку «сессия оплачена · ещё Nм», в футере — сводка по провайдеру
  • Безопасный тест модели: у монетных провайдеров кнопка Test сначала бесплатно проверяет список моделей, а реальный запрос делает только после подтверждения с ценой («спишет 15 fb»); тестовой моделью выбирается самая дешёвая
  • Квоты провайдеров: backend отдаёт read-only снапшот квоты (GET /api/v1/providers/quota, GET /api/v1/providers/{id}/quota) — логин в локальную админку freebuff-proxy и zero-cost probe, без списаний

Fixed

  • FreeBuff-прокси как сервис: автостарт включён, health-check переведён на 127.0.0.1; svreg теперь супервизит и вручную запущенные серверы (раньше показывал «running», когда процесс уже умер)
  • Модели FreeBuff по цене: порядок моделей — от дешёвой к дорогой (GLM 5.3 Flash первым), фильтр списка моделей без счёта слэшей

0.8.31

18 сентября 2026

Fixed

  • Чат в Codex снова отвечает: роутер провайдеров отправлял наверх assistant-сообщение без content и без tool_calls, когда в истории треда оставался reasoning-элемент без финального ответа (например, после прерванного хода). OpenCode Go отклонял весь запрос («Invalid assistant message: content or tool_calls must be set»), и тред замолкал навсегда — перезагрузка телефона не помогала, потому что история хранится на диске. Теперь такие сообщения не уходят наверх, а reasoning, привязанный к вызовам инструментов, сохраняется как раньше
  • Модели FreeBuff видны в выборе моделей: список моделей отбрасывал id с вендорным слэшем (freebuff/deepseek/deepseek-v4-flash) — требовался ровно один слэш. Теперь достаточно префикса провайдера

0.8.30

18 сентября 2026

Fixed

  • TUI-программы (mc, htop, vim, less, …) наконец открываются: внутри tmux терминал-клиент не получает smcup/rmcup — tmux перехватывает alt-screen себе и наружу отдаёт только перерисовку, поэтому детект по эмулятору не срабатывал и вывод mc сыпался в ленту чата. Теперь состояние панели (#{alternate_on} + foreground-процесс) читается отдельным exec-каналом: TUI стартовал → автоматически открывается терминал, вышел → возвращаемся в чат
  • Лента чата молчит, пока TUI на экране: перерисовка полноэкранных программ больше не копится в бабле команды, при выходе чат продолжается с чистого листа

Changed

  • tmux перезапускается с явным сокетом ~/.y83-shellchat/tmux.sock и конфигом без статус-бара: его строка ([y83] 0:mc* …) больше не попадает в чат, escape-time 10 убирает задержку Esc в TUI, history-limit 10000

0.8.29

18 сентября 2026

Fixed

  • Обрывы соединения каждые 30–120 с устранены: JSch Channel.getOutputStream() держит общий буфер SSH-пакета и не синхронизирован — параллельные записи (клавиши TUI, resize, keepalive) перемешивали пакеты, sshd видел incomplete message и рвал сессию. Теперь все записи идут через одну очередь с одним потребителем, keepalive тоже через неё (serverAliveInterval=0)
  • Лента Shell-чата очищена от мусора инициализации: приветствие Termux, echo heredoc'а с rc-файлом и строка exec bash больше не попадают в чат — rc пишется одной командой в exec-канал, а парсер молчит до первого промпта
  • mc/TUI-программы теперь открываются: устранена гонка ConcurrentModificationException в парсере (весь терминал, парсер и публикация снапшотов — на одном потоке), alt-screen корректно детектится
  • Оборванная команда помечается «прервано», а не завершается ложным кодом 0 от нового shell; очередь команд продолжает работу после реконнекта

Added

  • Авто-возврат из терминала в чат, когда TUI-программа завершилась
  • Автоскролл терминала и кнопка «в конец»
  • Живучесть сессии через tmux: если tmux есть на цели, shell поднимается внутри него и переживает обрыв связи (cd и запущенные процессы сохраняются); без tmux — как раньше
  • В статусе app_shell появились поля interrupted и tui

0.8.28

18 сентября 2026

Fixed

  • Shell-чат больше не роняет Termux: RUN_COMMAND-интент уходил с неверным путём к bash (files/home/usr/bin/bash — такого файла нет), а запуск чужого foreground-сервиса из фона на MIUI убивает процесс Termux целиком (вместе с sshd, бэкендом и codex) — теперь интенты уходят только когда sshd не отвечает и обычным startService (как в рабочем TermuxBridge)
  • Сессия сама переподключается: обрыв больше не оставляет экран в «Соединение закрыто (exit=1)» — до 6 попыток с нарастающей паузой, статус в шапке, команды из поля ввода ждут в очереди
  • Неверный ключ больше не тупик: если SSH-аутентификация не прошла, ключ доталкивается в authorized_keys и подключение повторяется

Added

  • Отладочная команда моста app_shell (status/ready/connect/send/close) — проверка shell-чата без ручных тапов

0.8.27

17 сентября 2026

Fixed

  • Shell Chat больше не падает при открытии: ClassCastException (Y83App cannot be cast to App) в конструкторе ViewModel — экран не открывался вообще; то же было в промежуточной сборке Terminal
  • Конец команды определяется точно: свой rc-файл с OSC 133-маркерами (A — промпт, D;<exit> — завершение) вместо битого маркера с \$?, из-за которого вывод обрезался таймаутом 1.5 с; эхо команды и промпт вырезаются из бабла
  • Потеря последнего апдейта вывода: publisher сессии публикует хвост (раньше последний снапшот мог потеряться и чат «замирал»)

Changed

  • Чат с консолью в стиле Codex: баблы команд/вывода с ANSI-цветами, очередь команд, индикатор «выполняется», exit-код, история ↑↓, Ctrl+C/D
  • Сессии: Local (Termux) + remote-серверы из списка SSH-серверов — пикер цели в шапке, у каждой сессии свой транскрипт; в шапке — статус подключения, повтор подключения, предупреждение о смене host key
  • TUI в одном экране: тумблер Chat ⇄ Terminal, авто-переход при запуске полноэкранной программы (vim/htop) и карточка «нужен терминал» для REPL/паролей — сессия и PTY общие с чатом
  • Терминал и чат делят одну сессию: экран Terminal больше не поднимает второе SSH-соединение — показывает активную сессию shell-чата
  • Транскрипт shell-чата хранится в Room (v11): история команд и вывода восстанавливается при заходе и после перезапуска (последние 200 записей, хранение — 500 на цель); цвета остаются в живых баблах, в истории — текст

0.8.26

17 сентября 2026

Fixed

  • Карточка плана после одобрения больше не «схлопывается»: подсветка (рамка + тинт) и раскрытое тело сохраняются, бейдж меняется Pending → Approved → Done; свернуть план можно только тапом по шапке — скролл и выделение текста в теле карточку не закрывают
  • Шаги update_plan идут в карточку одобренного плана: чеклист обновляется в ней же (раньше прогресс жил в отдельной скрытой build-карточке, и одобренный план выглядел пустым); нижняя полоска прогресса берёт шаги из полной ленты и не пропадает, когда карточка выше окна
  • **Один plans/*.md на план**: файл писался на каждый turn/plan/updated — в plans/ копились сотни копий одного плана; теперь план сохраняется один раз на ход (при финализации предложения или закрытии всех шагов)

Changed

  • Markdown плана рендерится новым вьюером — тем же, что ответы агента: заголовки, списки, таблицы, код-блоки (старый Markwon-путь из карточки убран)
  • В шапке карточки — заголовок плана из markdown и прогресс N/M, кнопка Copy доступна всегда; решение по плану (одобрен/отклонён) переживает перезаход

0.8.25

17 сентября 2026

Fixed

  • Вход в большой тред: убран N+1 по журналу — раньше на каждый itemKey live-хвоста делалось по два SQL-запроса (на треде-«тяжеловесе» сотни запросов, ~1.4 с из ~1.5 с входа). Теперь журнал поднимается двумя запросами на чанк ключей (по 500), а лимит «не больше 400 дельт на ключ» режется в памяти; состав и порядок событий не меняются

Changed

  • Блоки ходов и live-хвост грузятся параллельно — время входа = максимум из двух, а не сумма; метрики FEED_BLOCKS blocksMs/liveMs в timeline показывают расклад

0.8.24

17 сентября 2026

Fixed

  • «Retry» при входе в тред больше не нужен вручную: если сверка не удалась, вход повторяется сам (3 попытки с паузой 3/6/9 с, пока экран в ошибке), в баннере честная причина («No connection — retrying…» вместо общей ошибки), в timeline — маркер OPEN_RETRY. Кнопка Retry сбрасывает счётчик
  • Сбой досинка списка тредов стирал список: пустой ответ thread/list затирал все треды на экране — теперь список остаётся, а если досинк не отвечает 3 цикла подряд (≈60 с), статусы «Working» в списке показываются подозрительными (иконка), а не вечным спиннером

Changed

  • Вход в тред: меньше декода на первом кадре — фаза 1 читает ~400 элементов хвоста (было ~600), остальное добирает фоновая гидрация; в timeline добавлены суб-метрики FEED_BLOCKS blocksMs/liveMs/buildMs и LIVE_TAIL load/reduce, чтобы видеть, где именно уходит время входа
  • Кап полного списка ленты — FEED_CAP = 6000: режется только префикс выше видимого окна (лента не дёргается), маркер FEED_TRIM в timeline
  • Правка сообщения в очереди — тап по тексту полоски открывает диалог; серверный элемент правится через thread/queue/update (скиллы сохраняются), локальный буфер — на месте. Диагностика: маркер QUEUE_UPDATE

Added

  • Команда моста codex_compact — ручной компакт контекста треда из bridge.sh tcompact (то же, что «Сжать» в меню)
  • Token info · Thread · compactions — число компактов в загруженной ленте
  • codex_order_check · dupUserTexts — проба дублей user-сообщений (симптом «при перезаходе вижу два своих сообщения подряд»)

0.8.23

17 сентября 2026

Fixed

  • Пропадающие live-сообщения: завершение элемента и дельты искали карточку только в видимом окне ленты — если элемент оказывался вне окна (или его вытесняла пересборка из блоков/полного Turn), событие терялось: «пришло, но не видно, пока не перезайдёшь». Теперь апдейт ищет элемент и в полном списке, завершение восстанавливает карточку нужного вида (ответ, мысль, план, файлы, неизвестный тип), а пересборка ленты из блоков не выбрасывает карточки, которых нет в новой сборке (preserved в FEED_BLOCKS)
  • План исчезал после материализации хода: карточка turn/plan/updated не считалась локальной и не переносилась в блок хода — «план появился и исчез, пришлось перезайти, чтобы одобрить». План теперь часть блока (как вопрос и сводка), привязывается к серверному turnId и переживает пересборку
  • План рождался свёрнутым и сворачивался после одобрения — свёрнутая блеклая строка была незаметна. Карточка плана раскрыта по умолчанию, сворачивается только тапом, бейдж «Done» показывается лишь когда шаги действительно закрыты

Changed

  • План рендерится markdown-вьюером (тем же, что обычные сообщения агента): текст-пояснение от сервера больше не пересобирается вручную в «1. … (ожидает)», шаги остаются компактным чек-листом под текстом

0.8.22

17 сентября 2026

Fixed

  • Карточка дифа жила под общим id diff-current: у каждого хода свой див, но LazyColumn-ключ совпадал, и при двух ходах с правками дедуп выбрасывал карточку старого хода (на живом треде это ловится пробой codex_order_check как dupIds). Теперь id карточки — по ходу (diff-<turnId>), а для старых записей из Room сборка ленты оставляет у хода только последнюю карточку дифа

0.8.21

17 сентября 2026

Fixed

  • Порядок элементов активного хода после перезахода: лента сортировалась по «последнему известному времени» — у live-событий (команды, мысли) поля time в кадре нет, а у локальных карточек есть, поэтому сводка «Done» всплывала не на своё место, а серверное эхо с задержкой уводило реплику вниз хода. Теперь порядок — по времени первого появления элемента (минимум из времени карточки и времени первой записи в журнале), а дедуп копий держит позицию первой копии (содержимое — свежее)
  • Один ход — непрерывный отрезок ленты: если элементы хода «разъехались» (живой хвост активного хода, поздняя сводка), сборка ленты возвращает их в свой ход; факт правки виден маркером ORDER_REPAIR
  • Слот-маппинг синтетических item-N больше не привязывает живое событие к k-й карточке вида (при перезаходе счётчик сбрасывался и контент ложился в чужую карточку): подстановка идёт только когда кандидат ровно один

Changed

  • Итог хода — одна карточка: у хода с правками вместо двух строк подряд («Turn changes» + «Done · 15s») одна шапка «Done · 15s · 3 cmds · 2 changed» со статистикой «+N −M»; тап раскрывает превью дифа. У ходов без правок строка «Done» остаётся как была

Added

  • Команда дебаг-моста codex_order_check {threadId?} — проверяет инварианты ленты (непрерывность ходов, уникальность id, порядок активного хода по журналу) и пишет маркер ORDER_CHECK; маркеры ORDER_REPAIR, ORDER_CHECK

0.8.20

17 сентября 2026

Fixed

  • Двойные user-сообщения при перезаходе: в журнале под одной репликой лежали две записи — оптимистичная копия (u-…, снапшот) и серверное эхо (started/completed под серверным id), — и лента показывала обе. Тождество user-элемента теперь всегда clientId (reducer, дедуп по точным ключам, commitItems), строки-эхо вычищаются из WAL вместе с блоком хода
  • Плашка Retry и info-сообщения больше не переносятся в другой тред при переключении (состояния треда, а не экрана)

Changed

  • Быстрый вход в большой тред: фаза 1 читает хвост блоков «до 600 элементов, максимум 12 блоков» (было фиксированные 60), страница ходов на входе — 8 ходов (было 20), ингест страницы пишется одной транзакцией (upsertAll) и одним проходом парсера
  • Плавный скролл вверх: «показать старые» сначала поднимает блоки из Room (маркер OLDER_LOCAL, сеть не трогается), остальное до HYDRATE_BLOCKS добирает фоновая гидрация после входа; hasOlder учитывает неподнятые блоки

Added

  • codex_state.uiUserIds — user-сообщения окна (id/clientId/ход) для проверки тождества через дебаг-мост; timeline-маркеры OLDER_LOCAL, HYDRATE

Removed

  • Мёртвый deprecated вызов thread/read {includeTurns:true} в клиенте

0.8.19

17 сентября 2026

Fixed

  • Цель треда (goal) не теряется при перезаходе: при открытии треда снапшот из кэша показывается сразу (офлайн), затем сервер сверяется запросом thread/goal/get; ответ не перетирает более свежую нотификацию. Очистка цели (thread/goal/cleared) пишет tombstone — старая цель не воскресает

Changed

  • Чистка мёртвого кода прежней склейки ленты: CodexFeedMerge удалён, живые ключи тождества (feedKeys/feedKind/fingerprint) — в CodexFeedKeys.kt, dedupeItems — к reducer'у; тесты приведены к живой части
  • docs/tech/codex-cache.md переписан под модель «блоки ходов + WAL активного хода» (DB v8), docs/tech/codex-turn-blocks.md — итог этапов 3–4 и ограничение по диффу холодных ходов

Added

  • codex_state отдаёт поле goal (приёмка цели через дебаг-мост)

0.8.18

17 сентября 2026

Fixed

  • «Показать старые» больше не тратит нажатие впустую: курсор страниц может отставать от уже загруженных блоков (вход грузит 20 ходов, догрузка — по 3). Теперь за одно нажатие догоняем до 4 страниц, пока не появится новый ход; в dump_timeline это видно маркером OLDER_FETCH (pages/changed/cursor)

0.8.17

17 сентября 2026

Fixed

  • Экран обновлений на dev: MapDto и EnvDeployStatusDto были без @Serializable, но десериализовались — статусы сборки/деплоя/свопа падали в «parse error» (отсюда пустые и подвисшие статусы установки)
  • Догрузка вверх была слишком тяжёлой: страница thread/turns/list тянула 20 полных ходов (~3.3 МБ JSON, 226 мс) — теперь OLDER_PAGE_TURNS=3 (~350–500 КБ, ~65 мс) при том же каноническом порядке элементов

Added

  • codex_feed_dump теперь реально пишет дамп ленты в файловый лог (края окна first/last + счётчики) — тумблер переживает перезапуск приложения
  • Кольцевой буфер dump_timeline 500 → 2000 событий: маркеры входа/перезахода больше не вытесняются стримом активного хода

0.8.16

17 сентября 2026

Added

  • Turn-based лента (ядро): ход — атомарный блок. Полный Turn из turn/started/turn/completed (все элементы, настоящие id) сохраняется в turn_blocks и заменяет ход в ленте целиком — без склейки источников
  • Страница сервера кладётся в блоки, а не мержится с кэшем: thread/turns/list (full) ингестится по turnId; активный ход пропускается (его состав ведёт live-слой), завершённые — канонический источник
  • Анкер скролла по ключу: при смене состава ленты вид возвращается к тому же элементу, а не к тому же индексу — лента не прыгает
  • turn_blocks (Room, DB v8): материализованный состав хода; журнал stream_events остаётся WAL активного хода и чистится при финализации

Changed

  • Порядок ленты: блоки по времени старта хода + живой хвост активного хода; локальные карточки (вопрос, сводка, дифф, Info) вставляются в блок детерминированно (вопрос — после user-сообщения, сводка — в конец)
  • Ид user-сообщения нормализуется по серверному clientId (эхо clientUserMessageId) — ключ элемента больше не «переезжает» при материализации
  • Мгновенный слой входа: последние 60 ходов-блоков + живой ход из журнала

0.8.15

16 сентября 2026

Fixed

  • Сводка хода больше не появляется посреди активного хода: страница сервера давала «Done» для незавершённого хода, и он же служил границей вставки кэшевых элементов — «сироты» сваливались в середину хода (куча мыслей, «порядок вообще разный»)
  • Элементы стрима склеиваются со страницей по началу текста: у незавершённого хода страница отдаёт синтетические id, из-за чего копия кэша оставалась дублем — лента росла при каждом перезаходе и чат подтормаживал
  • Точное время события вместо времени начала хода: по времени расставляются вставки и сортируется мгновенный слой кэша — грубая метка ломала порядок
  • Статус «работает» не теряет id хода, когда открыт другой тред

Changed

  • Чекпоинт хода (0.8.14): факт завершения хода переживает перезапуск приложения, «Working» и таймер восстанавливаются до ответа сервера

0.8.14

16 сентября 2026

Added

  • Чекпоинт треда: состояние хода (статус, activeTurnId, время старта, последний завершённый ход) хранится в отдельной таблице и применяется при входе в тред до сети — «Working» и таймер видны сразу, в том числе офлайн
  • Факт завершения хода переживает рестарт приложения: страница сервера больше не воскрешает закрытый ход после перезапуска

Fixed

  • Текст ответа не «укорачивается» при перезаходе в стримящийся тред: страница сервера снимается раньше последних дельт — теперь живые данные (трогавшие элемент после начала входа) приоритетнее серверной копии
  • Отложенные дельты не теряются: дельты элемента, которого ещё нет в ленте, до-применяются после установки окна, а на завершённых элементах не задваивают текст
  • Мёртвый ход не висит вечным спиннером офлайн: чекпоинт старше 10 минут без ответа сервера показывается как «подозрительный», а не «работает»

0.8.13

16 сентября 2026

Fixed

  • «Done» больше не всплывает при входе в тред: снапшоты (сводка хода, план, вопрос, user-сообщение) обновляются в журнале событий на месте, а не delete+insert — строка не получает новый seq и не уезжает в конец журнала. Раньше после перезапуска приложения каждое открытие треда перезаписывало снапшоты в хвост, и мгновенная лента (первая фаза входа) показывала пачку «Done» внизу, пока склейка со страницей сервера не расставляла их по ходам
  • Мгновенная лента восстанавливается по времени элемента: orderFeedByTime сортирует элементы reducer'а по time (фолбэк — время первой записи ключа в журнале), поэтому даже уже «разъехавшийся» кэш показывается в правильном порядке ещё до прихода серверной страницы

Changed

  • Прогресс входа в тред — в working bar: отдельная анимированная полоса под токен-баром убрана; «opening thread…» показывает ту же полоску прогресса в рабочей строке, что и ход

0.8.12

16 сентября 2026

Fixed

  • «Done» больше не всплывает где попало: сводка хода и карточка «Turn changes» получили turnId и встают последними элементами блока своего хода. Раньше копия, которой нет на серверной странице (ход-компакт, пустая watchdog-финализация), уезжала в самый хвост ленты — «Done» от старых ходов показывался после свежих сообщений и рядом с чужими сводками
  • Ходов-компактов и пустых ходов в сводках больше нет: сводка создаётся только у хода с работой (мысли/команды/чтения/правки) или у failed/interrupted — единое правило для live-финализации и серверной истории, поэтому «сирот» не остаётся вовсе. У компакта своя строка «Context compacted»
  • Склейка сводки не теряет данные: mergeFeedData для TurnSummary больше не отдаёт серверную копию целиком — токены, длительность и статус берутся из наиболее полной копии

Changed

  • Сводка хода — компактная строка: вместо большой карточки с плашкой «Done» — тонкая строка-разделитель «✓ Done · 1m 42s · 12 cmds · 83k tok» в стиле «Context compacted»; тап раскрывает детали (время мыслей/команд, чтения, правки, ошибку), failed/interrupted подсвечиваются цветом

Debug

  • Команда моста codex_feed_older (+ scripts/bridge.sh older) — догрузка страницы самых старых ходов без ручного скролла: проверка ветки start==0

0.8.11

16 сентября 2026

Fixed

  • История больше не теряет середину: окно ленты стало непрерывным суффиксом полного списка (items == full[windowStart, full.size)), а «показать старые» только сдвигает его начало. Раньше при числе ходов больше страницы (20) после догрузки вверх в ленте оставались лишь самые старые ходы и последние ~300 элементов — середина истории была недостижима, а windowStartPosition уезжал на страницу назад (пропуск элементов при следующей догрузке)
  • Старые страницы склеиваются с кэшем: догрузка вверх идёт тем же mergeFeed, что и вход, — команды, планы и живые копии журнала встают внутрь блока своего хода, а не теряются

Performance

  • Вход в тред больше не «прыгает»: убран лишний программный скролл на приходе серверной страницы, а id элементов не меняется между мгновенным кэш-слоем и страницей (mergeFeedData сохраняет id кэшевой копии) — карточки LazyColumn не пересоздаются, лента не мигает и не прокручивается к хвосту
  • Диагностика окна в timeline: FEED_WINDOW (полный список / начало окна / курсор) и FEED_SWAP (сколько ключей кэш-слоя пережило серверную страницу)

0.8.10

16 сентября 2026

Fixed

  • Отмена корутины больше не считается сбоем кэша: при переключении треда или пересоздании экрана Job отменяется, и прежняя проверка ошибок принимала это за «append failed» — после пяти таких отмен брейкер выключал запись кэша на ровном месте (cacheBroken в codex_state). Теперь отмена пробрасывается дальше, а несохранённые дельты при этом возвращаются в накопитель

0.8.9

16 сентября 2026

Fixed

  • Локальный кэш больше не «умирает» после обновления: миграция схемы на старых базах падала на дублях снапшотов (UNIQUE constraint failed: stream_events...) — база переставала открываться вообще, в лог каждые полсекунды лилось codex: event append failed, cache_dump отвечал той же ошибкой, дельты стрима терялись. Теперь миграция сначала схлопывает дубли (оставляя новейшую строку — ровно ту, что выбирает reducer), снимает старые имена индексов и только потом создаёт уникальный; тот же SQL выполняет ChatCacheDoctor, а открытие базы при ошибке само лечится ремонтом схемы и пересозданием Room
  • Кэш переживает обновление приложения: убрана полная очистка кэша на каждый новый versionCode — после установки обновления тред открывается из локальной истории, а не с нуля
  • Дельты одного элемента не теряются: ordinal в пачке инкрементируется на ключ; раньше две дельты одного элемента с разными полями получали один и тот же ordinal, и вторая молча отбрасывалась уникальным индексом
  • Сбой записи не флудит и не копит ошибки: несохранённые куски дельт возвращаются в накопитель (разовый сбой IO текст не теряет), после 5 ошибок подряд запись выключается одной строкой в логе — в codex_state видно cacheBroken/cacheFailures
  • Заменены устаревшие fallbackToDestructiveMigration()/…OnDowngrade() на явные варианты с dropAllTables = true; из схемы убраны мёртвые таблицы messages, codex_messages, codex_messages_old (база v6), удалён мёртвый код старого кэша

Performance

  • Вход в длинный тред: лента восстанавливается без чтения всех дельт — не-дельты (started/completed/snapshot) читаются целиком, дельты — не больше 400 новейших на элемент (было: полная выборка всех тысяч строк ключа)
  • Ретеншен кэша: раз в час журнал обрезается (20 000 строк на тред, 200 000 суммарно, граница не режет элемент посередине), раз в неделю — VACUUM + чекпойнт WAL; раньше база росла неограниченно

Diagnostics

  • Новые команды моста: cache_doctor [repair] — состояние схемы (индексы, дубли, размер, user_version) и ремонт без пересборки, cache_compact; codex_state отдаёт здоровье кэша; в scripts/bridge.sh — doctor [repair] и compact; разбор механики — docs/tech/codex-cache.md

0.8.8

16 сентября 2026

Performance

  • Скролл ленты больше не дёргается: разбор markdown ушёл с главного потока — NewMarkdownView берёт готовый разбор из кеша (возврат по ленте — мгновенно), а новый текст парсится в фоне, пока показывается предыдущий кадр. Раньше на каждый показ карточки markdown парсился синхронно (замер: ~5 мс на 8.6 КБ на JVM, на телефоне в разы больше), а LazyColumn при скролле пересобирает уехавшие элементы — флинг превращался в слайд-шоу
  • Один разбор на сообщение вместо трёх: plainText и tablesAsCsv больше не парсят markdown заново (общий кеш DocumentParseCache) — 5 мс → 1 мс и 5 мс → 0 мс на сообщении-образце
  • Копирование не тормозит ленту: plain-текст и CSV таблиц считаются только при открытом меню действий, а не на каждую отрисовку карточки (~10 мс на сообщение)
  • Карточки стали skippable: CodexChatItem помечен @Immutable (все поля только читаются, коллекции заменяются целиком), лямбды действий вынесены в remember, у списка появился contentType — при батче стрима Compose больше не перекомпоновывает все видимые карточки
  • Меньше фоновых анимаций: бесконечное вращение иконок создаётся только у выполняющихся карточек (было — у всех, включая завершённые), тик таймера длительности — 250 мс вместо 100 мс
  • extractCodeBlocks не запускает регекс без блоков кода и кеширует результат
  • Диагностика: метка PARSE_SLOW в timeline для разборов дольше 8 мс

0.8.7

16 сентября 2026

Performance

  • Вход в большой тред ускорен: журнал событий больше не раздувается — стрим-дельты копятся в памяти и пишутся пачками (≤2 раза/сек на элемент) вместо транзакции на каждый чанк, а на item/completed хвост дельт вообще не пишется (финальный текст уже есть в completed-событии). На треде-примере было ~7000 delta-строк на один ход из ~7800 всех строк журнала
  • Индексы журнала событий: (threadId, seq) и (threadId, itemKey, kind, ordinal) — и на чистой установке, и миграцией (Room v5). Чтение хвоста треда при перезаходе перестаёт сканировать таблицу
  • Сверка снапшотов с кешем без шторма записей: при addItem пишутся только изменившиеся снапшоты (дифф по подписи) и с debounce 1 с; в конце хода, при сбросе ViewModel и для карточек вопроса — немедленно. Раньше каждая правка переписывала все снапшоты ленты (585 строк) целиком
  • Конец хода без фризов: MD-отчёт хода собирается и пишется вне main-потока (было — синхронно в конце каждого хода), буфер дельт сбрасывается в журнал сразу при финализации хода
  • Диагностика входа в тред: метки ENTER_BEGIN → ENTRY_CACHE → THREAD_OPEN с временами (чтение кеша, страница сервера, общий итог) — видно, что именно тормозит на конкретном треде
  • Timeline не тонет в записях кеша: CACHE_WRITE агрегируется (rows=N:calls=M вместо строки на каждую запись), полезные метки (PAGE_OK, PARSE_OK, THREAD_OPEN) не вытесняются из кольцевого буфера

0.8.6

16 сентября 2026

Fixed

  • «Compacting context» больше не появляется на обычных ходах: удалена эвристика «20 секунд тишины = компакт» — она ложно срабатывала почти в каждом медленном ходе (compaction guessed … cancelled в логе). Единственные источники индикации — item/started|completed с типом contextCompaction и устаревшая нотификация thread/compacted; у компакта свой таймер (startedAtMs), а не время хода
  • Строка компакта в ленте — на всю ширину и по-английски: вместо узкой вставки «[context compaction: контекст сжат]» (48dp, tertiary) рисуется строка-разделитель «Context compacted · 15s» с волосяными линиями; вставка не дублируется при перезаходе (склейка страницы и live-копии по ключу «ход + compaction»)
  • Длительность компакта: live — из startedAtMs/completedAtMs item-нотификаций, после перезахода — из времён одиночного компакт-хода истории (обычно 10–30 с). Завершённый live-компакт добавляется в ленту сразу, не дожидаясь перезапроса истории
  • Токен-бар показывает честные цифры: «Context 19% used · 188k/996k», цвет по проценту использования (primary <70 %, tertiary 70–90 %, error ≥90 %). Убран выдуманный фолбэк окна 128k: без окна модели бар не рисуется (цифры остаются в Token info)
  • Метрики контекста переживают перезаход: последний ContextUsage треда сохраняется и поднимается при открытии; после компакта сбрасывается — бар ждёт свежий thread/tokenUsage/updated, а не показывает устаревшее число

0.8.5

16 сентября 2026

Fixed

  • Сообщения больше не «уезжают» вниз при перезаходе в тред: склейка ленты переписана на один модуль (CodexFeedMerge): порядок задаёт серверная страница, копии одного элемента склеиваются по clientId/настоящему id и по семантике (ход+вид+отпечаток), а несматченные элементы встают внутрь блока своего хода — раньше они приклеивались в конец (у всех элементов страницы одинаковый time = turnStart, поэтому «вставка по времени» уезжала в хвост). Удалён костыль restoreCurrentUserText, дубли user-сообщений (локальная копия + эхо + страница) больше не рисуются дважды
  • Журнал событий хранит своё сообщение пользователя: локальная копия пишется снапшотом с clientId (и turnId после ответа turn/start) — мгновенный слой при входе в тред сразу показывает сообщение на своём месте, в том числе оффлайн; снапшоты в журнале теперь перезаписываются (состояние карточки вопроса/плана доезжает до кэша)
  • Сборка больше не стоит 10 минут на каждую итерацию: метка версии (app/version-stamp.properties) стала стабильной в пределах суток и файл не перезаписывается, если он уже на сегодня — Gradle переиспользует configuration cache и инкрементальную компиляцию (повторная debug-сборка: 2 с вместо полного ребилда). Минутная метка осталась только для публикации (deploy.sh → Y83_STAMP=minute), heap-дампы при OOM отключены (-XX:-HeapDumpOnOutOfMemoryError — раньше писались файлы по 830 МБ и добивали свап), а в docs/tech/dev-workflow.md зафиксировано правило «ворота до сборки APK»
  • Диагностика ленты: тяжёлые дампы RAW/MERGED при открытии треда пишутся только под флагом (codex_feed_dump / алиас feed_dump), лог не пухнет на больших тредах : git теперь выполняется на сервере по SSH (POST /api/v1/git с полем server), а не локальным git на телефоне — раньше cwd=/var/www/... давал «not a git repository», и закоммитить изменения было невозможно. Экран Git показывает цель (локально / user@host:путь)
  • Git identity на сервере: setup ставит user.name/user.email, если их нет — без них любой коммит падал с «Author identity unknown»
  • Dev-машина больше не откатывается: setup.sh не трогает backend при наличии маркера ~/.y83/dev-machine и не понижает версию (guard сравнивает ws-backend --version с прод-манифестом); принудительно — Y83_FORCE_BACKEND=1
  • Один супервизор: supervisord управляет только ws-backend и opencode, codex app-server поднимает svreg (раньше дублировали друг друга и входили в FATAL); boot/watchdog/recover больше не плодят вторые экземпляры
  • Скрипты: шебанги #!/usr/bin/env bash заменены на Termux-путь — на телефоне такие скрипты не запускались вовсе (ворота gate.sh падали на skills-sync и kotlin-compile)

Added

  • Кнопка «Создать репозиторий (git init)» в Git-экране для папки без репозитория: git init + базовый .gitignore (локально и на сервере)
  • POST /api/v1/remote/write — атомарная запись небольших файлов на сервере (только внутри /var/www, /home, /srv, /opt, лимит 256 КБ)
  • Backend: релизы с откатом — ~/.y83-ws/backend/releases/<ver>-<ts> + симлинк current, scripts/swap-backend.sh делает smoke-test → switch → restart → health

0.8.4

15 сентября 2026

Added

  • Codex-чат: очередь сообщений переведена на серверную (thread/queue/…) — отправленное во время хода сообщение переживает перезаход в тред, переключение треда и закрытие приложения; «Send now» ставит его первым (reorder + прерывание хода), «Cancel» убирает его из очереди на сервере
  • Remote agents: имена проектов и папок проверяются единым правилом (в файловом менеджере раньше проверялось только «не пусто») — диалог показывает причину отказа
  • Remote agents: ошибка создания папки на сервере теперь видна в диалоге (раньше два экрана молча игнорировали ответ)

Changed

  • Codex-чат: единый вид экшен-полосок — одобрение плана и очередь сообщений рисуются одним компонентом (иконка + текст слева, кнопки справа) и стоят одним стеком над статус-строкой
  • Инженерный контур: scripts/gate.sh — единые ворота (gofmt, go vet, go test, компиляция Kotlin, unit-тесты, синк скиллов); «готово» подтверждается выводом
  • Проверка Kotlin-кода ускорена с ~3 минут до ~2 секунд: генерируемый BuildConfig больше не переписывается каждой сборкой, версия приложения читается из установленного APK (util/AppVersion)
  • Итерационные сборки — debug-режим (/env/build {"mode":"debug"}, ~46с, та же подпись, ставится поверх); release остаётся для версий и публикации
  • Скиллы агента синхронизируются из репы (scripts/sync-skills.sh)

Fixed

  • Codex-чат: очередь больше не «зависает» — если сервер не запустил сообщение после хода (сбой или прерывание), клиент поднимает её сам; без связи сообщение ждёт в локальном буфере (метка «not sent») и уходит в очередь при реконнекте, повторная отправка исключена
  • Remote agents: путь проекта больше не собирается с двойным слэшем (/var/www//ggg)
  • Remote agents: статус туннеля не показывает устаревшую ошибку при ready
  • Backend: 5 тестов internal/handlers/mcp падали на Termux (whitelist знал только /tmp) — временный каталог берётся из os.TempDir()
  • Backend: утечка context при перезапуске процессов сервисов (go vet)