Two-phase compliance runner (§3.3). Runs scenario (which returns the persisted root run ID or
undefined), then evaluates isCompliant from persisted artifacts (Phase P). On non-compliance
it retries with a fresh scenario up to maxAttempts total, then throws model-noncompliance:.
The FIRST compliant attempt's run ID is returned so Phase A (framework assertions, never retried)
runs against a run that provably attempted the guarded behavior — the anti-vacuity guarantee.
Two-phase compliance runner (§3.3). Runs
scenario(which returns the persisted root run ID or undefined), then evaluatesisCompliantfrom persisted artifacts (Phase P). On non-compliance it retries with a fresh scenario up tomaxAttemptstotal, then throwsmodel-noncompliance:. The FIRST compliant attempt's run ID is returned so Phase A (framework assertions, never retried) runs against a run that provably attempted the guarded behavior — the anti-vacuity guarantee.