4 blocs interpolés extraits avec la recette de la 2a (config JSON inline + JS statique, substitutions sur le CORPS du bloc) : - local_workspace.html → local_workspace.js (2 031 L, lw-config : current_folder_id, workspace_id) - settings.html → settings.js (1 093 L, st-config : avatar, user full_name/login/email, is_admin (bool), auth_method — 2 routes rendent ce template, expressions « or "" » préservées pour les valeurs Undefined) - _page_editor_realtime.html → page_editor_realtime.js (531 L, rt-config : SELF id/login/full_name/color) - board.html → board.js (146 L, bd-config : owner/repo/initial_view) BONUS sécurité : les valeurs passent par |tojson (échappement JSON explicite) au lieu d'être interpolées dans des strings JS. Tags : config JSON (nonce conservé) + <script src> ?v={{ asset_version }} ; loaders JSON.parse en tête (try/catch → {}). Correctif sur le loader (accolade try en trop, caught par node --check avant tout commit). Cumul A27 : 10 560 L extraites (13 904 → 3 344 restantes, -76 %). Reste structurel : base 1 338 ({% block %}/{% for %}) + database_table 1 323 (if/else) + 279 warnings eslint (12 fichiers, 0 erreur). suite **1089/1089** · ruff OK · node --check ×4 vert · docs à jour