{# templates/seren_ia/public_show.html.twig Page publique d'une discussion Serenia partagée par lien. Lecture seule. N'étend PAS base.html.twig : aucune barre latérale, aucun solde de tokens, aucune donnée du propriétaire, aucun champ de saisie, aucune liste de sessions. L'uuid de la discussion est volontairement absent : c'est la clé des URLs authentifiées, et elle n'est pas révocable. LE TITRE. Il est stocké EN CLAIR et saisi librement par le propriétaire ; la projection le transmet BRUT, à charge du gabarit de le rendre sans le corrompre ni l'exposer. Trois règles, à ne pas relâcher : 1. jamais de |raw, de |striptags ni de |escape explicite — l'autoescape `html` de Twig suffit, et tout ajout casse les titres légitimes contenant « & » ou des guillemets (ou, pour |raw, ouvre une injection franche) ; 2. jamais dans le bloc application/json ni dans un corps ». JSON_INVALID_UTF8_SUBSTITUTE : sans lui, un SEUL message porteur d'une séquence UTF-8 invalide (fichier importé sans validation, corruption de déchiffrement…) fait renvoyer FALSE à json_encode() pour la TOTALITÉ du tableau — pas seulement ce message. Le bloc de données sort alors VIDE, `JSON.parse('')` lève côté client, et le visiteur voit le titre seul avec un fil blanc : un 200 silencieux, aucune erreur serveur. Le drapeau remplace l'octet fautif par U+FFFD et laisse le reste du fil s'afficher. #}
{# Signature Bubul en fin de document. Contrairement aux deux autres pages, celle-ci défile normalement et ne porte aucun contrôle : la place ne manque pas, et une signature sous le dernier message se lit comme telle. Dans le flux, donc sans rien recouvrir — un fil long reste intégralement lisible. #}
{% include '_molecules/public-share-signature/public-share-signature.html.twig' only %}
{{ encore_entry_script_tags('serenia_public') }}