Skip to content

symfonic.capabilities.governance.stages.preconditions

preconditions

Tool preconditions: is this call admissible at all right now?

An unmet precondition steers rather than refuses. The model asked for something the world is not ready for; the useful answer is "fetch the cart first", not a dead turn. Refusal is reserved for the cases where continuing is itself the harm.

Fail-open at the stage level, pinned to T3.1.3: a precondition that raises admits. Note the two axes — a broken checker admits, an unmet check objects. The legacy gate conflated them by catching everything and returning "allowed".

ToolPreconditionStage

ToolPreconditionStage(preconditions: Sequence[Objector])

Check every declared precondition against every requested call.

Source code in src/symfonic/capabilities/governance/stages/preconditions.py
def __init__(self, preconditions: Sequence[Objector]) -> None:
    self._preconditions = tuple(preconditions)