X_CONTRACT_EXERCISE_UNREACHED
Means
no generated run reached the handler
Typical cause
every run of the exercise assertion stopped before the handler: denied by policy, refused input, a rate limit or a sealed network; meta.outcomes lists what each run hit
Fix
give a permitted actor: defineExercise({ <name>: { actor } }) in apps/web/exercise.ts, or bind a real row: { actor, input: (drawn) => ({ ...drawn, postId }) }