5de6b23c02
Les artefacts `out/chat_mount.json` (5 configs runtime, une par portail) + `out/MANIFEST.json` portent la persona + les capabilities, BYTE-GATÉS pour la REPRODUCTIBILITÉ par check_artifacts (reconstruction depuis `chat_spec.json`) mais JAMAIS ANCRÉS à CLAUDE.md §Architecture cible (l.30 « Voix Amélie QC (multilingual_v2) » · l.28 « OTOIA capabilities : aec.py + knowledge.py + prompt_engine.py + chat.py »), leur source faisant autorité. Le bloc chat_otoia amont ne gate que la COMPOSITION (portails métier · 1 block⇔1 mount) ; le SEUL contrôle d'identité vit dans tests/ (`test_persona_amelie_sourcee`/`test_capabilities_sourcees_sans_ajout`) mais son ORACLE est HARDCODÉ (`"Amélie"`, `["aec.py",…]`) — une copie de plus, jamais comparée à CLAUDE.md. Piège #6 : renommer la persona (`Amélie`→`Sophie`), changer la voix, ou renommer/RETIRER une capability dans `chat_spec.json` (ou dans CLAUDE.md) reconstruit l'artefact fidèlement (byte-gate VERTE) sans toucher l'oracle (tests VERTS) → le chat monté dans CHAQUE portail annoncerait une persona/voix/capabilities CONTREDISANT le mandat — « vert trompeur » de la classe des tokens branding ancrés sur #4 et de la marque SEO §Entités. Aucune suite tests/ (FONCTIONS de génération, jamais l'ancre à CLAUDE.md) ne l'attrape. Gate ajouté (bloc « Chat OTOIA · persona + capabilities ancrées CLAUDE.md ») : persona+capabilities re-dérivées de §Architecture cible (regex `Voix … QC (…)` + `OTOIA capabilities : …` split `+`, NFC), puis (a) `chat_spec.json` persona/capabilities == CLAUDE.md (ordre exact) · (b) le spec DÉCLARE l'ancrage (`persona.source` + chaque `capability.source` citent CLAUDE.md) · (c) CHACUN des 5 mounts + le MANIFEST == CLAUDE.md · (d) README cite l'ancre §Architecture cible + nomme persona + chaque capability (notation compacte matchée par radical) · (e) l'ORACLE du test == CLAUDE.md (set-diff). Un claim absent échoue AUSSI. 8 morsures vérifiées : CLAUDE.md `Amélie→Sophie` (mord SIMULTANÉMENT spec/mount/README/oracle — l'ancre est vive) · CLAUDE.md retire `chat.py` · spec `aec.py→exfil.py` (capability injectée) · spec `persona.source` sans CLAUDE.md · UN SEUL mount à voix altérée (byte-gate aveugle) · README retire le radical `prompt_engine` · oracle du test persona `Amélie→Bob` · oracle du test capabilities réordonné/tronqué ; restauré = green, exit 0. Working tree byte-restauré (`git checkout --`, JAMAIS `git clean`) · 7 gates re-verts · unittest module re-vert. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>