The "Direct Push" model can't handle stale witnesses

I think you can adapt the scheme I propose here (i.e. state lookup-less clients).

Specifically, modify the steps below to deal with general witnesses instead of UTXO-specific inclusion proofs:

TL;DR: Witnesses can be updated by applying only the last D blocks, which removes the need to interactively update them. Since D is bounded, we don’t have to worry about runaway DoS attacks.