Programme « cohérence d'identité au changement de compte » (go de Bruno, 2026-11-07). Cas réel : connecté fred chez ObsiGate, Bruno ouvre l'application et y trouve son propre compte — la session locale préexistante gouvernait sans jamais reconsulter l'identité centrale. Comportement construit : quand une requête présente (a) un cookie draco_sessionvalide (signature, expiration, révocation — mécanismes existants) dont le sub est établi et (b) une session locale d'un compte dont le sub lié diffère → la session locale est invalidée et le pont draco sert l'identité du cookie (JIT si besoin). Gardes : aucun cookie ou cookie invalide/expiré/révoqué → on ne touche à rien ; sessions de secours de la porte centrale marquées et exemptées ; pas de boucle (si le pont ne peut pas servir le sub — rôle « aucun », dissociation, compte inactif — la session est gardée plutôt que de détruire en boucle) ; compte local sans aucun lien → l'identité centrale présente gagne (choix documenté). Aucune fusion : PR en attente de l'ordre de Bruno.
Mécanisme : nouveau CoherenceDracoMiddleware (le plus externe), pages seulement (GET hors /api/, /auth/, /static/, /s/, /f/, /scim/). Comparaison : le draco_sub inscrit dans le payload signé de la session à sa création par le pont (nouveau marqueur de SessionManager.create_session, préservé par refresh_session) — sinon le lien actif du compte. Le sub inscrit neutralise le repli mono-utilisateur de la résolution. Alignement : révocation de la ligne user_sessions, cookie supprimé, redirection vers /auth/draco?next=…. La connexion de la porte centrale pose secours=True (session exemptée). Helper public draco.claims_valides (validité complète du cookie).
Périmètre API : l'API n'est pas traversée — un appel en vol n'est ni interrompu ni rejoué sous une autre identité ; dès la navigation suivante, la page sert l'identité du cookie et la session alignée gouverne l'API.
Tests : tests/test_coherence_identite.py (7) — cas de la capture (session révoquée en base, pont servant ensuite le compte du cookie, identité lue par /auth/user), même sub / sans cookie / cookie invalide intacts, secours exemptée, compte sans lien aligné, marqueur du pont. Matrice navigateur sur pile locale réelle : écart reproduit sur 7.85.6 (capture), lignes (i)–(v) vérifiées sur 7.85.7.
Programme « cohérence d'identité au changement de compte » (go de Bruno, 2026-11-07). Cas réel : connecté **fred** chez ObsiGate, Bruno ouvre l'application et y trouve **son propre compte** — la session locale préexistante gouvernait sans jamais reconsulter l'identité centrale. Comportement construit : quand une requête présente (a) un cookie `draco_session` **valide** (signature, expiration, révocation — mécanismes existants) dont le `sub` est établi et (b) une session locale d'un compte dont le sub lié diffère → la session locale est invalidée et le pont draco sert l'identité du cookie (JIT si besoin). Gardes : aucun cookie ou cookie invalide/expiré/révoqué → on ne touche à rien ; sessions de secours de la porte centrale marquées et exemptées ; pas de boucle (si le pont ne peut pas servir le sub — rôle « aucun », dissociation, compte inactif — la session est gardée plutôt que de détruire en boucle) ; compte local sans aucun lien → l'identité centrale présente gagne (choix documenté). **Aucune fusion** : PR en attente de l'ordre de Bruno.
**Mécanisme** : nouveau `CoherenceDracoMiddleware` (le plus externe), pages seulement (GET hors `/api/`, `/auth/`, `/static/`, `/s/`, `/f/`, `/scim/`). Comparaison : le `draco_sub` inscrit dans le payload signé de la session à sa création par le pont (nouveau marqueur de `SessionManager.create_session`, préservé par `refresh_session`) — sinon le lien actif du compte. Le sub inscrit neutralise le repli mono-utilisateur de la résolution. Alignement : révocation de la ligne `user_sessions`, cookie supprimé, redirection vers `/auth/draco?next=…`. La connexion de la porte centrale pose `secours=True` (session exemptée). Helper public `draco.claims_valides` (validité complète du cookie).
**Périmètre API** : l'API n'est pas traversée — un appel en vol n'est ni interrompu ni rejoué sous une autre identité ; dès la navigation suivante, la page sert l'identité du cookie et la session alignée gouverne l'API.
**Tests** : `tests/test_coherence_identite.py` (7) — cas de la capture (session révoquée en base, pont servant ensuite le compte du cookie, identité lue par `/auth/user`), même sub / sans cookie / cookie invalide intacts, secours exemptée, compte sans lien aligné, marqueur du pont. Matrice navigateur sur pile locale réelle : écart **reproduit** sur 7.85.6 (capture), lignes (i)–(v) vérifiées sur 7.85.7.
La racine, sans session locale et sur instance peuplée, renvoie
au pont /auth/draco quand un cookie draco valide est présenté,
au lieu de servir la page publique déconnectée. Instance vierge
et formulaire local (?provider=local, le chemin prévu) jamais
interceptés ; sans cookie ou cookie invalide, page publique
inchangée. Symétrique du contrôle de cohérence de la 7.85.7
(session locale d'un autre compte).
Tests : tests/test_entree_sso.py (5) ; suites entrée + cohérence
12/12 ; suite complète comparée à la base (voir PR).
Empilement — chantier « entrée SSO de bout en bout » (carte fusion #151)
Commit ajouté sur cette branche : Flowdeck 7.85.8 — la racine, sans session locale et sur instance peuplée, renvoie au pont /auth/draco quand un cookie draco valide est présenté, au lieu de servir la page publique déconnectée (l'écart exact de la capture de Bruno). Instance vierge et formulaire local ?provider=local (le chemin prévu, celui de tous les liens d'entrée internes) jamais interceptés ; sans cookie ou cookie invalide, page publique inchangée.
Tests : tests/test_entree_sso.py (5/5), cohérence 7/7 — suites ciblées vertes. La suite complète était encore en cours d'exécution au moment de ce push (80 % parcourus, aucun échec observé ; le fond connu est de 26 échecs préexistants dans les familles connecteurs/coffre/MCP/OAuth) — son résultat final sera confirmé avant fusion. Preuve navigateur : dossier preuve-entree-sso (entrée directe /workspaces connecté testeur, menu compte « Testeur Test » dès le premier affichage).
## Empilement — chantier « entrée SSO de bout en bout » (carte fusion #151)
Commit ajouté sur cette branche : **Flowdeck 7.85.8** — la racine, sans session locale et sur instance peuplée, renvoie au pont `/auth/draco` quand un cookie draco valide est présenté, au lieu de servir la page publique déconnectée (l'écart exact de la capture de Bruno). Instance vierge et formulaire local `?provider=local` (le chemin prévu, celui de tous les liens d'entrée internes) jamais interceptés ; sans cookie ou cookie invalide, page publique inchangée.
Tests : `tests/test_entree_sso.py` (5/5), cohérence 7/7 — suites ciblées vertes. La suite complète était encore en cours d'exécution au moment de ce push (80 % parcourus, aucun échec observé ; le fond connu est de 26 échecs préexistants dans les familles connecteurs/coffre/MCP/OAuth) — son résultat final sera confirmé avant fusion. Preuve navigateur : dossier `preuve-entree-sso` (entrée directe `/workspaces` connecté testeur, menu compte « Testeur Test » dès le premier affichage).
bruno
merged commit c1aa6697f0 into main2026-11-08 14:43:24 -05:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Programme « cohérence d'identité au changement de compte » (go de Bruno, 2026-11-07). Cas réel : connecté fred chez ObsiGate, Bruno ouvre l'application et y trouve son propre compte — la session locale préexistante gouvernait sans jamais reconsulter l'identité centrale. Comportement construit : quand une requête présente (a) un cookie
draco_sessionvalide (signature, expiration, révocation — mécanismes existants) dont lesubest établi et (b) une session locale d'un compte dont le sub lié diffère → la session locale est invalidée et le pont draco sert l'identité du cookie (JIT si besoin). Gardes : aucun cookie ou cookie invalide/expiré/révoqué → on ne touche à rien ; sessions de secours de la porte centrale marquées et exemptées ; pas de boucle (si le pont ne peut pas servir le sub — rôle « aucun », dissociation, compte inactif — la session est gardée plutôt que de détruire en boucle) ; compte local sans aucun lien → l'identité centrale présente gagne (choix documenté). Aucune fusion : PR en attente de l'ordre de Bruno.Mécanisme : nouveau
CoherenceDracoMiddleware(le plus externe), pages seulement (GET hors/api/,/auth/,/static/,/s/,/f/,/scim/). Comparaison : ledraco_subinscrit dans le payload signé de la session à sa création par le pont (nouveau marqueur deSessionManager.create_session, préservé parrefresh_session) — sinon le lien actif du compte. Le sub inscrit neutralise le repli mono-utilisateur de la résolution. Alignement : révocation de la ligneuser_sessions, cookie supprimé, redirection vers/auth/draco?next=…. La connexion de la porte centrale posesecours=True(session exemptée). Helper publicdraco.claims_valides(validité complète du cookie).Périmètre API : l'API n'est pas traversée — un appel en vol n'est ni interrompu ni rejoué sous une autre identité ; dès la navigation suivante, la page sert l'identité du cookie et la session alignée gouverne l'API.
Tests :
tests/test_coherence_identite.py(7) — cas de la capture (session révoquée en base, pont servant ensuite le compte du cookie, identité lue par/auth/user), même sub / sans cookie / cookie invalide intacts, secours exemptée, compte sans lien aligné, marqueur du pont. Matrice navigateur sur pile locale réelle : écart reproduit sur 7.85.6 (capture), lignes (i)–(v) vérifiées sur 7.85.7.Empilement — chantier « entrée SSO de bout en bout » (carte fusion #151)
Commit ajouté sur cette branche : Flowdeck 7.85.8 — la racine, sans session locale et sur instance peuplée, renvoie au pont
/auth/dracoquand un cookie draco valide est présenté, au lieu de servir la page publique déconnectée (l'écart exact de la capture de Bruno). Instance vierge et formulaire local?provider=local(le chemin prévu, celui de tous les liens d'entrée internes) jamais interceptés ; sans cookie ou cookie invalide, page publique inchangée.Tests :
tests/test_entree_sso.py(5/5), cohérence 7/7 — suites ciblées vertes. La suite complète était encore en cours d'exécution au moment de ce push (80 % parcourus, aucun échec observé ; le fond connu est de 26 échecs préexistants dans les familles connecteurs/coffre/MCP/OAuth) — son résultat final sera confirmé avant fusion. Preuve navigateur : dossierpreuve-entree-sso(entrée directe/workspacesconnecté testeur, menu compte « Testeur Test » dès le premier affichage).