guard and cek-try both create CEK frames that don't survive async perform/resume. Instead, run-action returns nil on success and an error string on failure. The for-each loop checks the return value and sets fail-msg. No exceptions cross async boundaries. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>