Conjoineurs itération 2 — accessibilité publique (HEAD+www corrigés), tableau de bord projets, QA continue (66 e2e), convoyeur corrigé
Mission opérateur 2026-10-22 (itération 2, 8 phases). Branche mission/interface-conjoineurs, commits 03d80c6 + 8841f5e sur la base vérifiée 69677c8.
Phase 1 — Accessibilité publique (CORRIGÉE)
Diagnostic complet mesuré (DNS/TLS/HTTP2/redirects/robots/sitemap/WAF/UA/proxy, loopback + Internet + client externe indépendant). Deux défauts réels reproduits puis corrigés : (1) www.intelmusic.tech → handshake TLS en échec → bloc Caddy de redirection 301 vers l'apex, cert Let's Encrypt provisionné ; (2) HEAD renvoyait 405 sur /, /agents, /explorer → middleware ASGI HEAD→GET global (RFC 9110). GET avec UA ChatGPT-User fonctionnait déjà ; aucune trace de robots ChatGPT/Bing dans les logs — les échecs opérateur n'ont pas pu être reproduits (hypothèses documentées : fenêtre d'indisponibilité matinale, index Bing, URL www). Aucune compatibilité garantie avec un assistant IA particulier n'est affirmée. Doc : docs/ux/public-accessibility-diagnostic.md.
Phase 3 — Tableau de bord projets (LIVRÉ)
/projets (session) : stats missions actives/en cours/bloquées/en validation, approbations en attente, cartes projet réelles (sessions, missions reconcile, publications, alertes mémoire), dernière activité. /projets/{slug} : objectifs, blocages, prochaines actions, missions, événements, rapports publics, avancement déterministe étiqueté (jamais d'estimation LLM). /projets/{slug}/chronologie : événements filtrables (type, fenêtre, agent, sévérité). Aucune donnée factice. 5 tests dédiés.
Phase 4 — Expérience rapport (LIVRÉE)
TOC ancré généré serveur (≥3 titres), bouton « Copier le lien » progressif, permaliens/MD/JSON confirmés existants depuis l'itération 1, assainisseurs et révisions immuables inchangés.
Phase 5 — QA continue (LIVRÉE)
e2e étendu à 66 contrôles : régression visuelle (18 baselines commitées, tolérance 0,5 % pixels, masquage dates/ids), budgets perf (navigation ≤1500 ms, LCP ≤2000 ms, CLS ≤0,1, page ≤400 ko, JS ≤200 ko — baseline mesurée), reflow 320 px (WCAG 1.4.10), prefers-reduced-motion, skip-link clavier. Défaut réel trouvé et corrigé : form.search débordait à 320 px. Doc : docs/ux/perf-and-visual-baseline.md. Lighthouse CLI non installé → équivalent Performance API (autorisé par le brief).
Phase 6 — Découverte organique (LIVRÉE)
Module « projets » enregistré dans app/registry.py (schéma strict validé au chargement, nav ≤8 primaire préservée) ; découvrable dans /explorer sans modification de menu. Guide : docs/ux/module-registry-integration.md.
Phase 7 — Observabilité convoyeur (CORRIGÉ)
Cause racine : IntegrityError minute-dédup dans _deliver_operator_note → INSERT OR IGNORE idempotent. Bonus : RuntimeError uvicorn « content longer than Content-Length » (204 avec corps b'null' sur claim) → Response vide. Aucune récurrence post-déploiement. Doc : docs/ux/phase7-convoer-investigation.md.
Tests
pytest : 447 tests verts (+6 nouveaux). e2e staging isolé : 66/66 PASS deux runs consécutifs (visuel, budgets perf, a11y, journeys chat/console).
PARTIAL / NON FAIT (explicite)
- Phase 2 : journeys authentifiés EN PRODUCTION non testés — exige une identité de test à durée courte autorisée ou une session assistée par l'opérateur (aucun mot de passe réel disponible, MFA/session non affaiblis). Couverts en staging isolé.
- Revue lecteur d'écran humaine : non réalisée.
- Android physique : non disponible (émulation 390 px + reflow 320 px).
Rollback
git revert 8841f5e et 03d80c6 + systemctl restart webui ; bloc www dans [chemin-interne] → retirer + systemctl reload caddy. Aucune migration de schéma. Fonctionnalités existantes intactes (447 verts avant/après).
Formats : Markdown · JSON · lien permanent : /rapports/pub-877a9b3b9941bb4a