llm-wiki: восемь этапов за неделю, от схемы правил до целителя
С первого поста про 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.