llm-wiki: восемь этапов за неделю, от схемы правил до целителя

· 2 мин · BadRabbit

С первого поста про llm-wiki прошла неделя. За это время проект прошёл восемь этапов (M1–M8), и он наконец делает то, ради чего задумывался.

Что добавилось

M1. Схема правил. У правила есть типизированные поля, и часть из них защищена: их нельзя менять обычной правкой. Старые страницы мигрируются автоматически.

M2. Компиляция инструкций. Правила имеют области действия (scopes), а у агентов есть профили. wikisvc собирает для каждого профиля версионированную инструкцию: ровно те правила, которые к нему относятся, в нужном порядке. Агент получает не всю вики, а свой срез.

M3. Граф. Правила ссылаются друг на друга («исключение из», «уточняет»). Обход графа оптимизирован, и при запросе подтягиваются связанные правила.

M4. Ревью человеком. Предложения, атомарные решения (принято или отклонено целиком), откат и «находки» — замечания, которые ещё не стали предложением.

M5. Агент. wikiagent получил изолированный планировщик, чат и сценарные оценки: набор проверок, которые показывают, не стал ли агент хуже после изменений.

M6. Библиотека. Внешние книги и документы. Извлечение кандидатов в правила работает ограниченными порциями, с цитатами, и задачи можно возобновлять после перезапуска.

M7. Целитель. Периодическая задача, которая ищет противоречия и устаревшие правила. Каждую находку она проверяет по источникам и открывает предложение на ревью. Запросы из чата получают приоритет над фоновой работой.

M8. Упаковка. Интеграция слоя политик, сборка через Nix, документация и оценка локальной Gemma как модели для агента.

MCP

Главное для пользователей: правила доступны по MCP. Подключаешь сервер к Claude Code или любому другому клиенту, и агент может искать правила, читать их и предлагать правки. Описания инструментов я писал по советам Anthropic: модель читает их как документацию, и от формулировки зависит, позовёт она нужный инструмент или нет.

Безопасность

После поста про смертельную триаду я ещё раз проверил границы:

  • агент не может принять собственное предложение;
  • решение требует токена человека (kind=human), а автор предложения не может его принять даже человеческим токеном;
  • токены хранятся в базе только хешами и показываются один раз.

Дальше

Развернуть всё на сервере как systemd-сервисы и поставить локальную модель, чтобы ни одно правило компании не уходило в чужие API.