The key point here is that CustomDebugStringConvertible is a non-isolated protocol. As a result, RLActionState is also non-isolated.
“Main actor by default” doesn’t apply to RLActionState because it inherits from a non-isolated protocol. But it does apply to RLWaitActionState – all the members of RLWaitActionState are main actor isolated, which does not meet the protocol’s requirement of non-isolated.
This is why you still need an isolated conformance like this to make it compile:
struct RLWaitActionState: @MainActor RLActionState {}
On the other hand, this:
@MainActor
extension RLWaitActionState: RLActionState {}
…is totally redundant. The “main actor by default” setting would have already applied this @MainActor attribute to all your extensions anyway. The @MainActor here simply makes all the members of the extension main actor isolated.
This is different from an isolated conformance, which allows you to satisfy protocol requirements (that are otherwise non-isolated) with global actor isolated members. In exchange, you cannot use values of such types as freely. See the linked SE proposal for more details.
That said, isolated conformances is still kind of a buggy feature.