hermes-hub/agents/inbox/2026-09-01-A56-context-compression.md
Hermes Team 8b67f0dadb docs(agents): вернуть в репозиторий постановки A42-A56 и отчёт A30
Тринадцать файлов существовали только на диске ПК владельца, в рабочей
копии, отставшей от origin/main на 122 коммита. Их реализация и тесты
давно влиты: tests/test_a42_provider_connect.py,
test_a49_subagents_skills_memory.py, test_a51_hub_controls_hermes.py,
test_a52_local_models_supervisor_dual.py, test_a55_account_connection.py,
test_a56_context_compression.py и другие. Постановок, объясняющих, что
эти тесты обязаны доказывать, в репозитории не было.

Правило записано в agents/AGENTS.md: задание живёт в репозитории, а не в
переписке и не в личных папках на диске.

A48, A50 и A54 не переносятся: они уже есть на origin под другими именами,
содержимое совпадает с точностью до перевода строки в конце файла.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 18:16:35 +07:00

141 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Задание 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`.