c7e924abe7
Cause racine du décalage d'identité : l'app tourne dans DEUX contextes avec DEUX partitions de localStorage — top-level (127.0.0.1:3000 direct, barrière) et iframe (embarquée sous nextgraph.net après le round-trip broker). Le navigateur partitionne le storage par site top-level, donc l'identifiant saisi en top-level n'est jamais celui que l'app connectée lit dans l'iframe (symptôme: deux valeurs divergentes). Fix : le param d'URL ?id= devient la SOURCE DE VÉRITÉ. Le SDK redirige avec encodeURIComponent(window.location.href) (URL app complète, query comprise), donc un param d'URL TRAVERSE la frontière contrairement à localStorage. AuthGate écrit ?id=<identifiant> (replaceState) avant connect(); AccountContext résout par priorité (1) ?id= puis (2) localStorage (préremplissage same-partition seulement). Renommage username→identifier (champ useAccount, normalizeIdentifier, clé festipod.account.identifier) — c'est un id technique d'espace, pas un username. Le username de PROFIL (nom d'affichage) est laissé intact. Test garde-fou @ui (identifiant-resolution.feature) : la priorité param>localStorage, rouge si on l'inverse. Le flux de barrière étant désactivé en @e2e, ces @ui sont la seule couche qui le garde. Doctrine: knowledge_authentication (porteur URL + partition) + knowledge_context-internals (vocab). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>