D325 - A fault guard catches a crashing check so the suite continues

Status: decided Date: 2026-09-26

The harness installs a handler for SIGSEGV, SIGBUS, SIGILL and SIGFPE and arms a landing pad around every check with the OBS_FAULT_ARM macro. A caught fault becomes a crash result (D004) and the run continues; a dangling try still means the process went down before the guard could land. The pad is keyed per thread, so a fault on a worker thread is caught. The guard carries its own freestanding setjmp/longjmp and takes its signal primitives as imports, preferring the bound address over dlsym, because a native title's dlsym sees only symbols the process imports. Hangs are not caught - a call that never returns raises no signal.

Why: obs_address_is_callable cannot stop a fault inside a resolved function, and one such fault took a whole run down. sigsetjmp must capture the check's own frame, so the arm is a macro. A native title's dlsym sees only imported symbols, so the primitives cannot be dlsym-only.

Rejected: letting a fault end the run. A single main-thread pad - longjmp across stacks corrupts. dlsym-resolved primitives - absent on a native eboot.