diff --git a/TODO.md b/TODO.md
index f6cfd4a..00ea28e 100644
--- a/TODO.md
+++ b/TODO.md
@@ -445,9 +445,9 @@ Goal: rename the tables and column to the canonical M2M pattern (`tags`, `thesis
to avoid filesystem churn. At minimum, move the cache dir to `/tmp` or a dedicated
`storage/cache/` path that is excluded from deploy rsync.
-- [ ] **`__wakeup()` singleton guard throws from a public method** - PHP 8.x deprecates
- throwing exceptions from `__wakeup`. Change to `trigger_error(..., E_USER_ERROR)` or implement
- `__serialize()`/`__unserialize()` that always throw.
+- [x] **`__wakeup()` singleton guard throws from a public method** - changed to
+ `trigger_error('Cannot unserialize singleton ...', E_USER_ERROR)` with explicit `void` return
+ type; eliminates the PHP 8.x deprecation notice.
---
@@ -509,10 +509,9 @@ Goal: rename the tables and column to the canonical M2M pattern (`tags`, `thesis
### F - Template logic / PHP in templates
-- [ ] **Rate-limit 429 response in `search.php` emits unstyled bare HTML** - the early-exit block
- outputs `
Trop de requêtes
...` with no stylesheet, no lang,
- no viewport meta. Style it inline-minimally or redirect to a consistent `429.php` page (like
- `maintenance.php`).
+- [x] **Rate-limit 429 response in `search.php` emits unstyled bare HTML** - replaced bare echo with
+ a properly structured HTML document (lang="fr", viewport meta, inline dark styles matching
+ `maintenance.php`); `$retrySeconds` injected into the user-facing message.
- [ ] **`apropos.php` contacts and credits are hardcoded in the template** - names, roles, emails
(Laurent Leprince, Xavier Gorgol, Brigitte Ledune) and credits text live in PHP/HTML and
@@ -957,11 +956,10 @@ Current state: **zero ARIA attributes, zero skip links, zero focus-visible style
structure. There is no programmatic association between label and value. Replacing with
`
/
/
` (already flagged in the semantic audit) directly fixes this criterion.
-- [ ] **Search filter `