Erreur : Compteurs filter tri-state (en-cours/termine/archive) calculés sur la liste fetchée filtrée côté serveur → impossible de compter les buckets non-fetchés. UI affiche toujours 0 sur les onglets vides.
Check ajouté : useFetch avec query={archived:'1'} en dur (fetch tout) + tous filtres tri-state + scope calculés côté client. Volume actuel <50KB pour 32 chantiers, scale OK jusqu'à ~500.
Cause racine : Anti-pattern : aggregate counts derived from filtered fetch. Soit fetcher all + filter client, soit endpoint /counts dédié, soit 2 fetch parallèles.
Erreur : Mojibake UTF-8 pipeline xterm.js - 4 couches a forcer en C.UTF-8 sinon caracteres francais/box-drawing arrivent en Latin-1. Couches : (1) tmux session start LANG=C.UTF-8 LC_ALL=C.UTF-8 + tmux -u + set-option utf8 on ; (2) systemd unit Environment=LANG=C.UTF-8 ; (3) Python subprocess.run env LANG=C.UTF-8 encoding=utf-8 errors=replace ; (4) CLIENT JS : atob() renvoie binary string Latin-1, faut decoder via TextDecoder("utf-8").decode(bytes) AVANT term.write - sinon UTF-8 multi-byte devient Latin-1 separes.
Check ajouté : Pipeline UTF-8 explicite a chaque hop : tmux session start avec export LANG=C.UTF-8 + tmux set-option utf8 on. Systemd unit Environment=LANG=LC_ALL. Python subprocess.run env={LANG:C.UTF-8} encoding=utf-8. Client xterm.js : const bytes = Uint8Array.from(atob(data), c=>c.charCodeAt(0)); const text = new TextDecoder("utf-8").decode(bytes); term.write(text).
Cause racine : atob() en JS retourne une binary string Latin-1 (1 char par byte). Si on term.write() directement, les bytes UTF-8 multi-byte deviennent 3 chars Latin-1 separes. Mojibake invisible a l oeil sur les chars ASCII (<=127), explose sur tout caractere non-ASCII. Trompeur car semble parfois fonctionner sur du contenu purement ASCII.
Erreur : xterm.js + Fira Code = lettres ecartees ("P e r s o n a"). Fira Code est une font a LIGATURES - sans LigaturesAddon explicitement charge, xterm.js calcule mal la largeur des cellules. Idem pour les emoji/fleches Unicode modernes (emoji fleches) : xterm utilise par defaut des tables wcwidth obsoletes (Unicode <11) - emoji compte 1 cellule au lieu de 2 - decalage de tout le rendu derriere.
Check ajouté : Stack font xterm.js : SF Mono, Menlo, Consolas, ui-monospace, monospace (PAS Fira Code/JetBrains Mono sauf si LigaturesAddon charge). + charger xterm-addon-unicode11 + term.unicode.activeVersion = "11" pour wcwidth moderne. + allowProposedApi: true requis pour activer Unicode11.
Cause racine : xterm.js 5.x conserve wcwidth Unicode 6.x par defaut (compat backward). Fira Code = font concue pour IDE avec ligature engine, pas pour terminal cell-grid pur. Couches d alignement : font cell width + Unicode wcwidth doivent etre coherentes sinon les colonnes glissent.