diff --git a/CLAUDE.md b/CLAUDE.md
index 620ea98..8fcb36e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -31,11 +31,18 @@ global** dans le navigateur, donc les `const`/fonctions d'un fichier sont
visibles des suivants exactement comme dans le monofichier. Ordre actuel :
```
-js/argon2.js (IIFE, globalThis.NobleArgon2)
+js/argon2.js (IIFE, globalThis.NobleArgon2)
js/app.crypto.js (KDF, verifier, encrypt/decrypt — extrait §3.1)
-js/app.js (le reste)
+js/app.js (le reste : state, Bridge, api, UI…)
+js/app.sync.js (WebDAV + merge — extrait §3.1, APRÈS app.js car
+ effet de bord top-level `Bridge.onWebdavResult = …`)
```
+Note ordre : un module **sans** exécution top-level (que des déclarations,
+comme `app.crypto.js`) peut se charger AVANT `app.js`. Un module **avec** un
+effet de bord top-level qui touche un global d'`app.js` (`Bridge`, `state`…)
+doit se charger APRÈS (`app.sync.js`).
+
Règles pour extraire un nouveau module :
- Il doit se charger **avant** ses consommateurs et **ne jamais redéclarer**
un `const` d'un autre fichier (un `const` dupliqué entre deux classic
@@ -87,6 +94,7 @@ parsing CSV d'import, et l'arbitrage merge/tombstone de sync
| Handlers REST | `delphi-backend/Handlers/PM.Handler.*.pas` |
| Frontend principal (en cours de découpage §3.1) | `js/app.js` |
| Crypto frontend (KDF, verifier, AES-GCM) — extrait §3.1 | `js/app.crypto.js` |
+| Sync frontend (WebDAV, snapshot, merge) — extrait §3.1 | `js/app.sync.js` |
| Argon2id vendé (bundle `@noble/hashes`, IIFE) | `js/argon2.js` |
| HTML racine | `index.html` |
| Styles | `css/style.css` |
diff --git a/CODE_AUDIT.md b/CODE_AUDIT.md
index 61bf799..fca8bff 100644
--- a/CODE_AUDIT.md
+++ b/CODE_AUDIT.md
@@ -224,11 +224,14 @@ seulement au runtime).
chargés dans l'ordre via `
+