Журнал решений
Каждое решение, принятое в ходе цикла самоэволюции, фиксируется в структурированном журнале решений. Этот журнал предоставляет полный аудиторский след: что решила система эволюции, почему она это решила и что произошло в результате -- обеспечивая ретроспективный анализ, отладку и безопасный откат.
Обзор
Журнал решений фиксирует полный жизненный цикл решений эволюции:
- Генерация предложения -- какое улучшение было предложено и почему
- Оценка -- как предложение было оценено по критериям безопасности и пригодности
- Вердикт -- было ли предложение одобрено, отклонено или отложено
- Выполнение -- какие изменения были применены и их непосредственные эффекты
- Результат -- измеренные результаты после изменения, включая любые регрессии
В отличие от журнала аудита безопасности (который фиксирует все события безопасности), журнал решений сфокусирован именно на процессе рассуждений системы самоэволюции.
Структура записи решения
Каждое решение хранится как структурированная запись:
| Поле | Тип | Описание |
|---|---|---|
decision_id | String | Уникальный идентификатор (UUIDv7, упорядоченный по времени) |
cycle_id | String | Цикл эволюции, породивший это решение |
layer | Layer | Уровень эволюции: L1 (память), L2 (промпт) или L3 (стратегия) |
timestamp | DateTime<Utc> | Время записи решения |
proposal | Proposal | Предложенное изменение (тип, описание, параметры) |
rationale | String | Обоснование предложения данного изменения |
data_points | usize | Количество выборок данных, информировавших решение |
fitness_before | f64 | Балл пригодности до изменения |
fitness_after | Option<f64> | Балл пригодности после изменения (заполняется после выполнения) |
verdict | Verdict | approved, rejected, deferred или auto_approved |
verdict_reason | String | Причина вердикта (напр., результат проверки безопасности) |
executed | bool | Было ли изменение фактически применено |
rollback_id | Option<String> | Ссылка на снимок отката, если он был создан |
outcome | Option<Outcome> | Результат после выполнения: improved, neutral, regressed или rolled_back |
Типы вердиктов
| Вердикт | Описание | Триггер |
|---|---|---|
auto_approved | Одобрено автоматически конвейером | Изменения L1 с баллом риска ниже порога |
approved | Одобрено после оценки | Изменения L2/L3, прошедшие проверки безопасности |
rejected | Отклонено конвейером безопасности | Неудача проверок корректности, слишком высокий риск или обнаружены конфликты |
deferred | Отложено для последующей оценки | Недостаточно данных или проблемы со здоровьем системы |
Конфигурация
[self_evolution.decision_log]
enabled = true
storage = "file" # "file" или "database"
path = "~/.local/share/openprx/decisions/"
format = "jsonl" # "jsonl" или "json" (с форматированием)
retention_days = 180 # автоудаление записей старше 180 дней
max_entries = 10000 # максимум записей до ротации
[self_evolution.decision_log.database]
backend = "sqlite"
path = "~/.local/share/openprx/decisions.db"Справочник конфигурации
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | true | Включить или отключить журналирование решений |
storage | String | "file" | Бэкенд хранения: "file" или "database" |
path | String | "~/.local/share/openprx/decisions/" | Каталог для файлов журнала (файловый режим) |
format | String | "jsonl" | Формат файла: "jsonl" (компактный) или "json" (читаемый) |
retention_days | u64 | 180 | Автоудаление записей старше N дней. 0 = хранить вечно |
max_entries | usize | 10000 | Максимум записей на файл до ротации |
database.backend | String | "sqlite" | Бэкенд базы данных: "sqlite" или "postgres" |
database.path | String | "" | Путь к базе данных (SQLite) или URL подключения (PostgreSQL) |
Пример записи решения
{
"decision_id": "019520b0-5678-7000-8000-000000000042",
"cycle_id": "cycle_2026-03-21T03:00:00Z",
"layer": "L2",
"timestamp": "2026-03-21T03:05:12.345Z",
"proposal": {
"type": "prompt_refinement",
"description": "Shorten system prompt preamble by 15% to reduce token usage",
"parameters": {
"target": "system_prompt.preamble",
"old_token_count": 320,
"new_token_count": 272
}
},
"rationale": "Analysis of 500 sessions shows the preamble consumes 8% of context window with low recall contribution. A/B test variant with shortened preamble showed 3% improvement in response relevance.",
"data_points": 500,
"fitness_before": 0.72,
"fitness_after": 0.75,
"verdict": "approved",
"verdict_reason": "Passed all safety checks. Risk score 0.12 (threshold: 0.5). No conflicts with existing policies.",
"executed": true,
"rollback_id": "snap_019520b0-5678-7000-8000-000000000043",
"outcome": "improved"
}Запросы к журналу решений
Команды CLI
# Просмотр последних решений
prx evolution decisions --tail 20
# Фильтрация по уровню
prx evolution decisions --layer L2 --last 30d
# Фильтрация по вердикту
prx evolution decisions --verdict rejected --last 7d
# Фильтрация по результату
prx evolution decisions --outcome regressed
# Показать конкретное решение с полными деталями
prx evolution decisions --id 019520b0-5678-7000-8000-000000000042
# Экспорт решений для анализа
prx evolution decisions --last 90d --format json > decisions_q1.jsonПрограммный доступ
Журнал решений доступен через API шлюза:
# Список последних решений
curl -H "Authorization: Bearer <token>" \
http://localhost:3120/api/v1/evolution/decisions?limit=20
# Получить конкретное решение
curl -H "Authorization: Bearer <token>" \
http://localhost:3120/api/v1/evolution/decisions/019520b0-5678-7000-8000-000000000042Анализ паттернов решений
Доля одобрений по уровням
Отслеживайте процент одобренных предложений на каждом уровне для оценки эффективности системы эволюции:
prx evolution stats --last 90dПример вывода:
Layer Proposed Approved Rejected Deferred Approval Rate
L1 142 138 2 2 97.2%
L2 28 19 6 3 67.9%
L3 5 2 3 0 40.0%Обнаружение регрессий
Выявление решений, приведших к регрессиям:
prx evolution decisions --outcome regressed --last 90dКаждое решение с регрессией включает значения fitness_before и fitness_after, что позволяет легко измерить воздействие и соотнести с изменением.
Трассировка откатов
При откате решения журнал фиксирует:
- Исходное решение с
outcome = "rolled_back" - Новую запись решения для самого действия отката
rollback_idссылается на восстановленный снимок
Эта цепочка позволяет проследить полный жизненный цикл: предложение, выполнение, обнаружение регрессии и откат.
Откат из журнала решений
Для ручного отката конкретного решения:
# Просмотр решения и его снимка отката
prx evolution decisions --id <decision_id>
# Восстановление снимка
prx evolution rollback --snapshot <rollback_id>Операция отката создаёт новую запись решения, документирующую ручное вмешательство.
Интеграция с системой безопасности
Журнал решений интегрируется с конвейером безопасности:
- Перед выполнением -- конвейер безопасности читает прошлые решения для обнаружения паттернов (напр., повторные неудачи в одной области)
- После выполнения -- сигналы регрессии запускают автоматический откат, который фиксируется в журнале
- Ограничение частоты -- конвейер проверяет журнал для соблюдения максимума изменений за временное окно
Ограничения
- Журналы решений локальны для экземпляра PRX; многоузловые развёртывания требуют внешней агрегации журналов
- Файловый бэкенд не поддерживает индексированные запросы; для масштабного анализа используйте бэкенд базы данных
- Баллы пригодности заполняются только после завершения окна наблюдения (настраивается для каждого уровня)
- Отложенные решения могут так и не разрешиться, если условие отложения не переоценивается
Связанные страницы
- Обзор самоэволюции
- Конвейер эволюции -- четырёхэтапный конвейер, производящий решения
- Эксперименты и пригодность -- A/B-тестирование и оценка пригодности
- Безопасность и откат -- проверки безопасности и автоматический откат