---
name: troncature-et-corruption-fichiers-toujours-passer-par-python
description: Edit/Write tronquent les fichiers >~35 Ko ou introduisent des octets nuls ; sed -i tronque aussi les JSX ; toujours utiliser python3 via bash
metadata: 
  node_type: memory
  type: feedback
  originSessionId: cce8aa12-fe3a-4aa6-a101-357b5ce867e8
---

## ⚠️ RÈGLE ABSOLUE : **NE JAMAIS utiliser Edit, Write ou sed sur les fichiers backend ou frontend volumineux. TOUJOURS utiliser python3 via mcp__workspace__bash, sans exception.**

Les outils `Edit`, `Write` et `sed -i` peuvent corrompre les fichiers JSX/JS volumineux de deux façons :
1. **Troncature** : le contenu est coupé en cours d'écriture au-delà de ~35 Ko, sans avertissement.
2. **Octets nuls** : des `\x00` sont ajoutés en fin de fichier, causant une erreur Vite `Unexpected character ''`.

**Why:** Plusieurs fichiers clés ont été affectés (dashboard.js, fiscal2778.js, InvestissementDetail.jsx, DepotsRetraits.jsx). Un `sed -i` de remplacement de couleurs hex en session 2026-06-01 a tronqué Cerfa2561Preview.jsx à mi-fichier sans git pour récupérer. La troncature de `db/index.js` a aussi laissé une migration incomplète (`fiscalite_locale`) réparée manuellement.

**How to apply:**
- Toujours utiliser `python3` via `mcp__workspace__bash` pour écrire ou modifier des fichiers volumineux (pages JSX, routes backend complexes) — jamais `sed -i`
- Pattern sûr : `python3 -c "content = open(path).read(); content = content.replace(old, new); open(path,'w').write(content)"`
- Après chaque écriture, vérifier avec `python3 -c "open(path,'rb').read()[-50:].hex()"` — des `00` en fin signalent des octets nuls
- Nettoyer les octets nuls : `raw = open(path,'rb').read(); open(path,'wb').write(raw.rstrip(b'\x00'))`
- Vérifier les fichiers backend avec `node --check` après modification
- Pour le frontend, vérifier avec `tail -5` que les fermetures JSX sont correctes
- **InvestissementDetail.jsx spécifiquement** : la fin du fichier (menus contextuels) se tronque régulièrement. Chercher `grep -n "^      </Modal>"` et réécrire la queue via python3.
- **Troncature lors de passes multiples** : même avec python3, enchaîner plusieurs scripts indépendants lisant/écrivant le même fichier peut tronquer la fin (confirmé en session 2026-06-13 sur referentiel.js ~46 Ko). Le fichier semblait intact après chaque passe mais était corrompu en git. Pattern sûr : **un seul script Python qui lit depuis `git show <sha>:path` via `subprocess`, applique TOUS les patches en mémoire, écrit une seule fois, puis relit et vérifie `assert written == content` et `'export default router' in content`**. Après CHAQUE write, vérifier `tail -5`.
- **`content.replace()` avec caractères spéciaux** : les fichiers JSX contiennent des espaces insécables (U+202F), flèches et autres Unicode. Le `replace()` Python échoue silencieusement si l'old string ne matche pas exactement — préférer la manipulation par numéros de ligne (`lines[i] = new_line`).
- **Cerfa2778Preview.jsx** : particulièrement sensible aux troncatures (U+202F dans les templates). Toujours travailler par index de lignes et vérifier `tail -5` après chaque écriture.
- **DepotsRetraits.jsx et Remboursements.jsx** : troncatures en session 2026-05-31 lors de l'ajout des TrendBadge — reconstruire depuis les patterns des autres pages.
- Si le backend refuse de démarrer avec "Unexpected end of input" : `xxd | tail -4` pour diagnostiquer, puis reconstruire via python3.
- **auth.js et admin.js** : troncatures confirmées en session 2026-06-15 lors d'instrumentation via Edit (python3 replace). Pour ces fichiers, utiliser exclusivement python3 en mode binaire (`open(path,'rb')` / `open(path,'wb')`) pour éviter les erreurs d'encodage UTF-8 sur les accents. Restaurer le `export default router;` final en dernier si manquant.
- **Récupération depuis git** : `git checkout HEAD -- file` est bloqué ("Operation not permitted") dans le sandbox. Pattern de récupération : `git show HEAD:path/to/file > /tmp/restored.js && python3 -c "import shutil; shutil.copy('/tmp/restored.js', 'path/to/file')"`. Confirmer avec `wc -l`. Incident admin.js 2026-06-16 : tronqué à 414 lignes (sur 672), récupéré via ce pattern.
