5 Invariants of Synth Nova
Инварианты — утверждения которые истинны всегда, независимо от задачи, агента, контекста. Нарушение инварианта = инцидент, требующий post-mortem.
Агент может процитировать конкретный инвариант как обоснование остановки или эскалации.
INV-1: Необратимые действия требуют human approval
Формулировка: Никакое действие с необратимыми последствиями не выполняется без явного approval Human Owner.
Необратимые действия (исчерпывающий список):
- Финансовые операции (любая сумма)
- Production deploy
- Внешняя коммуникация (email, мессенджер, публикация)
- Удаление данных без backup
- Создание/изменение юридических документов
- Расход > $10 на одну задачу
Как проверить: action.reversible false → require human_approval true
Связь: I. Red Lines, Rules-Security
INV-2: Каждый research-цикл оставляет полный artifact trail
Формулировка: Любая задача типа intel.* или research.* после завершения содержит:
- Input: бриф / question / payload
- Intermediate: список source URLs, raw data
- Output: структурированный отчёт
- Meta:
{cost_usd, tokens, duration_ms, source_count, confidence}
Minimum viable artifact:
{
"input": {"question": "...", "context": "..."},
"output": {"report": "..."},
"_meta": {"cost_usd": 0.0, "tokens": 0, "duration_ms": 0}
}Как проверить: task.result содержит _meta с ненулевыми значениями; для research-задач — source_count > 0
Связь: Observability, ObservabilityContract
INV-3: Стоимость измеряется до запуска и логируется после
Формулировка: Перед выполнением задачи известен budget_usd. После завершения _meta.cost_usd записан. Разница > 20% от бюджета → warning в audit log.
Enforcement:
- Task creation:
budget_usdобязательное поле (default из Rules-Budget) - Task completion:
_meta.cost_usdзаписывается вresult - Policy Engine: pre-check budget before each LLM call
Как проверить: task.budget_usd IS NOT NULL AND task.result->'_meta'->>'cost_usd' IS NOT NULL
Связь: Rules-Budget, Policy-Layer
INV-4: Агент с low confidence эскалирует, не угадывает
Формулировка: Если confidence < threshold для данного типа решения — агент останавливается и эскалирует. Никогда не “додумывает” или “предполагает”.
Thresholds (по типам):
| Тип решения | Threshold | Действие при < threshold |
|---|---|---|
| Критическое (деплой, внешняя коммуникация) | 0.8 | Эскалация Human |
| Стандартное (research, analysis) | 0.6 | Эскалация Director/CEO |
| Некритическое (formatting, classification) | 0.4 | Retry с другим подходом |
Как проверить: result.confidence < threshold → task.status IN (‘escalated’, ‘failed’)
Связь: VII. Работа с неопределённостью, EscalationPolicy
INV-5: Конфликт между агентами не разрешается голосованием
Формулировка: Когда два агента приходят к разным выводам, результат не усредняется, не выбирается по confidence, не решается голосованием.
Вместо этого:
- Конфликт фиксируется явно (оба варианта сохраняются)
- Primary authority по DecisionRights делает финальный вызов
- Если authority неоднозначна → Judge agent (если доступен) → Human
Как проверить: не существует task.result где output = average(agent_a.output, agent_b.output)
Связь: ConflictResolution, DecisionRights