In Bitcoin Core, every method of BaseSignatureChecker that touches the spending transaction returns a bool: CheckSchnorrSignature, CheckLockTime (CLTV) and CheckSequence (CSV). Script supplies a parameter and gets back a yes/no answer, but no transaction data is ever pushed onto the stack.
Was this “script asks, checker answers yes/no” separation a deliberate design principle, for example to keep script evaluation a pure function of (tx, prevouts), to allow validation caching, or to keep scripts easy to analyze? Or is it mostly a result of how the code evolved?
I ask because covenant proposals seem to split along this line: OP_CHECKTEMPLATEVERIFY keeps the boolean pattern, while OP_TXHASH and OP_TEMPLATEHASH push a value onto the stack. Is there a known argument for why returning values to Script is a qualitatively bigger change than adding another boolean check?











