# Задание A56: сжатие контекста — компрессор должен начать работать ## Дата поступления 2026-09-01 ## База `origin/main` (`26f7d2c`). ``` git fetch origin --prune git checkout -b antigravity/a56-context-compression origin/main ``` В `main` напрямую не пушить. ## Порядок исполнения Два прохода: **Flash** реализует, **Pro** проводит аудит. Пункт **P0-6** написан для аудитора. Зона: надзиратель локальных моделей и локальный адаптер. С A55 (подключение аккаунтов) не пересекается. --- ## Задача На сервере владельца работает вторая локальная модель, называемая компрессором. Ревьюер проверил код: **в хабе нет ни одной строки, которая бы к ней обращалась для сжатия**. Порт 8082 упоминается ровно один раз — в списке адресов для обнаружения локальных серверов. Надзиратель из A52 умеет резать задачу на куски по смысловым границам, и это работает. Но накопленный контекст между кусками никто не сжимает, и модель простаивает. ## Что проверено ревьюером на живом сервере — заново не мерить Настройка после переделки раскладки: ``` кодер Qwen3-Coder-30B-A3B порт 8081 -c 229376 30 008 МиБ 107,4 ток/с компрессор Qwen3-4B-2507 порт 8082 -c 32768 на CPU, -ngl 0 -t 32 604 МиБ видеопамяти свободно на карте: 2 152 МиБ из 32 768 ``` **Скорость компрессора на процессоре измерена на настоящем промпте:** ``` промпт 5068 токенов → 853,9 ток/с генерация → 5,4 ток/с ``` То есть сжать 32 тысячи токенов — около 38 секунд чтения плюс несколько секунд на сводку. Чтение быстрое, генерация медленная; для сжатия это удачное сочетание, потому что на выходе короткий текст. **Качество сжатия у этой модели замерено в A52: 100%** — сохраняет порты, адреса, контрольные суммы. Проверено ревьюером повторно: в ответе остались и адрес сервера, и оба порта, и имя модели. **Родной контекст кодера — 262 144** по метаданным GGUF, поэтому 224К внутри предела. **Обёртка над llama-server удалена**, юниты описывают действительность. Подменять бинарник больше нельзя: настройки задаются юнитом. --- ## P0-1. Компрессор становится настраиваемой ролью 1. **Отдельная роль или настройка профиля** — «модель для сжатия контекста». Владелец выбирает её в интерфейсе из подключённых локальных профилей. 2. **Адрес берётся из профиля**, а не зашивается. Порт 8082 сегодняшний, завтра другой. 3. **Компрессор не участвует в маршрутизации Hermes.** Это служебная роль: она не должна попадать в цепочки ролей и не обязана проходить порог в 64К. Если владелец захочет — назначит её явно, но по умолчанию нет. 4. **Компрессор не настроен — сжатие не выполняется**, и это нормальное состояние. Показывать `Н/Д: модель для сжатия не выбрана`, а не ошибку. ## P0-2. Когда сжимать 1. **Порог по заполнению контекста**, а не по числу сообщений. Предел берётся у сервера через `/props`, размер накопленного — через `/tokenize`; оба механизма уже есть в надзирателе после A52. 2. **Значение порога настраивается**, умолчание обосновать. Разумно начинать сжатие, когда занято около трёх четвертей. 3. **Сжимать самое старое**, оставляя свежее нетронутым: последние сообщения нужны модели дословно. 4. **Не сжимать то, что уже сжато.** Повторное сжатие сводки теряет факты и делает это незаметно. ## P0-3. Что сохранять обязательно Главное требование к качеству, и оно проверяемое. Сводка обязана сохранять **дословно**: пути к файлам, адреса и порты, имена функций и переменных, контрольные суммы, номера версий и коммитов, точные значения из замеров. 1. **Проверять это тестом**: подать текст с известными значениями и убедиться, что они в сводке остались. 2. **Потеря факта — дефект**, а не приемлемая цена сжатия. Модель на этой задаче даёт 100%, значит планка достижима. 3. **Указывать степень сжатия**: было столько токенов, стало столько. ## P0-4. Видно, что происходит 1. **Показывать факт сжатия** владельцу: когда, сколько токенов было и стало, сколько заняло. 2. **Хранить исходный текст** до конца задачи, чтобы можно было вернуться, если сводка потеряла нужное. 3. **Сжатие не должно идти молча**: 38 секунд тишины владелец воспримет как зависание. 4. **Ошибка сжатия не роняет задачу.** Компрессор не ответил — работаем с несжатым контекстом и говорим об этом, а не прекращаем работу. ## P0-5. Память о том, что сработало Продолжение линии A52. 1. Записывать в общую память (`/srv/projects/AI-Memory`): какой объём сжимался, во сколько раз, сколько заняло, сохранились ли факты. 2. Привязывать к **имени сборки GGUF**, а не к порту или имени профиля. 3. Использовать накопленное: начинать с размера куска, который уже давал хороший результат. ## P0-6. Аудит вторым проходом 1. **Проверить на живом сервере**, а не заглушкой: подать текст больше порога и убедиться, что сжатие произошло и факты уцелели. 2. **Проверить сохранение дословных значений** — пути, порты, суммы. Это главный критерий. 3. **Проверить, что компрессор не попал в маршрутизацию** Hermes и не мешает выбору моделей. 4. **Проверить поведение при недоступном компрессоре**: задача продолжается на несжатом контексте. 5. **Убедиться, что предел контекста и счёт токенов берутся у сервера**, а не из умолчаний. 6. **Побочные изменения** объяснить. 7. **Пропущенный пункт назвать пропущенным.** --- ## Ограничения - Юниты владельца не править: обёртку над `llama-server` только что убрали, подменять бинарник запрещено. - Службы `qwen-coder` и `qwen-compressor` возвращать в рабочее состояние после проверок. - Адреса и порты в код не зашивать. - Учётные данные и `~/.hermes/agy_profiles/` не трогать. - Версию `0.1.2` не понижать. - Правило честности без исключений: неизмеренное — `Н/Д` с причиной, потерянный факт — дефект. ## Критерии приёмки 1. Ветка в `origin`, `git status` чист. 2. Модель для сжатия выбирается в интерфейсе; адрес берётся из профиля. 3. Компрессор не участвует в маршрутизации Hermes по умолчанию. 4. Порог сжатия считается от предела контекста, взятого через `/props`, и объёма, посчитанного через `/tokenize`. 5. Сжимается старое, свежее остаётся дословным; повторное сжатие сводки не выполняется. 6. Тест на сохранение дословных значений проходит: пути, порты, контрольные суммы, номера версий. 7. Владелец видит факт и степень сжатия; исходный текст сохраняется до конца задачи. 8. Недоступный компрессор не роняет задачу. 9. Опыт записан в общую память с привязкой к имени сборки GGUF. 10. Проверено на живом сервере, вывод приложен. 11. `ruff check .` чисто; релизный гейт 10/10; тестов не меньше **599**. 12. Отчёт: `START_HEAD`, `FINAL_HEAD`, `origin/main`, `git status`, `X passed / Y skipped / Z failed`. ## Главное Владелец держит на сервере вторую модель под сжатие контекста, освободил ради неё место и вынес её на процессор. Модель работает, отвечает и сжимает правильно — но в хабе нет кода, который бы её позвал. Задание закрывает разрыв между настроенным железом и неиспользуемой возможностью. Ключевое требование одно: **сводка не теряет фактов**. Модель на этой задаче даёт сто процентов, значит планка достижима, и снижать её нельзя — потерянный путь или порт всплывёт через два шага в виде необъяснимой ошибки. ## Порядок сдачи Передать точный `FINAL_COMMIT_SHA`.