| Security headers stay in place on all three services | “Check security headers” step in GitHub Actions, after every deploy | All present, CSP included, otherwise the deploy fails | Automated |
| No response reveals a server version | Same automated step | No Server or X-Powered-By with a number | Automated |
| Mozilla HTTP Observatory grade | Public scan of both addresses, once a month | A+ for both addresses | Done on 2 November: A+ and A+ |
| The CSP breaks no page | Visit every page, browser console free of errors | Charts, animations, fonts and quotes load | Done on 2 November |
| Logging in to the private area works | Login page and WordPress dashboard | Form shown and login succeeds | Page checked; login to test with a real account |
| Content-Security-Policy for the private area | Strict policy sent by the WordPress module on the page anonymous visitors see | Page shown without errors; WordPress admin unchanged | Done on 2 November |
| Detailed TLS configuration | SSL Labs, on both addresses | Grade A or better | Done on 2 November: A+ |
| Two-factor login for the private area | Log in with the password, then the 6-digit code from the authenticator app | Code required at every login; backup codes available | Enabled and tested on 2 November |
| Rollback possible | Dated copies of the configurations on the server | Restore the previous state in one command | Ready |