Механизм подтверждения операций¶
Механизм подтверждения на основе обратных вызовов для контроля деструктивных и чувствительных операций. Часть унифицированного сервисного слоя CodeGraphHarness.
Обзор¶
Механизм подтверждения определяет, требуют ли операции (применение автоисправлений, исправления по шаблонам, выполнение команд) явного подтверждения пользователя. Поддерживает три политики:
| Политика | Поведение |
|---|---|
auto |
Автоматическое одобрение операций из белого списка, запрос для остальных |
ask_always |
Запрос подтверждения для всех операций |
read_only |
Автоматический отказ для всех операций записи |
Архитектура¶
Пользователь/CLI/IDE ←→ ApprovalEngine ←→ Harness ←→ Модули анализа
│
┌─────┴─────┐
│ Политики │
├───────────┤
│ auto │ ← Проверка белого списка, затем запрос
│ ask │ ← Всегда запрос
│ read_only │ ← Всегда отклонять запись
└───────────┘
Справочник API¶
ApprovalRequest¶
@dataclass
class ApprovalRequest:
id: str # Уникальный ID запроса (UUID)
thread_id: str # ID потока сессии
action_type: str # Например, 'apply_autofix', 'command_execution'
details: Dict[str, Any] # Произвольные детали операции
status: str # 'pending' | 'accepted' | 'declined' | 'cancelled'
ApprovalDecision¶
@dataclass
class ApprovalDecision:
decision: str # 'accept' | 'accept_for_session' | 'decline' | 'cancel'
reason: Optional[str] # Необязательная причина
scope: Optional[str] # Область для 'accept_for_session'
ApprovalEngine¶
class ApprovalEngine:
def __init__(self, config: HarnessConfig):
"""Инициализация с конфигурацией harness."""
async def request_approval(
self,
action_type: str,
details: Dict,
thread_id: str,
) -> ApprovalDecision:
"""
Запросить подтверждение операции. Блокирует до получения решения.
Автоматически одобряет, если action_type в белом списке или
ранее одобрен для данной сессии.
Аргументы:
action_type: тип операции (например, 'apply_autofix')
details: контекст операции (файл, строка, описание)
thread_id: текущий поток сессии
Возвращает:
ApprovalDecision с решением пользователя
"""
def resolve_approval(self, request_id: str, decision: ApprovalDecision) -> None:
"""
Разрешить ожидающий запрос (вызывается из UI/CLI).
При решении 'accept_for_session' все последующие запросы того же
типа в данном потоке одобряются автоматически.
"""
def get_pending_request_ids(self) -> list:
"""Получить ID всех ожидающих запросов."""
def clear_session_approvals(self, thread_id: str) -> None:
"""Очистить сессионные автоодобрения при завершении сессии."""
Конфигурация¶
# config.yaml
harness:
session_dir: ./data/sessions
max_threads: 100
thread_ttl_hours: 168 # 7 дней
approval:
default_policy: auto # auto | ask_always | read_only
auto_approve: # Автоматически одобряемые операции
- codegraph_query
- codegraph_find_callers
- codegraph_find_callees
- codegraph_explain
require_approval: # Операции, требующие подтверждения
- apply_autofix
- apply_pattern_fix
- command_execution
Использование¶
Запрос подтверждения¶
from src.harness import get_harness
harness = get_harness()
decision = await harness.approval.request_approval(
action_type="apply_autofix",
details={
"file": "main.c",
"line": 42,
"fix": "Заменить strcpy на strncpy",
"cwe": "CWE-120"
},
thread_id="session_abc"
)
if decision.decision == "accept":
apply_fix(...)
elif decision.decision == "decline":
log(f"Исправление отклонено: {decision.reason}")
Разрешение из UI¶
# Вызывается из CLI/TUI/IDE при решении пользователя
harness.approval.resolve_approval(
request_id="req_abc123",
decision=ApprovalDecision(decision="accept")
)
Сессионное подтверждение¶
При выборе accept_for_session все последующие запросы того же action_type в текущем потоке одобряются автоматически:
# Пользователь одобряет однократно на всю сессию
decision = ApprovalDecision(decision="accept_for_session")
harness.approval.resolve_approval(request_id, decision)
# Последующие запросы autofix одобряются автоматически
decision = await harness.approval.request_approval(
action_type="apply_autofix", # Тот же тип → автоодобрение
details={...},
thread_id="session_abc" # Тот же поток
)
# decision.decision == "accept" (автоматически)
Логика принятия решений¶
request_approval(action_type, details, thread_id)
│
├─ action_type в списке auto_approve?
│ └─ ДА → немедленно вернуть accept
│
├─ action_type в session_approvals[thread_id]?
│ └─ ДА → вернуть accept (сессионное)
│
├─ default_policy == read_only?
│ └─ ДА → вернуть decline("политика read_only")
│
└─ Создать ожидающий запрос, ждать решения пользователя
├─ accept → выполнить операцию
├─ accept_for_session → выполнить + запомнить для сессии
├─ decline → пропустить операцию
└─ cancel → отменить операцию
Классификация операций по умолчанию¶
| Автоодобряемые (только чтение) | Требуют подтверждения (запись) |
|---|---|
codegraph_query |
apply_autofix |
codegraph_find_callers |
apply_pattern_fix |
codegraph_find_callees |
command_execution |
codegraph_explain |
Точки интеграции¶
Механизм подтверждения используется в:
- Автоисправления (src/analysis/autofix/) — применение исправлений безопасности
- Исправления по шаблонам (src/analysis/patterns/) — применение структурных перезаписей
- Редактирование файлов (src/editing/) — модификации на основе AST
- MCP-инструменты — операции записи через MCP-сервер
- ACP-сессии — операции, инициированные из IDE
Связанная документация¶
- Безопасность — автоисправления и анализ безопасности
- Рабочие процессы — интеграция со сценариями
- REST API — конечные точки API для подтверждения
- Интеграция ACP — подтверждение из IDE
Модуль: src/harness/
Последнее обновление: февраль 2026