There are basically two levels involved: one of them is 'correctness'. To ensure the code is correct when passing the typed/untyped barrier (lest you can't call untyped racket), runtime checks need to be inserted in some specific circumstances. This usually only happens when the type can only be ensured at runtime, i.e. when you pass the typed/untyped barrier or when the type depends e.g. on eval or otherwise, user input.