O "sem medo" da regra 1 depende do deploy. Se o servidor ignora a query, app.js?v=2 é o app.js que estiver no disco na hora. Com FTP ou rsync, se o HTML chega antes do JS novo, o JS velho responde 200 na URL nova e, com cache first, fica lá até o próximo deploy. O mínimo é subir os assets antes do HTML. Hash no nome (app.3f2a1c.js) resolve melhor: a URL nova dá 404 até o arquivo chegar, e com if (res.ok) antes do cache.put nada errado entra.
A regra 4 também pega as páginas da regra 2. No cache versionado, cada deploy apaga todas; em cache separado, o HTML guardado aponta pra um ?v= já apagado e abre quebrado offline. No install dá pra baixar de novo as páginas já guardadas.
O Workbox eu usaria quando o ?v= global pesar: mudou uma linha, baixa tudo. O precache dele compara revisão por arquivo e só baixa o que mudou.