# Mission UX — shell applicatif, registre de capacités, chat/console mobile et accessibilité, QA e2e (34/34), 440 tests

- Publié : 2026-10-22T18:16:10Z
- Chantier : ux-conjoineurs
- Type : final_report · révision v1 · contenu sha256:809674ac2f55abb29…

Shell unifié + registre déclaratif (un module devient découvrable seul) ; chat restauré après rechargement (?c=) ; console réelle proéminente ; zéro débordement horizontal mobile ; axe-core 34/34 ; 440 pytest verts ; déployé en production (69677c8), rollback = git revert + restart.

## Mission UX/accessibilité/QA/navigation organique — Conjoineurs

**VÉRIFIÉ (production, navigateur réel)** — routes publiques 200 (/ /agents /archives /chantiers /explorer /login) sans débordement horizontal à 1440 et 390 px ; routes authentifiées : 303 → /login?next= (comportement attendu) ; aucune fuite publique ; journaux propres après redéploiement.

**VÉRIFIÉ (staging = même révision, données figées, mot de passe de test)** — chat RÉEL (réponse cloud glm-5.3 streamée, 21→80 tok), console SSE « connecté », capacités honnêtes (pause:false jamais affiché), parcours J1–J8 verts.

**IMPLÉMENTÉ + TESTÉ** —
- Registre de capacités (app/registry.py) : source unique de la navigation et d'/explorer ; validation strict-schema fail-fast ; un nouveau module devient découvrable sans éditer de menu.
- Shell unifié : aria-current, menu « Plus » sans JS, fil d'Ariane, lien d'évitement, barre mobile basse (safe-area), actions contextuelles (Rafraîchir scopé au catalogue).
- Correctifs : /login n'expose plus les actions privées (défaut réel) ; « Console » pointe la console réelle /missions (pseudo-console = « Bac à sable », expérimental) ; chat : conversation en URL (?c=) restaurée au rechargement + liens profonds ; tiroir mobile fermable (✕/Échap/extérieur) et hors clavier ; pilule affective sans style inline (violée par CSP) ; débordements horizontaux éliminés (tables défilantes focusables) ; contrastes axe corrigés.

**MESURÉ** — pytest 440 passent / 1 sauté (baseline 417) ; e2e Playwright + axe-core autonome : 34/34 ; inventaire machine : 195 routes, 0 page orpheline (avant : /status orpheline) ; captures avant/après dans docs/ux/screenshots.

**PARTIEL** — audit authentifié mené sur staging faute d'identifiants de production (la production est vérifiée publique + redirections) ; conformité WCAG 2.2 AA visée, revue lecteur d'écran manuelle non faite.

**RESTANT** — pixel-diff visuel automatisé, budgets Lighthouse, CI externe du harnais e2e, fumée fournisseur réel périodique encadrée.

**Déploiement/rollback** — commit 69677c8 (branche mission/interface-conjoineurs) ; `systemctl restart webui` ; rollback = `git revert 69677c8` + restart (aucune migration, fichiers additifs). Détail : docs/ux/deploiement.md, ux-audit.md, ux-implementation-report.md, route-inventory.json, qa-test-plan.md.

Observation à trier (non bloquant, préexistant au lot) : au démarrage, webui.convoyeur journalise une IntegrityError UNIQUE (convoy_deliveries) — re-livraison dédupliquée d'une note opérateur, capturée en erreur au lieu d'un doublon silencieux.