> ⚠️ **MODE DEV STRICT (pas PROD)**  
> - **Aucune transition**, **aucun fallback**, **aucune rétro-compat**.  
> - Soit on règle un point proprement soit on n'y touche pas. pas de zone de : "transition ou entre deux".  
> - Toute contribution qui introduit une zone grise, un compromis ou un retour au legacy est **refusée**.

# Fichiers & Attachments — JSON vs Binaire

## Listing JSON
- `GET /api/files` → `{ ok:true, files:[{ id, name, mimeType, byteSize, url, updatedAt, ... }] }`.
- Auth requise; 401 sinon.

## Contenu / Téléchargement
- `GET /api/files/:id/content`
  - Si `Accept: application/json` ou `?format=json` → JSON `{ ok:true, file:{...}, content:"..." }` (texte).
  - Sinon → **binaire** avec headers:
    - `Content-Type: <mime>` (valeur par défaut: `application/octet-stream`)
    - `Content-Disposition: inline; filename="..."; filename*=UTF-8''...
    - `Content-Length: N`
    - `ETag: "<checksum>"` (si disponible)

## Bonnes pratiques
- Toujours valider l’`id`; 404 `{ ok:false, code: FILE_NOT_FOUND, ... }` si absent/introuvable.
- Nettoyer les noms de téléchargement (ASCII par défaut, contrôle des caractères de contrôle) avant `Content-Disposition`.
- Ne jamais mélanger flux JSON et binaire dans une même réponse.
