Механизм подтверждения операций

Механизм подтверждения операций

Механизм подтверждения на основе обратных вызовов для контроля деструктивных и чувствительных операций. Часть унифицированного сервисного слоя 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

Связанная документация


Модуль: src/harness/ Последнее обновление: февраль 2026