Install
openclaw skills install @vnbochkarev-netizen/agent-context-dietКогда скиллы и заметки агента съедают контекст: замер, разрез, проверка.
openclaw skills install @vnbochkarev-netizen/agent-context-dietКласс задач: агент (Hermes, OpenClaw, любой CLI-агент) стал дорогим и «упирается в окно», а причина — не задачи, а собственные скиллы/заметки/инструкции. Этот скилл даёт замер, разрез и проверку. Три шага, все измеримые.
Дамп скилла приходит в контекст целиком и не сжимается: компрессор запросов трогает
прошлые сообщения (обычно только роль tool), а скилл попадает в запрос последним —
по устройству он вне сжатия. Дедупа тоже нет: дважды загруженный скилл — два полных дампа.
Единственный работающий рычаг — не пускать монолит в контекст: SKILL.md короткий,
тяжёлые разделы отдельными файлами и по требованию.
Три числа, которые всё решают:
skill_view
(Hermes) или wc -c по SKILL.md + его references.references/measurement-recipe.md.Наш случай (24 сентября 2026, по 109 запросам живого трафика): выводы инструментов — 88,2 % объёма запроса; медианный запрос 568 188 символов (среднее 510 260; часто цитируемые 465 743 — это ОДИН замер, а не медиана); тяжелейшие блоки — дампы скиллов 90–98 тыс. символов (~23–24 тыс. токенов); один и тот же скилл грузился до 10 раз за сессию; топ-14 сохранённых оригиналов в базе прокси = 1,42 млн символов. Точных повторов внутри одного запроса — 0 символов из 1,86 млн: дедуп внутри запроса на таком трафике ничего не даёт (обобщать на любой трафик нельзя — проверяйте своим замером). Токены по всему документу считаются одним коэффициентом — символы ÷ 4 (для русского текста реальный делитель меньше, то есть это нижняя оценка). Компакция сессии — наблюдение, а не измерение.
# каталог скиллов вашего агента (подставьте свой)
SKILLS_DIR="${SKILLS_DIR:-$HOME/.hermes/skills}"
# сухой прогон: покажет, что и куда уедет, ничего не меняя
python3 scripts/split_skills.py --root "$SKILLS_DIR"
# один скилл
python3 scripts/split_skills.py --root "$SKILLS_DIR" <категория>/<скилл> --apply
# все, что больше бюджета (по умолчанию 20 000 символов на файл инструкции)
python3 scripts/split_skills.py --root "$SKILLS_DIR" --apply
Как работает: frontmatter, вступление и ведущие разделы остаются в SKILL.md, пока суммарно
не упрутся в --budget (по умолчанию 20 000 символов); остальные разделы переносятся
дословно, пачками по --chunk (38 000 символов), в references/, а в SKILL.md
добавляется указатель. Ничего не переписывается и не выбрасывается — только переезжает.
Бэкапы исходников: каталог из --backup-dir (по умолчанию $HOME/.skill-split-backups).
python3 scripts/split_skills.py --root "$SKILLS_DIR" --verify-only
# → «mega-skill: OK: заголовков потеряно 0» по каждому скиллу
Важно: --verify-only читает бэкапы из каталога --backup-dir — указывайте его явно,
иначе проверять будет нечего (скрипт теперь сообщает об этом и возвращает код 2, а не молчит).
Скрипт сверяет все заголовки H2 исходника с суммой SKILL.md ∪ references и возвращает
ненулевой код, если хоть один заголовок потерян, — годится как гейт в CI. Дополнительно есть независимая сверка по строкам — scripts/check_split.py <бэкап> <каталог скилла>:
все непустые строки исходника должны найтись в сумме частей. Плюс регрессионные тесты самого
разрезателя: python3 scripts/test_split_skills.py (проверяют в том числе границу бюджета,
одинаковые заголовки и работу --verify-only как гейта). И обязательно живая загрузка: skill_view
(Hermes) или команда показа скилла (OpenClaw) должна отработать и показать новые файлы
в списке ссылок.
Единица — символы (len), не байты: в кириллице байт почти вдвое больше, и путаница
единиц уже один раз дала ложный вывод. В скобках — байты для сверки с wc -c.
| Скилл | Было, симв. (б) | Стало, симв. (б) | Эффект |
|---|---|---|---|
| tinvest-trading-bots | 99 982 (151 736) | 19 532 (29 582) | −80 % |
| vibo-runtime-pitfalls | 93 568 (137 698) | 20 381 (29 382) | −78 % |
| vibo-skillqa | 75 130 (109 451) | 19 317 (27 716) | −74 % |
| marketplace-publishing | 94 457 (109 314) | 20 432 (22 258) | −78 % |
| vibo-ops | 99 970 (104 825) | 20 173 (21 530) | −80 % |
| эти пять | 463 107 | 99 835 | −78 % |
| весь парк, 20 скиллов | 973,659 | 379,091 | −61 % |
Один дамп тяжёлого скилла: ~23–24 тыс. токенов → ~5 тыс. Типичная задача (2–3 скилла): 70–100 тыс. токенов → 12–15 тыс. Проверка: 0 потерянных заголовков на 20 скиллах.
references/, templates/, scripts/.references/, а в SKILL.md —
одну строку указателя.--backup-dir) и отличается по имени от самой инструкции.```) — не заголовки. Скрипт это учитывает; ручной
разрез по grep '^## ' — ломает (проверяйте себя независимой сверкой строк).BACKUP_DIR="${BACKUP_DIR:-$HOME/.skill-split-backups}"
cp "$BACKUP_DIR/<имя>.SKILL.md.bak-<дата>" <путь>/<имя>/SKILL.md # вернуть как было
rm -rf <путь>/<имя>/references/<новые-файлы> # убрать переехавшее
Отдавайте папку скилла целиком (инструкция + scripts/split_skills.py) — зависимостей нет,
нужен только Python 3.9+. Второму агенту: скопировать папку в его каталог скиллов, затем
прогнать --root <его каталог> сначала в сухом режиме и показать ему --verify-only после
записи. Людям: тот же артефакт + README.md с постановкой задачи и числами.