Source code for curate_ipsum.verification.backend
"""
Abstract verification backend interface.
Mirrors D-001/D-012/D-014 pattern: abstract base class with factory function
for runtime backend selection.
Decision: D-016
"""
from __future__ import annotations
import logging
from abc import ABC, abstractmethod
from typing import Any
from curate_ipsum.verification.types import VerificationRequest, VerificationResult
LOG = logging.getLogger("verification.backend")
[docs]
class VerificationBackend(ABC):
"""
Abstract interface for verification backends.
Implementations must handle:
- Accepting a VerificationRequest
- Running verification within budget constraints
- Returning a VerificationResult
Follows the same ABC + factory pattern as GraphStore (D-014)
and LLMClient (D-012).
"""
[docs]
@abstractmethod
async def verify(self, request: VerificationRequest) -> VerificationResult:
"""
Run verification on the given request.
Returns VerificationResult with status, optional counterexample,
and execution statistics.
"""
...
[docs]
@abstractmethod
def supports(self) -> dict[str, Any]:
"""
Declare what this backend supports.
Returns a dict describing supported input types, constraint kinds,
find/avoid predicates, etc. Used by the orchestrator to route
requests to capable backends.
Example::
{"input": "binary", "constraints": ["comparison"], "find": ["addr_reached"], "avoid": ["addr_avoided"]}
"""
...
[docs]
async def close(self) -> None:
"""Release backend resources. Override if needed."""
pass
[docs]
def build_verification_backend(backend: str, **kwargs: Any) -> VerificationBackend:
"""
Factory: create a VerificationBackend of the requested type.
Args:
backend: "z3", "angr", or "mock"
**kwargs: Backend-specific configuration
Returns:
VerificationBackend instance
Raises:
ValueError: Unknown backend
ImportError: Backend dependencies not installed
"""
if backend == "z3":
from curate_ipsum.verification.backends.z3_backend import Z3Backend
return Z3Backend(**kwargs)
elif backend == "angr":
from curate_ipsum.verification.backends.angr_docker import AngrDockerBackend
return AngrDockerBackend(**kwargs)
elif backend == "mock":
from curate_ipsum.verification.backends.mock import MockBackend
return MockBackend(**kwargs)
else:
raise ValueError(f"Unknown verification backend: {backend!r}. Supported: 'z3', 'angr', 'mock'")