DRAFT INTERNE : NO GO publication client en l'état (Legal-check 2026-05-24)
Bet224 n'est PAS sur la liste officielle des plateformes agréées ARSJPA [VERIFIED via WebFetch arsjpa.gov.gn/plateformes-agreees/ 2026-05-24]. Les 7 plateformes agréées : Geniusbet, Yellowbet, 1xBet GN, Guinée Games, Pariez GDJ, LONAGUI, Guinée Millions.
Action immédiate recommandée client (priorité absolue, prime sur les recos ci-dessous) : retrait du logo ARSJPA présent sur 42 pages du site dans les heures qui suivent réception du rapport.
5 préalables clients obligatoires avant publication FULL :
- Copie agrément ARSJPA OU reconnaissance non-agrément + plan régularisation
- Raison sociale + RCCM Guinée + représentant légal
- Organigramme entité GN vs opérateur étranger (white-label italien suspecté)
- Confirmation conseil juridique sur cadre data GN
- Confirmation dispositif central auto-exclusion GN
Détail red team adversarial (7 agents) : voir
_red-team-report.md.
Avertissement YMYL : ce rapport analyse le site bet224.gn, opérateur de paris sportifs et de casino en ligne en Guinée. Secteur YMYL (Your Money Your Life). Le régulateur identifié est l'ARSJPA (https://arsjpa.gov.gn/, vérifié WebFetch 2026-05-16, statut d'agrément Bet224 vérifié WebFetch 2026-05-24 : NON AGRÉÉE).
Généré : 2026-05-24T10:56:26.777867+00:00 Recos total : 69 Priorisation : RICE (cf annexes/methodologie-product-audit.md) Override : conformité légale = HIGH forcée quel que soit le score RICE
Priorité HIGH (RICE ≥ 30)
R-A11Y-01-01 : Retirer maximum-scale=1 de la meta viewport sur toutes les routes
- Findings adressés : F-A11Y-01-11
- Routes concernées :
casino - Priorité RICE : R=5 I=5 C=5 E=1 → score=125.0
- Action concrète :
Remplacer la valeur de la meta viewport sur toutes les routes par width=device-width, initial-scale=1. Retirer impérativement maximum-scale=1 et minimum-scale=1. Fix template <head> global (probablement un seul layout partial à modifier). Vérifier qu'aucun CSS touch-action: pan-x global ne réintroduit le blocage.
- Copy-ready :
Balise meta à appliquer : <meta name="viewport" content="width=device-width, initial-scale=1">
- Effort estimé : S
- Validation :
Re-run axe-core sur les 4 routes : violations[].id == "meta-viewport" doit retourner 0. Test manuel mobile : pincer pour zoomer sur le contenu casino doit fonctionner.
R-PERF-01-01 : Fetcher CrUX + PageSpeed Insights en V2 (CRITIQUE pour audit perf vrai)
- Findings adressés : F-PERF-01-01, F-PERF-01-02, F-PERF-01-03, F-PERF-01-04, F-PERF-01-05
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=1 → score=125.0
- Action concrète :
Avant la prochaine itération de cet audit (V2), configurer les deux clés API : CRUX_API_KEY (Google Chrome UX Report API, gratuit avec quota) et PSI_API_KEY (PageSpeed Insights API, gratuit avec quota). Lancer toolkit/tools/fetch_crux.py sur les 4 routes avec form_factor=PHONE ET form_factor=DESKTOP. Lancer toolkit/tools/fetch_pagespeed.py sur les 4 routes avec strategy=mobile ET strategy=desktop. Régénérer DEEP-PERF-02 avec ces inputs pour avoir : LCP p75 / INP p75 / CLS p75 vrais users + LCP element identifié + render-blocking diagnostics quantifiés + opportunités Lighthouse scorées.
- Copy-ready :
Pas de copy littéraire. Variables d'env à set : CRUX_API_KEY="..." et PSI_API_KEY="...". Commandes : python toolkit/tools/fetch_crux.py --crawl-dir toolkit/clients/bet224/2026-05-24/crawl --form-factors PHONE DESKTOP et python toolkit/tools/fetch_pagespeed.py --crawl-dir toolkit/clients/bet224/2026-05-24/crawl --strategies mobile desktop.
- Effort estimé : S
- Validation :
Présence des fichiers crux.json et pagespeed/<hash>.json dans crawl/. Le DEEP-PERF-02 doit pouvoir citer des champs crux.json → metrics.largest_contentful_paint.percentiles.p75 pour chaque route × form_factor.
R-TRUST-01-01 : Lancer red team Legal-check + obtenir client n° licence ARSJPA + cadre data GN + raison sociale opérateur (PRIORITÉ ABSOLUE)
- Findings adressés : F-TRUST-01-01, F-TRUST-01-02, F-TRUST-01-03, F-TRUST-01-04, F-TRUST-01-05, F-TRUST-01-07, F-TRUST-01-08, F-TRUST-01-09, F-TRUST-01-10, F-TRUST-01-12, F-TRUST-01-13
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=1 → score=125.0
- Action concrète :
Avant assemble_audit final : (1) Demander au client la documentation suivante : copie du document d'agrément ARSJPA (numéro, date, périmètre), raison sociale de l'entité opératrice (canonical_legal), siège social, numéro RCCM (OHADA), contact juridique, organigramme entité GN vs éventuelle entité étrangère du groupe. (2) Lancer un agent Legal-check spécialisé GN gambling qui doit identifier sur sources primaires guinéennes : décret de création ARSJPA (numéro + date exacte), texte d'application encadrant la publicité gambling en GN, seuil d'âge légal pour parier en GN, mentions obligatoires en pied de page selon ARSJPA, cadre data / consentement cookies applicable en GN (loi data GN ou cadre OHADA / CEDEAO si existant). (3) Vérifier sur arsjpa.gov.gn la présence ou non de Bet224 sur la liste des "Plateformes agréées" (contenu non extrait en session). (4) Mettre à jour site-context.yaml facts.allowed et legal_naming_restrictions avec les faits sourcés. (5) Patcher _subagent-outputs/DEEP-TRUST-01.md en conséquence (passage de findings de "obligation morale" à "obligation légale" si applicable).
- Copy-ready :
Brief Legal-check à remettre à l'agent (à copier tel quel) : "Mission Legal-check Bet224 (juridiction Guinée, secteur paris sportifs + casino en ligne). À sourcer sur sources primaires guinéennes : (1) Décret de création de l'ARSJPA (https://arsjpa.gov.gn/) : numéro et date exacte. (2) Texte d'application sur la publicité gambling en GN : promesses de gain interdites ? Mentions obligatoires pour bannières promo ? (3) Seuil d'âge légal pour parier en GN (NE PAS supposer 18 par défaut, vérifier). (4) Mentions obligatoires en pied de page selon ARSJPA : raison sociale, n° licence, n° RCCM, contact, jeu responsable, mention d'âge, lesquelles sont obligatoires ? (5) Cadre data / cookies en GN : loi data GN existante ? cadre OHADA ou CEDEAO applicable ? Consentement cookies : quelle pratique attendue ? (6) Vérifier sur arsjpa.gov.gn la liste 'Plateformes agréées' : Bet224 y figure-t-il ? Sous quel nom ? Avec quel numéro ? (7) Identifier toute jurisprudence ou décision ARSJPA sur opérateurs sanctionnés. Livrable : note 1-2 pages sourcée + mise à jour site-context.yaml + verdict GO / NO GO pour publication des recos R-TRUST-01-02 à R-TRUST-01-11."
- Effort estimé : M
- Validation :
Note Legal-check produite avec sources primaires (URLs arsjpa.gov.gn + textes officiels GN). site-context.yaml mis à jour : facts.allowed.entities rempli, legal_naming_restrictions.references complété avec décret + date, facts.to_confirm réduit (idéalement vide ou réduit à 1-2 items résiduels). Brand canonical_legal rempli (raison sociale opérateur). Avant assemble_audit final, ce bloc de validation doit être passé à 100 %, sinon le livrable doit être marqué "preview" et le FULL bloqué.
R-TRUST-01-11 : Préparer un disclaimer YMYL à intégrer en tête du livrable + brief Legal-check pour bouclage obligatoire avant publication
- Findings adressés : F-TRUST-01-02, F-TRUST-01-03, F-TRUST-01-04, F-TRUST-01-07, F-TRUST-01-11
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=1 → score=125.0
- Action concrète :
(1) Intégrer en tête de analyse.md ET de plan-action.md un disclaimer YMYL spécifique gambling Guinée (copy-ready ci-dessous). (2) Lancer l'agent Legal-check du red team adversarial AVANT toute publication (boucle itérative jusqu'à 0 erreur HIGH selon CLAUDE.md projet). (3) Documenter les arbitrages Legal-check dans _red-team-report.md avec verdict GO / GO with patches / NO GO.
- Copy-ready :
Disclaimer en tête de analyse.md et plan-action.md : > Avertissement YMYL : ce rapport analyse le site bet224.gn, opérateur de paris sportifs et de casino en ligne en Guinée. Le secteur est classé YMYL (Your Money Your Life) en raison de l'impact financier et sanitaire potentiel sur les utilisateurs (risque d'addiction, perte d'argent, exposition de mineurs si protection absente). Les recommandations ci-dessous reposent sur (1) des observations sourcées du crawl du site (HTML, screenshots, signaux conversion-signals/axe-core), et (2) les standards internationaux du secteur gambling (UKGC, ANJ, MGA, ADM, etc.). La juridiction applicable est la Guinée. Le régulateur identifié est l'ARSJPA (https://arsjpa.gov.gn/, vérifié WebFetch 2026-05-16). Le statut d'agrément de Bet224 et le cadre réglementaire guinéen exact pour la publicité gambling, la protection des mineurs, le consentement cookies, et les mentions obligatoires N'ONT PAS été vérifiés en source primaire dans cette session. Toute recommandation marquée "conformité légale : false" est calibrée sur l'obligation morale sectorielle et le risque réputationnel ; elle doit être re-évaluée par l'agent Legal-check du red team avant publication finale.
- Effort estimé : S
- Validation :
Présence du disclaimer en tête de analyse.md ET plan-action.md après assemblage. Présence du _red-team-report.md avec section Legal-check + verdict explicite. Si verdict NO GO : interdiction de publication tant que les findings Legal-check HIGH ne sont pas résolus.
R-A11Y-01-02 : Ajouter alt et aria-label sur logo header et lien de retour accueil
- Findings adressés : F-A11Y-01-01
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=1 → score=100.0
- Action concrète :
Dans le template du header, modifier la balise <img> du logo pour ajouter un alt, et ajouter un aria-label sur le <a> parent. Le fix est unique pour les 4 routes (template commun confirmé).
- Copy-ready :
HTML cible : <a href="/" aria-label="Bet224, retour à l'accueil"><img src="https://www.bet224.gn/external_cms/GUINEA/img/logo-bet-224.png" alt="Bet224"></a> (texte alt et label conformes au cadrage site-context.yaml brand.canonical_display = "Bet224", aucune incitation au jeu, ton sobre).
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "image-alt" pour le logo header retourne 0, violations[].id == "link-name" pour a[href="/"] retourne 0. Test NVDA / VoiceOver : le lien doit être annoncé "Bet224, retour à l'accueil, lien".
R-TRUST-01-05 : Lier fonctionnellement le logo ARSJPA vers le registre officiel + ajouter alt text + augmenter la visibilité
- Findings adressés : F-TRUST-01-01
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=1 → score=100.0
- Action concrète :
(1) D'abord trancher avec Legal-check : Bet224 est-elle agréée ARSJPA ? Si NON : RETIRER l'image ARSJPA.png partout. Si OUI : appliquer les correctifs ci-dessous. (2) Wrapper l'image dans un <a> avec href réel pointant vers la page officielle de Bet224 sur arsjpa.gov.gn (si l'ARSJPA fournit des URLs profondes par opérateur, sinon vers la liste générale) ou vers /licence (page interne, cf R-TRUST-01-02). (3) Ajouter un alt descriptif sur l'image. (4) Augmenter la taille visible (typiquement 60-80px de hauteur, pas 35px de largeur). (5) Le déplacer en zone footer permanent (cf R-TRUST-01-03) où la mention "Agréé par l'ARSJPA n° X" sera proche du logo.
- Copy-ready :
Cas où Bet224 est agréée (à publier APRÈS confirmation Legal-check) : <a href="https://arsjpa.gov.gn/[chemin-bet224-si-existant]" target="_blank" rel="noopener noreferrer" aria-label="Voir la fiche Bet224 sur le registre officiel de l'ARSJPA (nouvel onglet)"> <img src="https://www.bet224.gn/external_css/GUINEA/img/ARSJPA.png" alt="Logo de l'ARSJPA, Autorité de Régulation du Secteur des Jeux et Pratiques Assimilées de Guinée. Bet224 est agréée sous le numéro [À COMPLÉTER]." style="height:60px;width:auto"> </a> Cas où Bet224 N'EST PAS agréée : RETIRER complètement le bloc <div id="cg-social-link-container">...<img src="...ARSJPA.png">...</div> du template. Documentation patch à appliquer : supprimer lignes 386-393 de sport-home.raw.html (et équivalent sur toutes les pages template).
- Effort estimé : S
- Validation :
Si agréée : inspection des 4 screenshots → logo ARSJPA visible (≥60px), avec alt audit-script (grep alt="" sport-home.raw.html ne doit plus matcher la ligne ARSJPA). Test focus clavier : Tab atteint le <a> qui ouvre le lien externe. Test cross-angle A11Y : règle image-alt n'est plus violée sur ce node (axe-results recheck). Si non agréée : grep ARSJPA sur les fichiers raw HTML re-crawlés = 0 occurrence.
R-TRUST-01-08 : Ajouter identifiants commerciaux guinéens (RCCM + agrément ARSJPA) sur footer permanent et mentions légales
- Findings adressés : F-TRUST-01-08
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=1 → score=100.0
- Action concrète :
(1) Obtenir du client (cf R-TRUST-01-01) : raison sociale exacte de l'entité opératrice (canonical_legal), siège social, RCCM, n° d'agrément ARSJPA. (2) Intégrer ces 4 identifiants dans le disclaimer permanent du footer (cf R-TRUST-01-03). (3) Intégrer le détail complet (raison sociale, capital, représentant légal, RCS) dans la page /mentions-legales (cf R-TRUST-01-02 copy-ready). (4) Patcher le détecteur conversion-signals v1.3 pour ajouter une regex RCCM (format OHADA : RCCM \w{2}-\w{3}-[0-9]{4}-[A-Z]-[0-9]{4,} approximatif, à valider source OHADA) et ne plus déclencher de faux positif sur les mots majuscules du contenu.
- Copy-ready :
Mention footer permanent (à intégrer dans le bloc disclaimer cf R-TRUST-01-03) : <p>Bet224 est édité par <strong>[Raison sociale]</strong>, [forme juridique, ex. SARL] au capital de [montant] GNF, siège social [adresse complète Conakry], immatriculée au RCCM sous le n° <strong>[n° RCCM]</strong>. Bet224 opère sous l'agrément de l'<abbr title="Autorité de Régulation du Secteur des Jeux et Pratiques Assimilées">ARSJPA</abbr> n° <strong>[n° agrément]</strong> délivré le [date]. <a href="https://arsjpa.gov.gn/" target="_blank" rel="noopener">Vérifier sur le registre officiel</a>.</p>
- Effort estimé : S
- Validation :
Re-crawl 4 routes : conversion-signals/<route>.json → detailed.trust_signals.footer_text_length_chars > 2000 (vs 1236 actuel). Grep raw HTML : présence des chaînes "[Raison sociale]", "[n° RCCM]", "[n° agrément]" remplacées par valeurs réelles. Patcher détecteur v1.3 : has_vat_eu et has_siret doivent désormais retourner false (faux positifs corrigés) ; un nouveau champ has_rccm doit retourner true si RCCM présent. Test cross-link : <a href="https://arsjpa.gov.gn/"> fonctionne.
R-TRUST-01-09 : Exposer contact opérateur visible (email support + numéro téléphone GN + formulaire) dans header ou footer permanent
- Findings adressés : F-TRUST-01-09
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=1 → score=100.0
- Action concrète :
(1) Remplir le container cg-contatti du header (actuellement <div class="blocco-header flex-container cg-contatti"></div>, vide) avec un email support + numéro téléphone GN + lien /contact. (2) Intégrer la même info en footer permanent (cf R-TRUST-01-03 bloc "Aide et opérateur"). (3) Créer la page /contact (soft 404 actuellement) avec formulaire de contact fonctionnel + email + téléphone + adresse + horaires support. (4) Si chat live disponible : ajouter widget chat persistant.
- Copy-ready :
Container header (à intégrer à la place de <div class="blocco-header flex-container cg-contatti"></div>) : <div class="blocco-header flex-container cg-contatti"> <a href="mailto:[support@bet224.gn]" aria-label="Email support Bet224"><i class="fas fa-envelope"></i> [support@bet224.gn]</a> <a href="tel:+224[numero]" aria-label="Téléphone support Bet224 Guinée"><i class="fas fa-phone"></i> +224 [XX XX XX XX]</a> <a href="/contact">Nous contacter</a> </div> Squelette page /contact : <h1>Nous contacter</h1> <p>L'équipe support Bet224 est joignable [horaires, ex. 24h/24 et 7j/7, à confirmer client].</p> <h2>Email</h2> <p><a href="mailto:[support@bet224.gn]">[support@bet224.gn]</a></p> <h2>Téléphone</h2> <p>+224 [XX XX XX XX]</p> <h2>Adresse postale</h2> <p>[Raison sociale], [adresse complète Conakry]</p> <h2>Formulaire de contact</h2> <form action="/contact/submit" method="POST"> <label for="contact-name">Nom complet</label><input id="contact-name" name="name" required> <label for="contact-email">Email</label><input id="contact-email" name="email" type="email" required> <label for="contact-subject">Sujet</label><select id="contact-subject" name="subject" required><option>Question générale</option><option>Problème de dépôt</option><option>Problème de retrait</option><option>Fermeture de compte</option><option>Auto-exclusion</option><option>Autre</option></select> <label for="contact-message">Message</label><textarea id="contact-message" name="message" rows="6" required></textarea> <button type="submit">Envoyer</button> </form>
- Effort estimé : M
- Validation :
Re-crawl 4 routes : conversion-signals/<route>.json → detailed.trust_signals.contact_email_visible = true, contact_phone_visible_in_footer = true. Page /contact : body page ≠ 404, présence d'un <form action> avec ≥ 4 champs (cross-link CONV : analyse forms). Test mailto et tel: cliquables.
R-A11Y-01-07 : Nommer le bouton de fermeture du header (icône X)
- Findings adressés : F-A11Y-01-05
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=5 E=1 → score=75.0
- Action concrète :
Ajouter un aria-label sur le <a id="nascondiHeader">. L'attribut aria-expanded="false" déjà présent est OK car l'élément a role="button" explicite. Fix template header commun aux 4 routes.
- Copy-ready :
Attribut à ajouter : aria-label="Masquer le menu de navigation" (ton sobre, factuel, conforme site-context.yaml voice_and_tone).
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "link-name" pour #nascondiHeader retourne 0. Test NVDA : le lien est annoncé "Masquer le menu de navigation, bouton, réduit".
R-SEO-01-03 : Ajouter Open Graph + Twitter Cards sur les 4 routes (partage social et fallback LLM)
- Findings adressés : F-SEO-01-03
- Routes concernées :
sport-home,sport,casino,promotions - Priorité RICE : R=5 I=3 C=5 E=1 → score=75.0
- Action concrète :
Ajouter dans le <head> de chaque route les meta tags Open Graph (og:title, og:description, og:image, og:url, og:type, og:site_name, og:locale) et Twitter Cards (twitter:card, twitter:title, twitter:description, twitter:image). Valeurs alignées sur les title / description du R-SEO-01-01 pour cohérence cross-canal. Préparer une image OG dédiée 1200×630 px par route (logo Bet224 + visuel sectoriel : ballon football pour sport, jeton casino pour casino, etiquette bonus pour promotions).
- Copy-ready :
Bloc OG sport-home à insérer dans le <head> : <meta property="og:title" content="Bet224 Guinée : paris sportifs, casino et bonus en ligne" /> <meta property="og:description" content="Bet224 Guinée, site de paris sportifs en ligne. Pariez sur le football, la Premier League, la Ligue 1 et la Champions League. Cotes en direct." /> <meta property="og:image" content="https://www.bet224.gn/external_cms/GUINEA/img/og-image-sport-home.jpg" /> <meta property="og:url" content="https://www.bet224.gn/sport-home" /> <meta property="og:type" content="website" /> <meta property="og:site_name" content="Bet224" /> <meta property="og:locale" content="fr_GN" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Bet224 Guinée : paris sportifs, casino et bonus en ligne" /> <meta name="twitter:description" content="Bet224 Guinée, site de paris sportifs en ligne. Pariez sur le football et le casino en direct." /> <meta name="twitter:image" content="https://www.bet224.gn/external_cms/GUINEA/img/og-image-sport-home.jpg" /> Adapter les 3 autres routes avec les title / description du R-SEO-01-01 + 1 image dédiée par route.
- Effort estimé : S
- Validation :
Re-crawl puis grep og: et twitter: sur chaque raw HTML retourne ≥ 12 occurrences (7 OG + 4 Twitter + 1 type). Test Facebook Sharing Debugger https://developers.facebook.com/tools/debug/ et Twitter Card Validator (legacy) ou OG inspector sur chaque URL retourne preview correct avec image, title et description attendus.
R-UX-01-03 : Nettoyer les meta description / keywords résiduels d'autres marques
- Findings adressés : F-UX-01-05
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=5 E=1 → score=75.0
- Action concrète :
Réécrire les <meta name="description"> et <meta name="keywords"> (si conservées) en supprimant toute occurrence de "Sportcash.com" et "Ivory Coast" / "Côte d'Ivoire" / "Loterie Ivory Coast". Remplacer par un texte adapté à Bet224 en Guinée, respectant site-context.yaml → voice_and_tone.avoid (pas de superlatif, pas de promesse de gain).
- Copy-ready :
Meta descriptions (proposition) :
sport-home:<meta name="description" content="Bet224, paris sportifs en ligne en Guinée. Consultez les cotes du jour sur le football et les autres sports.">sport:<meta name="description" content="Toutes les compétitions sportives disponibles pour parier sur Bet224 en Guinée.">casino:<meta name="description" content="Catalogue des jeux de casino disponibles sur Bet224 en Guinée, classés par éditeur.">promotions:<meta name="description" content="Promotions et bonus en cours sur Bet224 en Guinée. Consultez les conditions de chaque offre avant de l'activer.">
Meta keywords (option : supprimer purement) : si conservée pour des raisons internes, remplacer par <meta name="keywords" content="Bet224, paris sportifs, Guinée, football, casino en ligne"> (ne plus mentionner Ivory Coast, Sportcash, Loterie). Toast EN (raw_html_sport_home ligne 875) : remplacer le contenu par français, ex <div class="cg-toast-desc-content">Cliquez <span onclick="cg_open_user_details();cg_close_toast(this)">ICI</span> pour configurer votre compte, ou <span onclick="cg_never_show_this_again(this)">ICI</span> pour ne plus afficher ce message.</div>.
- Effort estimé : S
- Validation :
Re-crawl puis vérifier index.json → pages[].description ne contient plus "Sportcash.com" ni "Ivory Coast". grep -i "Ivory Coast\|Sportcash" *.raw.html retourne 0.
R-CONV-01-01 : Réécrire les bandeaux promotionnels above-fold sans promesse de gain ni superlatif
- Findings adressés : F-CONV-01-01
- Routes concernées :
sport-home,promotions - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
Remplacer les 3 visuels JPG des bannières hero (BPD_SPORT_1800X600_promotions.jpg, CASHBACK_1800X600_promos.jpg, et la bannière MAXI BONUS sur promotions) par des versions factuelles. Retitrer les 3 cards "MAXI BONUS / CASHBACK SPORT / WELCOME SPORT" sur la page promotions. Ajouter une mention explicite des conditions de mise (wagering) en visible above-fold sur chaque card, pas en caractères minuscules.
- Copy-ready :
Bandeau hero sport-home option 1 (factuel) : "Bonus de bienvenue : 100 % de votre 1er dépôt offerts en Fun Bonus Sport, jusqu'à 1 000 000 GNF. Voir les conditions de mise." (143 chars). Bandeau hero sport-home option 2 (plus court) : "Bonus de 1er dépôt jusqu'à 1 000 000 GNF en Fun Bonus Sport. Conditions de mise applicables." (95 chars). CTA bannière (1-4 mots) : "Voir les conditions" (à la place de "PARIEZ ICI" ou "INSCRIVEZ-VOUS"). Card MAXI BONUS retitrée : "Bonus de mise : jusqu'à 500 % du premier pari combiné. Voir les conditions." (75 chars). Card CASHBACK SPORT : "Cashback hebdomadaire sur les paris perdants, jusqu'à 500 000 GNF. Voir les conditions." (88 chars). À PROSCRIRE absolument : tout verbe "GAGNEZ" ou dérivés, tout "100 % gratuit", tout superlatif "BEST" / "N°1" / "leader", tout "PARIEZ ICI" en CTA bannière promotionnelle.
- Effort estimé : S
- Validation :
Sur les screenshots de re-crawl : aucun mot interdit de voice_and_tone.avoid ni claims.forbidden ne doit apparaître dans la zone above-fold (y < 900) des routes sport-home et promotions. Vérification par OCR du screenshot ou re-crawl text. Re-run par DEEP-CONV-02 obligatoire pour valider.
R-CONV-01-02 : Exposer en footer permanent les liens vers jeu responsable, auto-exclusion, mention d'âge et licence
- Findings adressés : F-CONV-01-02, F-CONV-01-06
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
Rendre le footer visible par défaut (supprimer le pattern accordion consulta-footer fissato accordion-toggle toggle-nascondi, exposer directement le bloc en bas de page). Y ajouter une rangée dédiée "Jouer responsable" en above-fold du footer avec 5 liens minimum : Jeu responsable, Auto-exclusion, Limites de dépôt, Aide et support, Contact. Ajouter sur le même bloc une mention d'âge claire (forme "Interdit aux mineurs", seuil à confirmer client + Legal-check pour cadre GN).
- Copy-ready :
Wording bloc footer (à coller dans un nouveau <div class="footer-responsible-gaming">) : <h3>Jouer responsable</h3> <ul> <li><a href="/jeu-responsable">Jeu responsable</a></li> <li><a href="/auto-exclusion">Auto-exclusion et limites</a></li> <li><a href="/aide">Aide et support</a></li> <li><a href="/contact">Nous contacter</a></li> <li><a href="/licence">Licence et réglementation</a></li> </ul> <p>Interdit aux mineurs. Le jeu d'argent peut entraîner une dépendance. Jouez avec modération.</p> (seuil d'âge exact à confirmer client + Legal-check ; en attendant "Interdit aux mineurs" est défensif) ATTENTION : NE PAS utiliser le wording italien hard-codé header.disclaimer = "Il gioco è vietato ai minori di diciotto anni..." qui référencie le régulateur italien ADM et n'est ni traduit ni applicable.
- Effort estimé : M
- Validation :
Re-crawl 4 routes, conversion-signals/<route>.json → detailed.trust_signals.legal_links_count >= 5 (au lieu de 2 actuellement). detailed.trust_signals.contact_email_visible = true. Tester en clavier : Tab depuis le top de page doit atteindre les liens responsables en footer en ≤ 50 stops.
R-MOBILE-01-01 : Recapturer les inputs mobile en V2 audit (screenshots + axe + CrUX)
- Findings adressés : F-MOBILE-01-01, F-MOBILE-01-02, F-MOBILE-01-03, F-MOBILE-01-04
- Routes concernées :
all,/inscription,/login,/depot - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
V2 audit doit produire : (1) screenshots/<slug>/mobile.png 390x844 DPR=3 pour les 4 routes vitrine + 3 routes funnel minimum, (2) axe-results/<slug>/mobile.json avec les 7+ règles WCAG 2.1 AA sur chaque route mobile, (3) crux.json avec form_factor=PHONE si CRUX_API_KEY configurée (sinon mention explicite que la donnée terrain mobile est manquante), (4) page-signals/<slug>.signals.json enrichi avec viewport_meta (présence + valeur) et touch_targets (count de cibles < 44x44 mesurées sur viewport mobile, pas desktop). Outils à implémenter ou compléter dans toolkit/tools/ : capture_screenshots.py, run_axe_core.py, fetch_crux.py.
- Copy-ready :
N/A (action outillage, pas rédactionnel).
- Effort estimé : M
- Validation :
axe-results/index.json → results[].mobile.path != None pour toutes les routes ; screenshots/<slug>/mobile.png existe pour les 4 routes vitrine + 3 routes funnel ; axe-results/<slug>/mobile.json parseable avec violations[] non vide ; crux.json contient form_factor=PHONE ou mention explicite de manque.
R-SEO-01-01 : Réécrire les titles et meta descriptions des 4 routes principales avec brand canonique et intent différencié
- Findings adressés : F-SEO-01-01
- Routes concernées :
sport-home,sport,casino,promotions - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
Modifier les templates SEO route par route dans le back-office CMS CoreGaming, pour porter la brand canonique "Bet224", inclure le primary keyword mappé, ajouter le qualificatif géo "Guinée" en fin (signal géo-intent SERP) et garder ≤ 60 chars sur le title et 140-160 chars sur la description. Supprimer toute mention "Sportcash.com" et "Ivory Coast" (legacy CMS d'un autre opérateur). Aligner la meta keywords (faible poids SEO mais signal interne brand) si conservée.
- Copy-ready :
Title sport-home : Bet224 Guinée : paris sportifs, casino et bonus en ligne (54 chars, brand + 3 verticales + géo). Description sport-home : Bet224 Guinée, site de paris sportifs en ligne. Pariez sur le football, la Premier League, la Ligue 1 et la Champions League. Cotes en direct. (148 chars, brand + intent + 4 keywords secondaires + signal live). Title sport : Paris sportifs en ligne Guinée : cotes football | Bet224 (56 chars, primary + secondary + brand). Description sport : Pariez en ligne sur les meilleurs matchs de football avec Bet224 Guinée : Premier League, Ligue 1, La Liga, Champions League. Cotes mises à jour. (148 chars). Title casino : Casino en ligne Guinée : jeux et machines à sous | Bet224 (57 chars, primary + secondary + brand). Description casino : Découvrez le casino en ligne Bet224 Guinée : machines à sous, jeux de table et providers Spribe, Evolution, Amigo Gaming. Jeu réservé aux majeurs. (149 chars, primary + 3 providers + mention âge). Title promotions : Bonus paris sportifs Bet224 Guinée : promotions en ligne (56 chars, primary + brand + géo). Description promotions : Profitez des bonus de bienvenue, codes promo et offres exclusives Bet224 Guinée sur vos paris sportifs et casino. Conditions de mise détaillées. (148 chars, primary + 3 secondaires + mention conditions, conforme site-context.yaml claims.forbidden "Bonus sans condition").
- Effort estimé : S
- Validation :
Re-crawl post-déploiement avec html_downloader.py puis vérifier : crawl/index.json pages[].title = valeurs copy-ready ci-dessus (longueur 50-60 chars, primary keyword inclus, mention "Bet224" inclus, "Sportcash.com" absent). Idem pages[].description (140-160 chars, "Bet224" présent, "Sportcash" absent).
R-TRUST-01-03 : Rendre le footer visible par défaut + restructurer en bloc "Jouer responsable" + bloc "Légal + opérateur" + bloc "Aide"
- Findings adressés : F-TRUST-01-06, F-TRUST-01-04, F-TRUST-01-09
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
(1) Supprimer le pattern accordion consulta-footer fissato accordion-toggle toggle-nascondi et le bouton "OUVRIR PIED DE PAGE". Le footer doit être visible directement en bas de page sans interaction. Supprimer aussi class="cg-lazy" du <footer> pour chargement immédiat. (2) Restructurer le contenu du footer en 3 colonnes : "Jouer responsable" (jeu responsable, auto-exclusion, limites de dépôt, où trouver de l'aide), "Légal" (mentions légales, CGU, politique de confidentialité, politique cookies, licence ARSJPA), "Aide & opérateur" (contact, FAQ, à propos, support). (3) Ajouter en bas du footer un bloc disclaimer permanent avec mention d'âge légal (seuil exact à confirmer Legal-check), logo ARSJPA avec href vers le registre, raison sociale + n° licence opérateur. (4) Tester l'accessibilité clavier (Tab depuis le top doit atteindre le footer en ≤50 stops, cross-link A11Y).
- Copy-ready :
Structure HTML cible footer (à intégrer dans nascondifooter mais SANS class collapse cg-lazy, et SANS bouton "OUVRIR PIED DE PAGE") : <footer id="site-footer" class="bg-footer text-light pt-4"> <div class="container"> <div class="row"> <div class="col-lg-4"> <h3>Jouer responsable</h3> <ul class="list-unstyled"> <li><a href="/jeu-responsable">Jeu responsable</a></li> <li><a href="/auto-exclusion">Auto-exclusion et limites</a></li> <li><a href="/limites-depot">Limites de dépôt</a></li> <li><a href="/aide-joueurs">Où trouver de l'aide</a></li> </ul> </div> <div class="col-lg-4"> <h3>Légal</h3> <ul class="list-unstyled"> <li><a href="/mentions-legales">Mentions légales</a></li> <li><a href="/cgu">Conditions générales d'utilisation</a></li> <li><a href="/privacy">Politique de confidentialité</a></li> <li><a href="/cookies">Politique des cookies</a></li> <li><a href="/licence">Licence et réglementation</a></li> </ul> </div> <div class="col-lg-4"> <h3>Aide et opérateur</h3> <ul class="list-unstyled"> <li><a href="/contact">Nous contacter</a></li> <li><a href="/aide">Aide et FAQ</a></li> <li><a href="/a-propos">À propos de Bet224</a></li> </ul> </div> </div> <div class="footer-disclaimer border-top pt-3 mt-3"> <p>[Raison sociale opérateur à compléter] - Siège social : [adresse Conakry] - RCCM [n°] - Agréé par l'ARSJPA sous le numéro [à compléter]. <a href="https://arsjpa.gov.gn/" target="_blank" rel="noopener"><img src="https://www.bet224.gn/external_css/GUINEA/img/ARSJPA.png" alt="Logo de l'ARSJPA, autorité guinéenne de régulation des jeux" style="height:30px"></a></p> <p><strong>Interdit aux mineurs.</strong> Le jeu d'argent peut entraîner une dépendance. Jouez avec modération. <a href="/jeu-responsable">Plus d'informations</a>. (Seuil d'âge légal à confirmer Legal-check, "Interdit aux mineurs" est défensif en attendant.)</p> </div> </div> </footer>
- Effort estimé : M
- Validation :
Re-crawl 4 routes : conversion-signals/<route>.json → detailed.trust_signals.legal_links_count >= 8 (vs 2 actuellement), contact_email_visible = true (si email réel intégré). Inspection visuelle des 4 screenshots : footer visible directement sans interaction, contenant les 3 colonnes + disclaimer permanent. Test clavier : Tab depuis top atteint le footer en ≤ 50 stops. Test axe-core : aucune nouvelle violation sur le footer (cross-link A11Y).
R-TRUST-01-04 : Ajouter une mention d'âge claire en footer permanent + implémenter un age-gate avant accès au catalogue casino
- Findings adressés : F-TRUST-01-07
- Routes concernées :
all,casino,sport,sport-home,promotions - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
(1) Ajouter une mention "Interdit aux mineurs" en footer permanent visible sur les 4 routes (cf R-TRUST-01-03 copy-ready footer disclaimer). (2) Implémenter un age-gate : modal/overlay couvrant tout l'écran à la première visite du site (cookie de mémorisation 30 jours minimum), demandant à l'utilisateur de confirmer son âge avant accès au catalogue. (3) Sur la modal, mention claire du seuil légal GN + bouton "J'ai [SEUIL] ans ou plus, j'accède au site" + bouton "Je suis mineur, je quitte le site" (qui redirige vers https://arsjpa.gov.gn/ ou une page neutre). (4) Le seuil exact à intégrer doit être validé Legal-check (cf R-TRUST-01-01). En attendant, défensif : "Interdit aux moins de 21 ans" si pas de source claire (21 est plus restrictif et défensif que 18).
- Copy-ready :
Mention footer permanent (à intégrer dans le bloc disclaimer cf R-TRUST-01-03) : <p><strong>Interdit aux mineurs.</strong> L'âge légal pour parier en Guinée est de [SEUIL À CONFIRMER Legal-check] ans. Le jeu d'argent peut entraîner une dépendance. Jouez avec modération. <a href="/jeu-responsable">Plus d'informations sur le jeu responsable</a>.</p> Modal age-gate (HTML à coller dans <body> avec affichage conditionnel JS basé sur cookie bet224_age_verified) : <div id="age-gate-modal" role="dialog" aria-labelledby="age-gate-title" aria-modal="true" style="position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.95);z-index:9999;display:flex;align-items:center;justify-content:center"> <div style="background:white;padding:2rem;max-width:480px;border-radius:8px;text-align:center"> <h2 id="age-gate-title">Confirmation d'âge</h2> <p>L'accès à Bet224 est strictement réservé aux personnes âgées de <strong>[SEUIL] ans ou plus</strong>. Le jeu d'argent peut entraîner une dépendance. Avant d'entrer, merci de confirmer votre âge.</p> <button onclick="cg_ageVerified(true)" class="btn btn-primary">J'ai [SEUIL] ans ou plus</button> <a href="https://arsjpa.gov.gn/" class="btn btn-link">Je suis mineur, je quitte le site</a> <p style="font-size:0.85rem;margin-top:1rem">En entrant sur ce site, vous confirmez avoir l'âge légal et acceptez nos <a href="/cgu">CGU</a> et notre <a href="/privacy">Politique de confidentialité</a>.</p> </div> </div> Script associé (à coller dans <head> ou <body> fin) : <script>function cg_ageVerified(ok){if(ok){document.cookie='bet224_age_verified=1;max-age=2592000;path=/;samesite=strict';document.getElementById('age-gate-modal').style.display='none';}}if(document.cookie.indexOf('bet224_age_verified=1')!==-1){document.addEventListener('DOMContentLoaded',()=>{var m=document.getElementById('age-gate-modal');if(m)m.style.display='none';});}</script> ATTENTION : NE PAS recopier le wording italien hard-codé header.disclaimer = "Il gioco è vietato ai minori di diciotto anni" ; il référence le seuil italien (18) qui peut ne pas être le seuil GN, et il est en italien.
- Effort estimé : M
- Validation :
Re-crawl 4 routes en mode "premier visiteur" (no cookies) : la modal age-gate doit apparaître au chargement, bloquant le catalogue. Test : navigation directe vers /casino doit déclencher la modal. Re-crawl en mode "cookie age verifié" : la modal ne doit pas apparaître. Validation Legal-check du seuil + du wording. Grep <screenshot>/desktop.png : mention "Interdit aux mineurs" visible permanent en footer.
R-UX-01-01 : Remplacer "OUVRIR PIED DE PAGE" par un footer visible permanent et redirigé vers les obligations YMYL
- Findings adressés : F-UX-01-01, F-UX-01-02, F-UX-01-10
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=5 E=2 → score=62.5
- Action concrète :
(1) Retirer class="collapse cg-lazy" du <footer id="nascondifooter"> pour le rendre visible en permanence en bas de chaque route. (2) Supprimer le bouton <a id="consultaFooter">OUVRIR PIED DE PAGE</a> et le bouton miroir <a id="nascondiFooter">FERMER PIED DE PAGE</a>. (3) Restructurer le footer en 4 colonnes : "À propos" (raison sociale, licence, adresse, ARSJPA en lien cliquable vers https://arsjpa.gov.gn/), "Aide & contact" (FAQ, formulaire, email, téléphone si dispo), "Légal" (Politique de Confidentialité, Conditions Générales, Cookies, Mentions légales), "Jeu responsable" (cf R-UX-01-08).
- Copy-ready :
Suppression de l'élément : retirer ligne <a id="consultaFooter">OUVRIR PIED DE PAGE</a> du template global. Restructuration HTML : <footer role="contentinfo" class="bg-bianco"> <div class="container"> <div class="row"> <div class="col-md-3"><h2 class="cg-footer-section-title">À propos</h2><p>Bet224, paris sportifs en ligne en Guinée. <a href="https://arsjpa.gov.gn/" target="_blank" rel="noopener">Régulateur : ARSJPA</a>.</p></div> <div class="col-md-3"><h2 class="cg-footer-section-title">Aide & contact</h2><ul><li><a href="/faq">Foire aux questions</a></li><li><a href="/contact">Nous contacter</a></li></ul></div> <div class="col-md-3"><h2 class="cg-footer-section-title">Informations légales</h2><ul><li><a href="/promo/tutte/bet224_conditions_generales">Conditions Générales</a></li><li><a href="/promo/tutte/bet224_politique_confidentialite">Politique de Confidentialité</a></li><li><a href="/external_cms/pdf/Cookies_Policy.pdf" target="_blank">Politique des cookies (PDF)</a></li></ul></div> <div class="col-md-3"><h2 class="cg-footer-section-title">Jeu responsable</h2><p><strong>Jouer doit rester un plaisir.</strong></p><ul><li><a href="/jeu-responsable">Conseils pour jouer en sécurité</a></li><li><a href="/auto-exclusion">Demander l'auto-exclusion</a></li></ul></div> </div> </div></footer> (libellés à valider Legal-check pour la juridiction GN ; les liens /jeu-responsable, /auto-exclusion, /contact, /faq sont à créer en parallèle, cf R-UX-01-08).
- Effort estimé : M
- Validation :
Re-run analyze_conversion_signals.py sur chaque route après déploiement : summary.primary_cta_text ne doit plus être "OUVRIR PIED DE PAGE" ; summary.trust_legal_links_count doit passer de 2 à 3 (ajout cookies en lien web) ; detailed.trust_signals.contact_links_count doit être ≥ 1 (formulaire contact ou email visible). Test manuel : footer visible sans clic sur les 4 routes.
R-A11Y-01-08 : Ajouter un label au toggle de thème dark/light
- Findings adressés : F-A11Y-01-04
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=1 → score=50.0
- Action concrète :
Ajouter un <label for="cg-theme-switch"> autour ou à proximité de l'input, ou un aria-label directement sur l'input. Fix template footer commun aux 4 routes.
- Copy-ready :
Variante label visible : <label for="cg-theme-switch">Activer le mode sombre</label> (texte à placer dans le footer à côté du toggle). Variante aria-label seul si le composant doit rester sans label visible : aria-label="Activer le mode sombre".
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "label" pour #cg-theme-switch retourne 0.
R-A11Y-01-10 : Ajouter un alt vide ou un label au drapeau langue fr.png
- Findings adressés : F-A11Y-01-02
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=1 → score=50.0
- Action concrète :
Si le libellé texte "FR" adjacent porte déjà l'information (cas le plus probable au vu de conversion-signals/sport-home.json → detailed.ctas[3].text = "FR"), marquer l'image comme décorative : ajouter alt="" + role="presentation". Sinon, si le drapeau est l'unique vecteur d'info (variante mobile sans texte adjacent), ajouter alt="Français".
- Copy-ready :
Cas décoratif : <img src="/images/desktop/fr.png" class="flag-lang" alt="" role="presentation">. Cas porteur d'info : <img src="/images/desktop/fr.png" class="flag-lang" alt="Français">.
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "image-alt" pour img[src$="fr.png"] retourne 0.
R-PERF-01-04 : Ajouter 2-3 <link rel="preconnect"> en tête de <head> pour origines critiques
- Findings adressés : F-PERF-01-04
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=1 → score=50.0
- Action concrète :
Ajouter ces 3 <link> en tout début de <head> (avant tout <script> / <style>) :
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin>(pour GTM + gtag.js)<link rel="dns-prefetch" href="https://www.googletagmanager.com">(fallback navigateurs sans preconnect)- Si une autre origine tierce devient nécessaire en V2 (CDN images, fonts Google, etc.) : ajouter un
preconnectcorrespondant. - Copy-ready :
Insertion à ajouter en <head> ligne ~5 (juste après <meta charset> si présent, avant GTM) : ``html <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin> <link rel="dns-prefetch" href="https://www.googletagmanager.com"> ``
- Effort estimé : S
- Validation :
Inspecter le <head> final sur les 4 routes : présence des deux <link> en position 1-2 du <head>. Chrome DevTools Network panel : connexion à googletagmanager.com établie avant le premier <script async>.
R-SEO-01-02 : Injecter le JSON-LD Schema.org minimal sur les 4 routes (Organization + WebSite + WebPage + spécifique par route)
- Findings adressés : F-SEO-01-02
- Routes concernées :
sport-home,sport,casino,promotions - Priorité RICE : R=5 I=4 C=5 E=2 → score=50.0
- Action concrète :
Ajouter dans le <head> de chaque page un bloc <script type="application/ld+json"> contenant a minima : un Organization global (nom canonique "Bet224", logo, URL, sameAs réseaux sociaux quand confirmés par client), un WebSite (nom + potentialAction SearchAction si recherche interne existe), un WebPage par route avec breadcrumb BreadcrumbList. Sur sport et casino, ajouter ItemList du catalogue (compétitions / providers de jeux). Sur promotions, ajouter Offer par bonus avec termsOfService (conditions de mise).
- Copy-ready :
Bloc global à injecter sur les 4 routes (placeholder URLs réseaux sociaux à confirmer client) : <script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Bet224","alternateName":["Bet224"],"url":"https://www.bet224.gn/","logo":"https://www.bet224.gn/external_cms/GUINEA/img/logo-bet-224.png","sameAs":["TODO_facebook_url","TODO_x_url","TODO_telegram_url"]}</script> Bloc sport-home complémentaire : <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Bet224","url":"https://www.bet224.gn/","inLanguage":"fr-GN"}</script> Bloc casino complémentaire avec mention âge : <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":"Casino en ligne Guinée Bet224","url":"https://www.bet224.gn/casino","audience":{"@type":"PeopleAudience","suggestedMinAge":"TODO_age_legal_GN_a_sourcer"}}</script> Pour Offer / Promotion / ItemList, structure à compléter selon contenu réel post-décision client.
- Effort estimé : S
- Validation :
curl https://www.bet224.gn/sport-home | grep "application/ld+json" retourne ≥ 1 occurrence par route. Re-crawl html_downloader.py puis crawl/index.json pages[].json_ld = array non vide avec au moins @type: Organization + @type: WebPage. Test Google Rich Results https://search.google.com/test/rich-results sur chaque URL retourne 0 erreur.
R-TRUST-01-06 : Réécrire le cookie banner avec bouton "Refuser" symétrique + granularité + lien vers page HTML cookie policy
- Findings adressés : F-TRUST-01-10, F-TRUST-01-14
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=2 → score=50.0
- Action concrète :
(1) Supprimer le wording "En poursuivant votre navigation, vous acceptez l'utilisation de tous les cookies" (consent passif). Le remplacer par un consent actif : l'utilisateur DOIT cliquer pour accepter, refuser, ou paramétrer. (2) Ajouter un bouton "Refuser" symétrique au "OK" (même taille, même position, même contraste). (3) Ajouter un bouton "Paramétrer" qui ouvre une modal de granularité : cookies fonctionnels (toujours activés, justification), analytics (opt-in), profilage tiers (opt-in). (4) Remplacer le lien PDF /external_cms/pdf/Cookies_Policy.pdf par une page HTML navigable /cookies (créée dans R-TRUST-01-02) listant chaque cookie tiers utilisé (Google Analytics G-VLQSP6C303, GTM-MZ7JZBPZ, et tous les autres détectés en audit RGPD-like). (5) Mémoriser le choix utilisateur via cookie technique sans expirer < 6 mois (re-demander si refresh ou si changement de cookies tiers).
- Copy-ready :
Bandeau cookie nouveau (à coller à la place du bloc cg-barra-cookies actuel) : <div id="cookie-banner" role="dialog" aria-labelledby="cookie-title" aria-describedby="cookie-desc" style="position:fixed;bottom:0;left:0;width:100vw;background:#2d3844;color:white;padding:1rem;z-index:9999"> <div style="max-width:1200px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;gap:1rem;justify-content:space-between"> <div> <h2 id="cookie-title" style="font-size:1rem;margin:0 0 0.5rem 0">Vos préférences cookies</h2> <p id="cookie-desc" style="margin:0;font-size:0.9rem">Nous utilisons des cookies pour faire fonctionner le site, mesurer son audience et personnaliser le contenu. Vous pouvez accepter tous les cookies, les refuser, ou les paramétrer. <a href="/cookies" style="color:#fff;text-decoration:underline">En savoir plus</a>.</p> </div> <div style="display:flex;flex-wrap:wrap;gap:0.5rem"> <button onclick="cg_acceptCookies('all')" class="btn btn-primary">Tout accepter</button> <button onclick="cg_acceptCookies('none')" class="btn btn-secondary">Tout refuser</button> <button onclick="cg_openCookieSettings()" class="btn btn-link" style="color:white">Paramétrer</button> </div> </div> </div> Wording de la modale paramétrer (à coller dans cg_openCookieSettings()) : Cookies fonctionnels : indispensables au fonctionnement du site (session, panier de paris, langue). Toujours activés. [non opt-out, justification : sans eux, le site ne fonctionne pas]. Cookies analytics : nous aident à comprendre comment vous utilisez le site (Google Analytics anonymisé G-VLQSP6C303). [opt-in case à cocher]. Cookies de profilage tiers : permettent de personnaliser les promotions affichées en fonction de votre activité. [opt-in case à cocher, par défaut DÉCOCHÉE]. ATTENTION : ne pas ré-utiliser le wording italien cg_LABEL["cookie.this.consent"] = "Accetta sempre questo sito" qui est en italien et reste passif.
- Effort estimé : M
- Validation :
Inspection visuelle re-crawl : bandeau avec 3 boutons "Tout accepter", "Tout refuser", "Paramétrer". Test : clic "Tout refuser" supprime les cookies analytics+profilage du document.cookie après reload. Test page /cookies : page-signals/cookies.signals.json → word_count > 500. Validation Legal-check sur wording + granularité conforme cadre GN.
R-UI-01-03 : Purger les stacks de polices parasites et déclarer DMSans comme unique famille canonique
- Findings adressés : F-UI-01-03
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=1 → score=50.0
- Action concrète :
Identifier les 2-3 fichiers CSS qui déclarent les stacks system-ui parasites sur html et body (probablement Bootstrap reset + framework legacy). Soit les supprimer, soit les remplacer par une déclaration unique html, body { font-family: var(--font-family-base); }. Ajouter un fallback de qualité après DMSans pour le cas FOUT : DMSans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif (un seul stack canonique).
- Copy-ready :
Token CSS à placer dans :root : ``css :root { --font-family-base: "DMSans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; } html, body { font-family: var(--font-family-base); } ` Supprimer toute autre déclaration font-family sur html ou body` dans les CSS existants.
- Effort estimé : S
- Validation :
Re-run analyze_design_system.py : aggregate.typography.unique_font_family_count = 1 (ou 2 si on garde un stack icon font distinct), aggregate.typography.font_families[0].value débute par "DMSans" et est appliqué à 100 % des contextes (["a", "body", "footer", "h2", "h5", "html", "main"]).
R-UX-01-02 : Réinjecter un H1 explicite + intro courte sur chaque route
- Findings adressés : F-UX-01-04
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=2 → score=50.0
- Action concrète :
Ajouter sur chaque route un <h1> dans le wrapper principal <main id="panel">, juste avant le premier carrousel / contenu. Optionnellement encadrer d'un <p> court (1 phrase) qui précise la promesse de page. Garder un ton sobre conforme site-context.yaml → voice_and_tone.tone = "factuel, sobre, transparent".
- Copy-ready :
Propositions (ton sobre, sans incitation, sans promesse de gain) :
sport-home:<h1>Paris sportifs en ligne en Guinée</h1><p class="margine-su">Consultez les cotes du jour sur le football, le basketball et les autres sports. Pour parier, créez un compte ou connectez-vous.</p>sport:<h1>Toutes les compétitions sportives</h1><p class="margine-su">Explorez les compétitions disponibles par sport et construisez votre pari. Cliquez sur une cote pour l'ajouter à votre ticket.</p>casino:<h1>Jeux de casino en ligne</h1><p class="margine-su">Découvrez le catalogue des jeux classés par éditeur. Cliquez sur un jeu pour ouvrir la fiche, et sur "Jouer" pour démarrer une session.</p>promotions:<h1>Promotions et bonus en cours</h1><p class="margine-su">Découvrez les offres en cours. Chaque bonus est soumis à des conditions (mises minimales, durée, sports éligibles) détaillées sur la fiche de l'offre.</p>(formulation neutre, sans superlatif).- Effort estimé : S
- Validation :
Test manuel : un H1 visible sur chaque route. Re-run axe-core : violations[].id == "page-has-heading-one" retourne 0. Re-crawl : index.json → pages[].word_count augmente d'environ 15-30 mots par route.
R-TRUST-01-02 : Créer les 16 pages support/legal/about manquantes (mentions légales, licence, jeu responsable, privacy, contact, etc.)
- Findings adressés : F-TRUST-01-02, F-TRUST-01-03, F-TRUST-01-04, F-TRUST-01-05, F-TRUST-01-09, F-TRUST-01-11
- Routes concernées :
mentions-legales,licence,jeu-responsable,responsible-gaming,privacy,politique-confidentialite,cgu,conditions,terms,contact,a-propos,qui-sommes-nous,aide,help,faq,bonus,cookies - Priorité RICE : R=5 I=5 C=5 E=3 → score=41.67
- Action concrète :
Créer côté CMS les 17 pages canoniques manquantes avec contenu réel (pas de placeholder lorem). Routes prioritaires (à créer avant tout le reste) : /mentions-legales, /licence, /jeu-responsable, /contact, /privacy (priorité TRUST critique). Routes secondaires : /cgu, /aide, /a-propos, /bonus, /cookies. Routes redirigées (synonymes français/anglais) : /responsible-gaming → /jeu-responsable, /politique-confidentialite → /privacy, /conditions et /terms → /cgu, /qui-sommes-nous → /a-propos, /help et /faq → /aide. Le contenu de chaque page doit être validé par Legal-check (R-TRUST-01-01). Aucune page ne doit retourner body page="404" sur une URL canonique listée.
- Copy-ready :
Squelette /mentions-legales (wording à valider Legal-check, raison sociale à remplacer une fois sourcée) : <h1>Mentions légales</h1> <h2>Éditeur du site</h2> <p>Raison sociale : [À COMPLÉTER, ex. SARL Bet224 Guinée]<br>Siège social : [À COMPLÉTER, adresse complète Conakry]<br>RCCM : [À COMPLÉTER, numéro RCCM OHADA]<br>Représentant légal : [À COMPLÉTER]</p> <h2>Agrément réglementaire</h2> <p>Bet224 opère en Guinée sous l'agrément de l'Autorité de Régulation du Secteur des Jeux et Pratiques Assimilées (ARSJPA), numéro d'agrément [À COMPLÉTER], délivré le [À COMPLÉTER]. Consulter le registre des plateformes agréées : <a href="https://arsjpa.gov.gn/" target="_blank" rel="noopener">arsjpa.gov.gn</a>.</p> <h2>Hébergement</h2> <p>[À COMPLÉTER : hébergeur du site, raison sociale, adresse]</p> <h2>Contact</h2> <p>Email : [À COMPLÉTER]<br>Téléphone : [À COMPLÉTER]<br>Formulaire de contact : <a href="/contact">nous contacter</a></p> <h2>Propriété intellectuelle</h2> <p>L'ensemble des contenus du site bet224.gn est protégé par le droit d'auteur. Toute reproduction sans autorisation préalable est interdite.</p> Squelette /jeu-responsable (wording à valider Legal-check) : <h1>Jouer responsable</h1> <p>Le jeu d'argent peut entraîner une dépendance. Pour jouer en toute sécurité, Bet224 met à votre disposition des outils de modération.</p> <h2>Limites de mise et de dépôt</h2> <p>Depuis votre compte (Mon compte > Préférences de jeu), vous pouvez fixer une limite quotidienne, hebdomadaire ou mensuelle de mise et de dépôt.</p> <h2>Auto-exclusion</h2> <p>Vous pouvez vous auto-exclure temporairement (24h, 7j, 30j) ou définitivement depuis votre compte. L'auto-exclusion est immédiate et empêche tout accès au jeu pendant la durée choisie.</p> <h2>Signes d'un jeu problématique</h2> <p>Vous misez plus que prévu, vous jouez pour récupérer vos pertes, vous cachez votre activité de jeu à vos proches. Si vous reconnaissez ces signes, demandez de l'aide.</p> <h2>Où trouver de l'aide en Guinée</h2> <p>[À COMPLÉTER Legal-check : structure d'aide aux joueurs en Guinée si existante ; sinon, lister une ressource francophone internationale validée].</p>
- Effort estimé : L
- Validation :
Re-crawl complet : aucune des 17 URLs ne doit retourner body page="404". Toutes doivent avoir un <title> rempli, un <h1> rempli, un contenu réel >500 chars (page-signals/<route>.signals.json → word_count >= 100). Tous les liens du footer doivent pointer vers des URLs valides (validate_inputs links_resolution check). Re-validation Legal-check pour chaque contenu.
R-CONV-01-04 : Faire émerger un primary CTA business unique above-fold + retirer ou renommer "OUVRIR PIED DE PAGE"
- Findings adressés : F-CONV-01-04
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=4 E=2 → score=40.0
- Action concrète :
(1) Convertir le bouton "Inscription" actuellement en <span onclick="cg_newAccount(true)"> vers un véritable <button type="button"> ou <a href="/signup"> accessible, avec class CSS de mise en avant claire (taille + couleur + isolement spatial). (2) Définir un primary CTA business unique above-fold = "Inscription" sur les routes non-authentifiées (sport-home, sport, casino, promotions), bouton plus large que tous les autres CTAs adjacents. (3) Supprimer le bouton "OUVRIR PIED DE PAGE" en exposant le footer par défaut (cf R-CONV-01-02). Si conservation absolument nécessaire pour raison technique, renommer en wording compréhensible et le sortir de l'above-fold.
- Copy-ready :
CTA Inscription (1-4 mots, conformes voice_and_tone) : "S'inscrire" (option neutre) ou "Créer un compte" (3 mots, plus explicite). À PROSCRIRE en CTA Inscription : "Gagnez", "Parier maintenant", "Pariez ici" (incitation), "Profitez du bonus" (promesse). Wrapping HTML : <a href="/signup" class="btn-primary-cta" role="button">S'inscrire</a> (à la place du <span onclick> actuel). Si "OUVRIR PIED DE PAGE" conservé : renommer en "Informations légales" (2 mots).
- Effort estimé : S
- Validation :
Re-crawl, conversion-signals/<route>.json → detailed.primary_cta.text doit être "S'inscrire" ou "Créer un compte" (pas "Basketball" ni "OUVRIR PIED DE PAGE"). detailed.primary_cta.above_fold = true. Le bouton doit avoir bbox.width >= 120 et bbox.height >= 40 (au-dessus de la moyenne des CTAs adjacents).
R-CONV-01-06 : Étendre le crawl POC v2 aux routes funnel critique /signup, /login, /depot, page jeu individuelle, page retrait
- Findings adressés : F-CONV-01-07
- Routes concernées :
signup,login,depot,jeu-detail,retrait - Priorité RICE : R=4 I=4 C=5 E=2 → score=40.0
- Action concrète :
Ajouter à la config du crawler product-audit (probablement clients/bet224/audit-config.yaml ou équivalent) les routes : /signup, /login (modal et page), /depot, /depot/methodes, /retrait, une route exemple /sport/match/<id> détail match, une route exemple /casino/jeu/<id> détail jeu. Re-lancer html_downloader.py + analyze_conversion_signals.py + capture_screenshots.py + run_axe_core.py. Produire un DEEP-CONV-02 focalisé sur le funnel.
- Copy-ready :
Patch suggéré du fichier config (extrait, à adapter au format réel du crawler) : ``` routes_extra:
- path: /signup
label: Inscription
- path: /login
label: Connexion
- path: /depot
label: Dépôt
- path: /retrait
label: Retrait ```
- Effort estimé : S
- Validation :
Après re-crawl, conversion-signals/index.json → aggregate.forms_total_all_routes > 0 et aggregate.max_form_field_count > 0. Un DEEP-CONV-02 doit pouvoir analyser le funnel d'inscription.
R-SEO-01-04 : Ajouter le markup âge légal et la mention "Jeu responsable" en footer SSR (YMYL gambling)
- Findings adressés : F-SEO-01-04
- Routes concernées :
sport-home,sport,casino,promotions - Priorité RICE : R=5 I=4 C=4 E=2 → score=40.0
- Action concrète :
Ajouter dans le footer SSR un bloc régulation visible sur toutes les routes, contenant : mention "Jeu réservé aux personnes âgées de TODO_age_legal_GN ans et plus", lien <a href="/jeu-responsable"> vers une page dédiée à créer, logo ou pictogramme "Jeu responsable" (à fournir par le régulateur ARSJPA ou créer un visuel sobre). En complément, ajouter en <head> la meta <meta name="rating" content="adult"> (signal historique mais encore parsé par Bing et Yahoo). Optionnellement, mention de l'âge sous forme propriété Schema.org dans Organization.audience.suggestedMinAge (cf R-SEO-01-02). La page /jeu-responsable doit lister les outils de modération (limites de dépôt, auto-exclusion, contact d'aide).
- Copy-ready :
Bloc footer (placeholder âge à confirmer Legal-check) : <div class="cg-footer-regulation"><p>Bet224 est un site de paris sportifs en ligne réservé aux personnes majeures. <a href="/jeu-responsable">Jouer comporte des risques : pertes financières, addiction. Consultez nos outils de jeu responsable.</a></p></div> Meta head : <meta name="rating" content="adult" /> Page /jeu-responsable (titre + structure h1/h2 copy-ready) à co-construire avec le client et Legal-check, hors scope reco SEO ici.
- Effort estimé : M
- Validation :
Re-crawl post-déploiement : grep "majeur|18 ans|TODO_age_legal_GN ans" sur les 4 raw HTML retourne ≥ 1 occurrence visible dans le footer SSR (pas seulement dans le bundle JS). Page /jeu-responsable retourne 200 (pas 404 comme actuellement, cf keywords-mapping bas du fichier). Cross-validation avec angle TRUST.
R-TRUST-01-07 : Ajouter conditions de mise (wagering) visibles above-fold sur chaque bannière promo + créer page T&C bonus dédiée
- Findings adressés : F-TRUST-01-13
- Routes concernées :
sport-home,sport,promotions - Priorité RICE : R=4 I=5 C=4 E=2 → score=40.0
- Action concrète :
(1) Réécrire les 3 visuels JPG des bannières hero (BPD_SPORT_1800X600_promotions.jpg, CASHBACK_1800X600_promos.jpg, MAXI BONUS) pour inclure une mention claire du wagering (ex. "Bonus jusqu'à 1 000 000 GNF, conditions de mise 30x avant retrait"). (2) Créer la page /bonus (soft 404 actuellement) avec T&C détaillés par bonus : montant max, dépôt minimum, wagering, plafond de gain, jeux exclus, durée de validité, méthodes de paiement éligibles. Pour chaque bonus une URL stable type /bonus/welcome-sport-1er-depot. (3) Cross-link depuis chaque bannière hero vers la page T&C du bonus correspondant (ex. CTA "Voir les conditions" pointant vers /bonus/welcome-sport-1er-depot#wagering).
- Copy-ready :
Wording mention wagering à intégrer dans chaque bannière (≤ 80 chars sous-titre) : "Bonus jusqu'à 1 000 000 GNF | Conditions de mise 30x | Dépôt min. 10 000 GNF" Squelette page /bonus/welcome-sport-1er-depot (h1 + structure) : <h1>Bonus de bienvenue sport : 100 % de votre 1er dépôt</h1> <dl> <dt>Bonus offert</dt><dd>100 % du montant de votre 1er dépôt, jusqu'à 1 000 000 GNF en Fun Bonus Sport.</dd> <dt>Dépôt minimum</dt><dd>[À COMPLÉTER] GNF</dd> <dt>Conditions de mise (wagering)</dt><dd>Le bonus doit être misé [À COMPLÉTER, ex. 30] fois sur des paris sportifs avec une cote minimum de [À COMPLÉTER, ex. 1.50] par sélection avant tout retrait.</dd> <dt>Durée de validité</dt><dd>[À COMPLÉTER, ex. 30 jours] à compter du 1er dépôt.</dd> <dt>Plafond de gain</dt><dd>[À COMPLÉTER, ex. 5 fois le montant du bonus].</dd> <dt>Jeux ou paris exclus</dt><dd>[À COMPLÉTER : ex. paris combinés < 1.50, casino, jeux virtuels].</dd> <dt>Mode de calcul du bonus</dt><dd>[À COMPLÉTER : ex. crédit immédiat sur le compte Fun Bonus séparé].</dd> </dl> <p>Conditions complètes : <a href="/cgu#bonus">CGU section Bonus</a>. Jouez avec modération : <a href="/jeu-responsable">Jeu responsable</a>.</p>
- Effort estimé : M
- Validation :
Inspection des screenshots re-crawl : chaque bannière hero doit afficher la mention wagering visible (lecteur humain à 100 % zoom). Re-crawl /bonus/welcome-sport-1er-depot : body page ≠ 404, word_count > 300, présence de "wagering" / "conditions de mise" / "dépôt minimum" / "plafond" dans le contenu. Test cross-link : clic "Voir les conditions" depuis bannière hero atteint la section ancre attendue.
R-A11Y-01-03 : Ajouter aria-label aux 8 boutons de carrousel casino
- Findings adressés : F-A11Y-01-03
- Routes concernées :
casino - Priorité RICE : R=3 I=5 C=5 E=2 → score=37.5
- Action concrète :
Dans le composant componenteGioco__navigatore, ajouter un aria-label dynamique sur chaque bouton avant / arrière. Le nom du groupe est connu (paramètre gamesGroup-N passé à scrollConBottone). Le fix patche un seul composant et corrige les 8 boutons (et tous les futurs carrousels du même composant).
- Copy-ready :
Bouton arrière : aria-label="Faire défiler la liste des jeux vers la gauche". Bouton avant : aria-label="Faire défiler la liste des jeux vers la droite". Si le nom du groupe est exploitable côté template, version plus précise : aria-label="Faire défiler les jeux Spribe vers la gauche" (et équivalents pour Top 10, Evolution, Top Providers, Amigo Gaming, à raccrocher au titre <h2> ou <h3> du carrousel parent).
- Effort estimé : S
- Validation :
Re-run axe-core sur casino : violations[].id == "button-name" retourne 0. Test clavier : tabuler dans la zone catalogue jeux annonce "Faire défiler ... gauche, bouton" sur chaque flèche.
R-A11Y-01-04 : Rendre les conteneurs de carrousel casino focusables au clavier
- Findings adressés : F-A11Y-01-12
- Routes concernées :
casino - Priorité RICE : R=3 I=5 C=5 E=2 → score=37.5
- Action concrète :
Sur les éléments .componenteGioco > .rowContainer et #swiper-wins-6 (et autres conteneurs Swiper customDragScroll), ajouter tabindex="0" + role="region" + aria-label descriptif. Vérifier que la navigation flèches gauche / droite au clavier déclenche bien le scroll. À combiner avec R-A11Y-01-03 (boutons nommés) pour un parcours clavier complet.
- Copy-ready :
Attributs à ajouter : tabindex="0" role="region" aria-label="Jeux Spribe, liste défilante" (et équivalents par titre de carrousel : "Top 10", "Évolution", "Top Providers", "Amigo Gaming", "Gains récents"). Adapter aria-label au titre <h2> ou <h3> parent visible.
- Effort estimé : M
- Validation :
Re-run axe-core sur casino : violations[].id == "scrollable-region-focusable" retourne 0. Test clavier : Tab atteint chaque carrousel, flèches font défiler.
R-MOBILE-01-05 : Étendre le scope V2 au funnel inscription / login / dépôt pour audit mobile dédié
- Findings adressés : F-MOBILE-01-04
- Routes concernées :
/inscription,/login,/depot,/retrait - Priorité RICE : R=5 I=5 C=4 E=3 → score=33.33
- Action concrète :
V2 audit : ajouter au include_patterns du crawl les routes /inscription, /login, /recover-psw (déjà présentes côté seo-audit dans seo-audit/.../bet224/crawl/html/ cf recoverpsw.raw.html), /depot si accessible sans auth ou crawl avec session de test fournie par le client. Pour chaque route, capturer screenshots desktop + mobile, run axe desktop + mobile, extraire forms[].fields[] dans conversion-signals/. Sub-agent DEEP-MOBILE-02 ou enrichissement DEEP-MOBILE-01 avec les findings forms mobile (types d'input, autocomplete, inputmode, taille des champs, gestion clavier mobile, password manager compatibility).
- Copy-ready :
N/A (action outillage / scope).
- Effort estimé : M
- Validation :
conversion-signals/index.json → aggregate.forms_total_all_routes > 0 ; routes /inscription, /login présentes dans crawl/index.json → pages[] ; sub-agent DEEP-MOBILE-02 ou pass 02 de DEEP-MOBILE-01 contient ≥ 3 findings sur les forms mobile.
R-PERF-01-02 : Différer (defer) ou async les 5 scripts JS bloquants en <head>
- Findings adressés : F-PERF-01-02
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=4 E=3 → score=33.33
- Action concrète :
Pour chaque <script src=...> en <head> qui n'est PAS critique au first paint :
- Si la lib expose une API utilisée immédiatement par du code inline ultérieur dans le même
<head>: ne pas défer (jQuery 3.7.1 = probablement dans ce cas car beaucoup d'inline$(document).ready()suivent). - Si la lib est consommée uniquement après DOMContentLoaded : ajouter
defer(GSAP, SweetAlert, jsCookie tombent probablement ici). - Si la lib est analytics / non-critique : ajouter
async(équivalent àgtag.jsligne 15).
Auditer l'ordre des dépendances en lab avant rollout. Bonus : grouper les libs JS en un bundle webpack / esbuild (1 requête au lieu de 5).
- Copy-ready :
Markup cible (exemple) : ``html <script defer src="/js/desktop/third-party/jquery-3.7.1.min.js?v=20260304016"></script> <script defer src="/js/contogioco-services.js?v=20260304016"></script> <script defer src="/js/gsap.min.js?v=20260304016"></script> <script defer src="/js/sweetalert2.min.js?v=20260304016"></script> <script defer src="/js/jsCookie.min.js?v=20260304016"></script> ` Si jQuery est utilisé en inline avant DCL (probable), la solution est plus complexe : passer tout le code inline à un EventListener DOMContentLoaded`, OU charger jQuery seul en synchrone et tous les autres en defer.
- Effort estimé : M
- Validation :
Re-mesurer load_event_ms après rollout : doit baisser sensiblement sur les 4 routes. Idéalement, vérifier via PSI que le diagnostic "Eliminate render-blocking resources" passe d'un savings > 500 ms à < 100 ms.
R-PERF-01-03 : Ajouter loading="lazy", width, height, srcset aux 4 <img> template et aux vignettes casino
- Findings adressés : F-PERF-01-03, F-PERF-01-05
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=3 → score=33.33
- Action concrète :
Pour les 4 <img> template (logo, ARSJPA, drapeaux) : ajouter width, height intrinsèques (mesurer une fois, hardcoder) + servir en WebP avec fallback PNG. Le logo header est above-the-fold donc reste eager (ne pas lazy-loader le LCP candidat) avec fetchpriority="high". Les drapeaux et ARSJPA sont below-the-fold : loading="lazy". Pour les vignettes casino : ajouter loading="lazy" dès le 2e carrousel offscreen, dimensions hardcodées, srcset avec variantes 1x 2x pour servir mobile en taille réduite.
- Copy-ready :
Markup cible logo header (above-the-fold, LCP candidat) : ``html <a href="/" aria-label="Bet224 - Retour à l'accueil"> <img src="https://www.bet224.gn/external_cms/GUINEA/img/logo-bet-224.png" alt="Bet224" width="120" height="40" fetchpriority="high"> </a> ` Markup cible drapeau langue (below-the-fold layout, mais petit) : `html <img src="/images/desktop/fr.png" alt="" role="presentation" width="24" height="16" loading="lazy"> ` Markup cible vignette casino (carrousel offscreen) : `html <img src="/path/to/game-thumb.webp" srcset="/path/to/game-thumb.webp 1x, /path/to/game-thumb@2x.webp 2x" alt="<nom du jeu>" width="180" height="120" loading="lazy"> ``
- Effort estimé : M
- Validation :
- Grep
loading="lazy"sur les 4 raw HTML : count > 0 (au moins 3 sur 4<img>template). - CLS p75 mesuré via CrUX (post-fix) : < 0.1.
- LCP image servie en WebP (vérifier réseau panel : Content-Type image/webp).
R-UX-01-08 : Ajouter un bloc Jeu Responsable persistant en footer + page dédiée
- Findings adressés : F-UX-01-11
- Routes concernées :
all - Priorité RICE : R=5 I=5 C=4 E=3 → score=33.33
- Action concrète :
(1) Ajouter dans le footer (cf R-UX-01-01) une 4e colonne "Jeu responsable" avec lien vers une page dédiée. (2) Créer une page /jeu-responsable exposant : message d'avertissement, outils d'auto-limitation (mise max, temps de session, auto-exclusion), contact d'aide local si identifié. (3) Afficher un picto + mention d'âge au-dessus du fold (à valider Legal-check pour le seuil exact ; placeholder "Réservé aux personnes majeures"). (4) Maintenir / valoriser le logo ARSJPA déjà présent dans le header (cf raw_html_sport_home ligne 389) en y ajoutant un alt et un lien vers https://arsjpa.gov.gn/.
- Copy-ready :
Bloc footer "Jeu responsable" (proposition à valider Legal-check) : <div class="col-md-3"> <h2 class="cg-footer-section-title">Jeu responsable</h2> <p><strong>Le jeu doit rester un loisir.</strong></p> <ul> <li><a href="/jeu-responsable">Conseils et outils</a></li> <li><a href="/auto-exclusion">Demander une auto-exclusion</a></li> <li>Réservé aux personnes majeures.</li> </ul></div> (la phrase "Réservé aux personnes majeures" évite de citer un âge non sourcé pour la Guinée ; à remplacer par "Interdit aux moins de XX ans" après Legal-check). Logo ARSJPA header : remplacer <img src="https://www.bet224.gn/external_css/GUINEA/img/ARSJPA.png"> par <a href="https://arsjpa.gov.gn/" target="_blank" rel="noopener" title="Autorité de Régulation du Secteur des Jeux et Pratiques Assimilées"> <img src="https://www.bet224.gn/external_css/GUINEA/img/ARSJPA.png" alt="ARSJPA, autorité de régulation des jeux en Guinée"></a>.
- Effort estimé : M
- Validation :
Re-run analyze_conversion_signals.py : detailed.trust_signals.legal_links_count doit passer de 2 à ≥ 4 (ajout 2 liens jeu responsable). Test manuel : sur les 4 routes, 1 lien "Jeu responsable" visible sans clic. Cross-référence à valider en [REF: DEEP-TRUST-01].
R-A11Y-01-05 : Corriger le contraste du bouton Betbuilder (1.3:1 vers ≥ 4.5:1)
- Findings adressés : F-A11Y-01-06
- Routes concernées :
sport - Priorité RICE : R=3 I=4 C=5 E=2 → score=30.0
- Action concrète :
Dans le CSS du composant .widgetFiltroSide__betBuilder, résoudre la collision entre bg-colore-1 et bianco qui force la couleur de texte à noir au lieu de blanc attendu. Vérifier la cascade : la classe bianco doit avoir suffisamment de spécificité, ou utiliser un sélecteur direct .widgetFiltroSide__betBuilder a { color: #ffffff; }. Cible : ratio ≥ 4.5:1 (blanc sur #212121 = 16.1:1, largement suffisant).
- Copy-ready :
Pas de copy à modifier (libellé "Betbuilder" conservé, conforme au site-context : pas d'incitation au jeu).
- Effort estimé : S
- Validation :
Re-run axe-core sur sport : violations[].id == "color-contrast" pour .widgetFiltroSide__betBuilder retourne 0. Inspection DevTools : color calculé = #ffffff.
R-CONV-01-07 : Remplacer le bandeau cookie consent passif par un consent granulaire RGPD-compliant
- Findings adressés : F-CONV-01-08
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=4 E=2 → score=30.0
- Action concrète :
Implémenter une CMP (Consent Management Platform) qui propose au minimum 3 boutons clairs et de poids visuel équivalent : "Tout accepter", "Tout refuser", "Personnaliser". Granularité minimum 4 catégories : nécessaires, fonctionnels, analytics, profilage tiers. Stocker la preuve du consent côté serveur. Mettre à jour la politique de confidentialité (qui retourne actuellement 404 selon facts.to_confirm).
- Copy-ready :
Texte bandeau (≤200 chars) : "Nous utilisons des cookies pour faire fonctionner ce site, mesurer son audience et personnaliser les contenus. Vous pouvez accepter, refuser ou personnaliser votre choix." 3 boutons de poids équivalent : "Tout accepter" / "Tout refuser" / "Personnaliser" (≤2 mots chacun). Lien associé (sous les boutons) : "En savoir plus sur les cookies" (vers /cookies-policy).
- Effort estimé : M
- Validation :
Re-screenshot 4 routes : bandeau doit afficher 3 boutons (Accepter / Refuser / Personnaliser) de taille et couleur similaires (test visuel). En clavier, navigation Tab doit atteindre les 3 boutons. Re-crawl politique-confidentialite : status 200 attendu, plus 404.
R-MOBILE-01-03 : Étendre les touch targets JOUER et flèches carrousel au seuil 44x44 minimum
- Findings adressés : F-MOBILE-01-02
- Routes concernées :
casino,sport-home,sport,promotions - Priorité RICE : R=5 I=4 C=3 E=2 → score=30.0
- Action concrète :
Définir un design token --touch-target-min: 44px et l'appliquer à toutes les classes CTAs interactives. Pour les boutons "JOUER" du casino (80x22 actuel), augmenter min-height ou utiliser padding-top/bottom pour atteindre 44px sans déformer le visuel. Pour les flèches de carrousel .componenteGioco__navigatore__tasto (32x32 actuel), agrandir la zone tactile via padding: 6px (32+12=44) en gardant l'icône visuelle 32px. Pour le sélecteur de langue "FR" (45x16), élargir le bouton container. Tester sur viewport mobile 390x844 que les CTAs ajustés ne créent pas d'overflow horizontal.
- Copy-ready :
CSS tokens (à ajouter dans /css/desktop/base.jsp ou son équivalent mobile) : :root { --touch-target-min: 44px; } Class extension : .componenteGioco__navigatore__tasto { min-width: var(--touch-target-min); min-height: var(--touch-target-min); display: inline-flex; align-items: center; justify-content: center; } .casino-cta-jouer { min-height: var(--touch-target-min); padding: 11px 16px; } .flag-lang-button { min-height: var(--touch-target-min); display: inline-flex; align-items: center; padding: 14px 8px; }
- Effort estimé : M
- Validation :
V2 axe mobile sur les 4 routes : violations[].id = "target-size" doit retourner 0 occurrence. Mesure manuelle au DevTools : tous les boutons interactifs .componenteGioco__navigatore__tasto et .casino-cta-jouer doivent avoir une bbox ≥ 44x44px sur viewport 390x844.
R-SEO-01-05 : Corriger le canonical absent sur sport-home
- Findings adressés : F-SEO-01-05
- Routes concernées :
sport-home - Priorité RICE : R=2 I=3 C=5 E=1 → score=30.0
- Action concrète :
Ajouter dans le <head> du template sport-home un <link rel="canonical" href="https://www.bet224.gn/"> (ou https://www.bet224.gn/sport-home selon la décision SEO d'arbitrage entre racine et landing route). Arbitrage à trancher : si / redirige vers /sport-home en 301, alors canonical = /sport-home. Si / et /sport-home servent le même contenu sans redirect, canonical = / (URL plus courte, plus mémorable pour brand SERP).
- Copy-ready :
Si arbitrage racine canonique : <link rel="canonical" href="https://www.bet224.gn/" /> Si arbitrage landing route canonique : <link rel="canonical" href="https://www.bet224.gn/sport-home" />
- Effort estimé : S
- Validation :
Re-crawl : crawl/index.json pages[0].canonical = URL canonique choisie (non vide). Grep <link rel="canonical" sur raw_html_sport_home.raw.html retourne 1 occurrence.
R-UX-01-05 : Augmenter le menu principal de raccourcis "Football" et "Live"
- Findings adressés : F-UX-01-06
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=4 E=2 → score=30.0
- Action concrète :
Ajouter dans <ul class="nav nav-tabs barra-menu menu-principale"> deux entrées de raccourci au-dessus de "Sports" : "Football" (lien vers /sport/football ou équivalent) et "Live" (lien direct vers https://www.bet224.gn/live.jsp, déjà cité dans cg_liveURL du JS). Cela évite à l'utilisateur 1-2 clics. Garder "Sports" / "Virtuel" / "Promo" / "Casino" derrière.
- Copy-ready :
Modification <ul class="nav nav-tabs barra-menu menu-principale"> : <li><a href="/sport/football" class="altro-principale pointer">Football</a></li> <li><a href="/live" class="altro-principale pointer">En direct</a></li> <li><a data-ref="sport" class="altro-principale pointer" href="/sport">Sports</a></li> <li><a id="cg-h-virtual" data-buttonid="363" href="/virtuel" class="cg-link altro-principale pointer" target="_self">Virtuel</a></li> <li><a data-ref="promo" class="altro-principale pointer" href="/promotions">Promo</a></li> <li><a id="cg-h-casino" data-buttonid="397" href="/casino" class="cg-link altro-principale pointer" target="_self">Casino</a></li> (à valider : la route /sport/football existe-t-elle ? Sinon créer un redirect ou utiliser /sport-home?sport=football).
- Effort estimé : S
- Validation :
Re-crawl puis tester : depuis /promotions, cliquer "En direct" doit mener directement à la page live (1 clic). Avant : 2 clics minimum.
Priorité MEDIUM (10 ≤ RICE < 30)
R-UI-01-01 : Réserver le rouge #b21116 aux CTAs primaires uniques et le vert #40b840 aux états de validation
- Findings adressés : F-UI-01-01
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=4 E=3 → score=26.67
- Action concrète :
Définir un design token couleur unique pour le primary CTA (--color-cta-primary) appliqué au seul rôle "action de conversion principale" (Inscription, Déposer, Parier). Démoter Login en secondary CTA (fond transparent + border #b21116, ou outline-secondary style ghost). Réserver le vert #40b840 aux états positifs (validation, success message, cote favorable). Retirer le vert foncé #0e6634 du système (remplacer par #40b840 pour cohérence). Réécrire le badge #ff0000 en #b21116 pour aligner sur la brand color rouge unique.
- Copy-ready :
Tokens CSS à introduire (à placer dans :root du feuille CSS principal) : ``css :root { --color-cta-primary: #b21116; / Inscription, Déposer, Parier / --color-cta-secondary: transparent; / Login, Connexion (ghost btn) / --color-success: #40b840; / Validation, success / --color-danger: #b21116; / Erreur, suppression (alias primary, OK car contexte distinct) / --color-warning: #f6c800; / Alerte non bloquante, à valider design / } .btn-primary { background: var(--color-cta-primary); color: #ffffff; border: 1px solid var(--color-cta-primary); } .btn-secondary { background: var(--color-cta-secondary); color: var(--color-cta-primary); border: 1px solid var(--color-cta-primary); } ` Wording bouton Login alternatif si le ghost button reste visuellement faible : conserver Login` (action utilisateur déjà-acquis), positionner à droite du CTA Inscription en visuel secondaire.
- Effort estimé : M
- Validation :
Re-run analyze_design_system.py : aggregate.colors.background_top ne contient plus simultanément 3 couleurs CTA ayant le rôle "primary" sur les contextes ["[class*='btn']", "[role='button']", "a", "button"]. Inspection visuelle headers des 4 routes : un seul CTA visuellement primary par viewport, identifié comme l'action de conversion.
R-A11Y-01-09 : Remplacer le div sélecteur de langue par un button
- Findings adressés : F-A11Y-01-13
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=2 → score=25.0
- Action concrète :
Transformer le <div id="droplang"> en <button type="button" id="droplang" aria-haspopup="true" aria-expanded="false">. Cela rend aria-expanded valide sémantiquement (autorisé sur button) et expose le contrôle au clavier. Vérifier que le JavaScript Bootstrap dropdown fonctionne sans <div data-toggle="dropdown"> ; sinon ajouter role="button" + handler clavier (Enter / Space) sur le <div> existant.
- Copy-ready :
Texte visible inchangé ("FR" + drapeau). Si fix par button : <button type="button" id="droplang" class="blocco-header selettore-lingua dropdown" aria-haspopup="true" aria-expanded="false">FR ...</button>.
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "aria-allowed-attr" pour #droplang retourne 0. Test clavier : Tab atteint le sélecteur, Enter / Space ouvre le menu, Escape ferme.
R-PERF-01-06 : Repositionner GTM après les meta <title> et <viewport>
- Findings adressés : F-PERF-01-06
- Routes concernées :
all - Priorité RICE : R=5 I=1 C=5 E=1 → score=25.0
- Action concrète :
Déplacer le bloc GTM (script inline lignes 7-13 actuelles + tag noscript lignes 307-308) après <meta name="viewport"> et <title> dans le <head>. Conserver le pattern recommandé Google (haut de <head>, mais après les meta essentielles).
- Copy-ready :
Ordre cible des premières lignes de <head> : ``html <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>www.bet224.gn Guinee | Jouez en Ligne | Sport, Jeux Digitaux, Virtuel, Loto</title> <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-MZ7JZBPZ');</script> <!-- End GTM --> ... </head> ``
- Effort estimé : S
- Validation :
Inspection visuelle du <head> rendu : <title> apparaît avant le bloc GTM sur les 4 routes.
R-SEO-01-06 : Vendre un audit SEO + AI search approfondi via le projet seo-audit séparé
- Findings adressés : F-SEO-01-06
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=5 E=4 → score=25.0
- Action concrète :
Proposer au client un audit SEO + AI search dédié via le projet seo-audit (livrable distinct, prestation séparée, périmètre élargi). Ce que cet audit produit ne couvre pas et que seo-audit couvrira : cartographie complète du link graph intra-site (in/out degree, pages orphelines, profondeur depuis home), audit des 9 gaps de pages identifiés dans keywords-mapping (jeu-responsable, mentions-légales, licence, cgu, privacy, a-propos, faq, bonus dédié, loto), mesure benchmarkée des citations LLM sur Perplexity / ChatGPT search / Gemini / Bing Copilot pour les 11 keywords primaires + 30+ secondaires, identification des AGG patterns (Answer Generation Gap = questions LLM sans réponse sur le site), analyse comparative concurrentielle (1xBet, Premier Bet, autres opérateurs Guinée), plan de contenu priorisé par volume × intent × concurrence, optimisations intra-linking.
- Copy-ready :
non applicable (recommandation commerciale, pas markup).
- Effort estimé : L
- Validation :
Client accepte ou refuse la prestation. Si accepté : ouvrir audit seo-audit dans Documents/growth/clients/seo-audit/toolkit/clients/bet224/ (déjà initialisé partiellement avec les raw HTML utilisés ici).
R-UI-01-02 : Introduire une échelle typographique modulaire de 6 niveaux (12 / 14 / 16 / 18 / 24 / 32 px)
- Findings adressés : F-UI-01-02
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=5 E=3 → score=25.0
- Action concrète :
Définir 6 tokens font-size, du plus petit au plus grand, avec ratio 1.2-1.25 (échelle modulaire dite "Major Third" ou "Perfect Fourth") : --font-size-xs: 12px, --font-size-sm: 14px, --font-size-base: 16px, --font-size-md: 18px, --font-size-lg: 24px, --font-size-xl: 32px. Supprimer toutes les valeurs intermédiaires 10px, 10.5px, 12.5px, 12.6px, 13px, 14.4px, 15px. Imposer 12px comme taille minimale absolue (jamais en dessous) pour respecter ergonomie web et a11y. Remplacer 10px (147 occurrences mesurées) par 12px en priorité.
- Copy-ready :
Tokens CSS à placer dans :root : ``css :root { --font-size-xs: 12px; / caption, meta, labels secondaires / --font-size-sm: 14px; / body small, breadcrumb, footer / --font-size-base: 16px; / body default / --font-size-md: 18px; / H4, lead paragraph / --font-size-lg: 24px; / H2 / --font-size-xl: 32px; / H1 / } ` Pour la migration progressive, remplacer dans les CSS existants : 10px et 10.5px par var(--font-size-xs) (= 12px), 12.5px / 12.6px / 13px par var(--font-size-xs), 14.4px / 15px par var(--font-size-sm)`.
- Effort estimé : M
- Validation :
Re-run analyze_design_system.py : aggregate.typography.unique_font_size_count <= 6, aggregate.typography.font_sizes[].value ne contient plus que {"12px", "14px", "16px", "18px", "24px", "32px"} et aucune valeur sub-pixel.
R-UI-01-04 : Standardiser le border-radius sur 4 valeurs (0 / 4 / 8 / pill)
- Findings adressés : F-UI-01-04
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=2 → score=25.0
- Action concrète :
Définir 4 tokens radius : --radius-none: 0px, --radius-sm: 4px, --radius-md: 8px, --radius-pill: 999px (suppression de 100% et 600px qui sont des doublons fonctionnels de 999px). Remplacer les 11 valeurs actuelles selon table de migration : 0px -> --radius-none, 2.5px, 3px, 4px, 5px, 6px -> --radius-sm (4px), 8px, 12px -> --radius-md (8px), 100%, 600px, 999px -> --radius-pill. Application différenciée : boutons CTA -> --radius-sm, cards -> --radius-md, avatars / chips circulaires -> --radius-pill.
- Copy-ready :
Tokens CSS à placer dans :root : ``css :root { --radius-none: 0px; --radius-sm: 4px; / boutons, inputs, tags / --radius-md: 8px; / cards, panels, modals / --radius-pill: 999px; / avatars, chips, badges circulaires / } .btn { border-radius: var(--radius-sm); } .card { border-radius: var(--radius-md); } .avatar, .chip-pill { border-radius: var(--radius-pill); } ``
- Effort estimé : M
- Validation :
Re-run analyze_design_system.py : aggregate.borders.border_radius[] ne contient plus que 4 valeurs maximum (0px, 4px, 8px, 999px), pas de sub-pixel, pas de 100%, pas de 600px.
R-UI-01-08 : Personnaliser le bandeau cookies aux couleurs de la charte
- Findings adressés : F-UI-01-09
- Routes concernées :
all (bandeau global,template header) - Priorité RICE : R=5 I=2 C=5 E=2 → score=25.0
- Action concrète :
Identifier le widget CMP cookies (probablement une lib JS tierce). Appliquer un override CSS qui force le fond, le texte, les boutons à utiliser les tokens du design system. Fond du banner : var(--color-background-alt) (= #f6f6f6 recommandé, ou un noir brand #1a1a1a si on veut conserver le contraste fort), texte #212529, bouton OK = var(--color-cta-primary) (= #b21116), bouton Plus d'informations = secondary (ghost button rouge contour). Test que le widget garde son comportement fonctionnel (consent / refus) après l'override.
- Copy-ready :
CSS override (à placer dans une feuille cookies-banner-override.css chargée après le CSS du widget tiers) : ``css #cg-barra-cookies, .cookies-banner, [class*='cookie-banner'] { background: #1a1a1a !important; color: #ffffff !important; box-shadow: var(--shadow-md); } #cg-barra-cookies a, .cookies-banner a { color: #ffffff !important; text-decoration: underline; } #cg-barra-cookies .btn-accept, .cookies-banner .btn-accept { background: var(--color-cta-primary) !important; color: #ffffff !important; border-radius: var(--radius-sm); } #cg-barra-cookies .btn-more-info, .cookies-banner .btn-more-info { background: transparent !important; color: #ffffff !important; border: 1px solid #ffffff; border-radius: var(--radius-sm); } `` Conserver le wording légal du banner intact tant que le red team Legal-check n'a pas confirmé le cadre data Guinée (cf cross-angle TRUST).
- Effort estimé : S
- Validation :
Re-run analyze_design_system.py : aggregate.colors.background_top ne contient plus rgb(46, 97, 232) (bleu Bootstrap) ni rgb(128, 128, 128) (gris neutre html) en contexte banner. Inspection visuelle screenshots des 4 routes : bandeau cookies utilise le rouge brand #b21116 pour le CTA accept.
R-UX-01-10 : Aligner le vocabulaire de l'interface en français cohérent
- Findings adressés : F-UX-01-10, F-UX-01-01
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=5 E=2 → score=25.0
- Action concrète :
Remplacer Login par Connexion, OUVRIR PIED DE PAGE par Mentions légales (si le composant est gardé après R-UX-01-01) ou supprimer (si R-UX-01-01 appliquée), Registration par Inscription dans le footer. Traduire le toast Click HERE to get started... en français. Garder le markup BEM italien (componenteGioco, etc.) inchangé : c'est de la classe CSS interne, invisible.
- Copy-ready :
Mapping de remplacement (à appliquer en lot) :
<a onclick="cg_login()" class="bottone bottone-login">Login</a>-><a onclick="cg_login()" class="bottone bottone-login">Connexion</a><a class="cg-ext-link pointer" onclick="cg_newAccount(true)">Registration</a>-><a class="cg-ext-link pointer" onclick="cg_newAccount(true)">Inscription</a><div class="cg-toast-desc-content">Click <span>HERE</span> to get started or <span>HERE</span> to never show this again</div>-><div class="cg-toast-desc-content">Cliquez <span>ICI</span> pour configurer votre compte, ou <span>ICI</span> pour ne plus afficher ce message.</div>- Effort estimé : S
- Validation :
Grep dans les templates HTML : Login|Registration|Click HERE|OUVRIR PIED DE PAGE retourne 0 hit (sauf si OUVRIR PIED DE PAGE est supprimé par R-UX-01-01).
R-CONV-01-03 : Supprimer ou re-cadrer le widget "Gains récents" casino
- Findings adressés : F-CONV-01-03
- Routes concernées :
casino - Priorité RICE : R=3 I=4 C=4 E=2 → score=24.0
- Action concrète :
Option 1 (recommandée) : supprimer entièrement le widget "Gains récents" du haut de la page casino, le remplacer par une grille de jeux thématique (ex : "Jeux populaires cette semaine" sans montants). Option 2 (compromis) : conserver le widget mais (a) afficher montants en intervalles ("gain entre 10 000 et 100 000 GNF" sans précision sur identités), (b) ajouter une mention claire "Échantillon des dernières 24h, les gains varient et ne sont pas garantis", (c) afficher également les pertes statistiques ("85 % des sessions sont perdantes" ou équivalent factuel sourcé par les données opérateur), pour rétablir la symétrie cognitive.
- Copy-ready :
Option 1 (titre de remplacement, 60 chars) : "Jeux populaires sur Bet224 cette semaine". Option 2 (disclaimer à coller sous le widget, 130 chars) : "Sélection des derniers gains. Les résultats varient et ne sont pas garantis. Voir les conditions de jeu et la politique du jeu responsable." (avec lien vers /jeu-responsable).
- Effort estimé : S
- Validation :
Re-screenshot casino : zone (y < 200) ne doit plus afficher de montants GNF spécifiques sans disclaimer. Si option 2 retenue, le disclaimer doit être lisible (font-size ≥ 14px, contraste ≥ 4.5:1).
R-MOBILE-01-02 : Supprimer maximum-scale=1 du viewport meta injecté par le SDK casino
- Findings adressés : F-MOBILE-01-01
- Routes concernées :
casino - Priorité RICE : R=4 I=3 C=4 E=2 → score=24.0
- Action concrète :
Option 1 (préférée) : identifier le SDK casino tiers (probablement Microgame / Playtech / NetEnt aggregator vu les noms "Spribe Games", "Top Providers", "Amigo Gaming" sur la capture casino) et demander à l'éditeur de retirer maximum-scale=1 du viewport injecté. Option 2 (palliatif client-side) : ajouter en pied de page un script MutationObserver qui surveille les insertions <meta name="viewport"> après chargement et corrige la valeur. Pattern : observer document.head, sur ajout de meta[name="viewport"], si content inclut maximum-scale=1, le réécrire en width=device-width, initial-scale=1. Voir exemple copy-ready.
- Copy-ready :
JavaScript palliatif (à placer en fin de <body>) : <script>(function(){var obs=new MutationObserver(function(muts){muts.forEach(function(m){m.addedNodes.forEach(function(n){if(n.nodeType===1&&n.tagName==='META'&&n.getAttribute('name')==='viewport'&&n.getAttribute('content').indexOf('maximum-scale=1')!==-1){n.setAttribute('content','width=device-width, initial-scale=1');}});});});obs.observe(document.head,{childList:true,subtree:false});})();</script>
- Effort estimé : S
- Validation :
Re-run axe-core sur /casino mobile : violations[].id = "meta-viewport" doit avoir disparu. Test manuel iOS Safari + Android Chrome : pincer-zoomer sur /casino doit fonctionner (zoom appliqué visible).
R-A11Y-01-06 : Corriger le contraste du filtre Sport des promotions (2.6:1 vers ≥ 4.5:1)
- Findings adressés : F-A11Y-01-07
- Routes concernées :
promotions - Priorité RICE : R=3 I=3 C=5 E=2 → score=22.5
- Action concrète :
Modifier la couleur de fond du filtre actif .bottone-filtro quand filtro-dati="2" (Sport) : soit assombrir le vert à #5e7d1f (ratio blanc 4.51:1), soit basculer la couleur du texte sur du noir sur le vert clair existant (#000 sur #83ae30 = 9.4:1, OK). Décision design : préférer assombrir le vert pour cohérence avec le reste de la charte (à valider avec angle UI / brand guidelines).
- Copy-ready :
Pas de copy à modifier (libellés des filtres conservés).
- Effort estimé : S
- Validation :
Re-run axe-core sur promotions : violations[].id == "color-contrast" retourne 0. Vérifier les autres états (hover, focus) tous les filtres.
R-TRUST-01-10 : Traduire ou supprimer les chaînes italiennes hard-codées dans les labels JSON pour cohérence localisation GN
- Findings adressés : F-TRUST-01-12
- Routes concernées :
all - Priorité RICE : R=3 I=3 C=5 E=2 → score=22.5
- Action concrète :
(1) Extraire toutes les chaînes italiennes du fichier cg_LABEL (sport-home.raw.html ligne 250, équivalent dans toutes les pages). (2) Identifier celles qui sont en italien et non traduites. (3) Faire traduire en français par un traducteur français/italien. (4) Remplacer les chaînes hard-codées par leurs équivalents français dans le fichier localisé GN. (5) Identifier les chaînes qui référencent le régulateur italien (ADM, RUA, Anagrafe dei Conti) et les remplacer par les équivalents guinéens (ARSJPA, registre auto-exclusion GN si existant, à clarifier Legal-check) OU les supprimer si le concept ne s'applique pas en GN.
- Copy-ready :
Exemple de remplacement pour la chaîne exclusion.determ : Avant : "exclusion.determ":"Ti ricordiamo che in caso di autoesclusione, il Concessionario sarà tenuto a comunicare tale volontà all\\'Anagrafe dei Conti di Gioco, gestita dall\\'ADM, inserendoti nel Registro Unico degli Autoesclusi (RUA) e per te sarà impossibile accedere al gioco per il periodo di autoesclusione da tutti i conti gioco di cui sei titolare, anche se attivati con un altro Concessionario." Après (français adapté GN, à valider Legal-check pour le mécanisme exact de registre auto-exclusion GN) : "exclusion.determ":"Nous vous rappelons qu'en cas d'auto-exclusion, Bet224 [communique cette volonté à l'ARSJPA / au registre national d'auto-exclusion si existant en GN, à valider Legal-check]. Il vous sera impossible d'accéder au jeu pendant la durée de l'auto-exclusion choisie." Exemple chaîne header.disclaimer : Avant : "header.disclaimer":"Il gioco è vietato ai minori di diciotto anni..." (italien, mention âge italien) Après : "header.disclaimer":"L'accès à Bet224 est interdit aux mineurs (âge légal [SEUIL] ans en Guinée). Le jeu d'argent peut entraîner une dépendance. Jouez avec modération." (français, seuil à confirmer)
- Effort estimé : M
- Validation :
Grep sur les pages re-crawlées : aucune chaîne italienne residuelle dans cg_LABEL (mots-clés "Concessionario", "Anagrafe", "ADM", "diciotto", "gioco" en valeur). Test parcours utilisateur inscrit : aucune popup ou écran ne doit afficher de texte italien.
R-A11Y-01-12 : Ajouter un H1 unique et signifiant sur chaque route
- Findings adressés : F-A11Y-01-08
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=4 E=2 → score=20.0
- Action concrète :
Ajouter un <h1> en haut de chaque route, intégré au layout, contenant le sujet de la page. Sur les routes catalogue (sport, casino, promotions), le H1 peut être visuellement discret (classe sr-only si pas désiré dans le design) mais doit être présent dans le DOM.
- Copy-ready :
Propositions copy-ready (ton sobre, sans incitation, conforme site-context.yaml) :
sport-home:<h1>Paris sportifs en ligne - Bet224 Guinée</h1>sport:<h1>Catalogue des compétitions sportives - Bet224</h1>casino:<h1>Catalogue des jeux de casino - Bet224</h1>promotions:<h1>Promotions et bonus - Bet224</h1>
À ne pas appliquer en l'état si le red team Legal-check identifie un wording contraint par la réglementation guinéenne (cf Limites).
- Effort estimé : S
- Validation :
Re-run axe-core : violations[].id == "page-has-heading-one" retourne 0 sur les 4 routes.
R-UX-01-04 : Restructurer le bandeau cookies en bandeau de consentement granulaire avec option "Refuser"
- Findings adressés : F-UX-01-03
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=4 E=3 → score=20.0
- Action concrète :
Remplacer le bandeau actuel par un composant : (1) wording neutre sans "consentement par poursuite", (2) trois boutons "Accepter tout", "Refuser tout", "Personnaliser", (3) modal "Personnaliser" qui permet d'activer / désactiver les catégories (essentiels obligatoires, mesure d'audience, profilage), (4) une page Cookies en HTML (pas un PDF) accessible depuis le footer. Stocker le choix en cookie technique 12 mois.
- Copy-ready :
Wording bandeau : <div id="cg-barra-cookies" role="dialog" aria-label="Préférences cookies"> <p>Nous utilisons des cookies pour faire fonctionner ce site, mesurer son audience et personnaliser certains contenus. Vous pouvez accepter, refuser ou choisir le détail.</p> <div class="cg-cookies-actions"> <button class="cg-cookies-refuse">Refuser tout</button> <button class="cg-cookies-customize">Personnaliser</button> <button class="cg-cookies-ok">Accepter tout</button> <a class="cg-cookies-more-info" href="/cookies">En savoir plus</a> </div></div>. Page Cookies : créer /cookies (HTML) reprenant le contenu du PDF actuel external_cms/pdf/Cookies_Policy.pdf, en français, structurée avec H1 "Politique des cookies" et sections par catégorie.
- Effort estimé : L
- Validation :
Test manuel : 3 boutons visibles, modal Personnaliser fonctionnelle, choix mémorisé sur 12 mois. Re-run analyze_conversion_signals.py après cliquer "Refuser" : le bandeau ne réapparaît pas pendant 12 mois. Test mobile (à instrumenter) : le bandeau reste lisible sur 390px.
R-UI-01-06 : Introduire 3 niveaux d'élévation (card flat / card raised / popover) via box-shadow
- Findings adressés : F-UI-01-06, F-UI-01-08
- Routes concernées :
all (priorité casino,sport,promotions) - Priorité RICE : R=4 I=3 C=4 E=3 → score=16.0
- Action concrète :
Définir 3 tokens shadow couvrant les niveaux d'élévation usuels : --shadow-flat: none (base, blocs passifs), --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.1) (cards interactives au repos), --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.15) (cards hover, popovers, dropdowns). Appliquer --shadow-sm aux cards des routes denses (Spribe Games casino, Promo cards, Tournois à la une sport-home). Appliquer --shadow-md sur hover des cards casino et sur le ticket sport (panel droit). Le bandeau cookies doit recevoir --shadow-md pour marquer son statut de message intrusif distinct du chrome.
- Copy-ready :
Tokens CSS à placer dans :root : ``css :root { --shadow-flat: none; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.1); --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.15); } .card { box-shadow: var(--shadow-sm); transition: box-shadow 0.2s ease; } .card:hover { box-shadow: var(--shadow-md); } .cookies-banner { box-shadow: var(--shadow-md); } ``
- Effort estimé : M
- Validation :
Re-run analyze_design_system.py : aggregate.effects.box_shadows[].value contient au minimum les 3 valeurs déclarées (none, 0 1px 2px rgba(0, 0, 0, 0.1), 0 4px 8px rgba(0, 0, 0, 0.15)) avec des counts > 0 sur des contextes [class*='card'], [class*='button'].
R-A11Y-01-13 : Englober les zones du header dans des landmarks sémantiques
- Findings adressés : F-A11Y-01-10
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=4 E=3 → score=13.33
- Action concrète :
Restructurer le markup du header pour englober les zones info-utili, disclaimer, cg-barra-cookies, col-lg-3 (logo), bottoni-login dans des landmarks. Solutions canoniques : un <header role="banner"> global qui contient le tout, et un <nav aria-label="Connexion"> autour de bottoni-login. Le banner cookies devrait être un <aside role="region" aria-label="Information sur les cookies"> ou idéalement un <div role="dialog"> selon UX désirée.
- Copy-ready :
Structure cible : <header role="banner"> (englobant .info-utili, .disclaimer, .col-lg-3), <nav aria-label="Compte utilisateur"> (englobant .bottoni-login), <aside role="region" aria-label="Cookies"> (englobant #cg-barra-cookies).
- Effort estimé : M
- Validation :
Re-run axe-core : violations[].id == "region" retourne 0 ou ne contient plus que des nodes de cas particuliers à arbitrer.
R-MOBILE-01-04 : Arbitrer l'architecture responsive (UA-sniffing vs responsive design)
- Findings adressés : F-MOBILE-01-03
- Routes concernées :
all - Priorité RICE : R=5 I=4 C=3 E=5 → score=12.0
- Action concrète :
Étape 1 (POC V2 audit, semaines 1-2) : recrawler les 4 routes en UA mobile (User-Agent iPhone Safari iOS 17) pour confirmer si le backend sert un HTML/CSS distinct (architecture UA-sniffing) ou la même structure responsive. Comparer les raw HTML mobile vs desktop pour mesurer la divergence. Étape 2 (décision direction, semaine 3) : arbitrer entre maintenir UA-sniffing (palliatifs ciblés, audit mobile dédié) ou planifier migration responsive design (chantier multi-trimestres). Étape 3 (livrable plan-action) : si décision migration, produire roadmap responsive avec budget effort et risques (rupture SEO, A/B test pendant transition, rollback).
- Copy-ready :
N/A (action stratégique, pas rédactionnelle).
- Effort estimé : L
- Validation :
Document interne _subagent-outputs/DEEP-MOBILE-02-arch.md (V2 audit) avec diff serveur HTML mobile vs desktop sourcé sur raw HTML capturés, et recommandation argumentée (responsive vs UA-sniffing) avec coût/bénéfice quantifié.
R-PERF-01-05 : Concaténer / minifier les 6 stylesheets en 1-2 fichiers ou utiliser HTTP/2 push / Early Hints
- Findings adressés : F-PERF-01-01
- Routes concernées :
all - Priorité RICE : R=5 I=3 C=3 E=4 → score=11.25
- Action concrète :
Trois pistes selon contraintes :
- Si HTTP/2 / HTTP/3 actif sur bet224.gn (à vérifier avec
curl -I --http2ou via DevTools Protocol column) : l'impact multi-fichier est déjà fortement réduit, prioriser plutôt l'inline du CSS critique above-the-fold + defer du reste. - Bundler les 4 first-party (
base.jsp,default_contogioco_desktop.css,adeguamento.css,toast.css) en 1 fichierbet224-bundle.cssau build, servi avec cache long. - Garder bootstrap.min.css + fontawesome séparés car cachables long-terme inter-pages, ajouter
<link rel="preload" as="style">pour parallélisation.
- Copy-ready :
Vérification HTTP/2 : `` curl -I --http2 https://www.bet224.gn/sport-home ` Le header HTTP/2 200` confirme HTTP/2. Si présent, prioriser piste 1.
- Effort estimé : L
- Validation :
PSI diagnostic "Reduce unused CSS" et "Eliminate render-blocking resources" : savings doit baisser de > 50 % vs baseline.
R-UI-01-07 : Refonte du logo Bet224 sur une seule couleur brand (rouge #b21116 ou monochrome)
- Findings adressés : F-UI-01-07
- Routes concernées :
all (template header commun) - Priorité RICE : R=5 I=3 C=3 E=4 → score=11.25
- Action concrète :
Refondre le logo Bet224 en un seul ton, idéalement le rouge brand #b21116 (pour l'aligner sur le primary CTA, cohérent avec R-UI-01-01) ou en monochrome noir pour neutralité maximale. Conserver l'italique des chiffres 224 si c'est un parti graphique assumé par le client. Décliner le logo en versions : color (header light), inverse (header dark / pied de page sombre), monochrome (favicon, mentions). Demander au client si une charte logo officielle existe ailleurs ; sinon proposer la refonte comme reco brand. À soumettre à validation client avant implémentation.
- Copy-ready :
Pas de copy littéraire à modifier (le wordmark reste Bet224). Brief asset à fournir au designer (à utiliser tel quel dans la commande) : > Refonte du logo Bet224 : wordmark monochrome rouge #b21116, typographie sans-serif gras italique sur les chiffres 224, casing strict Bet224 (jamais BET224, bet224, Bet 224, bet-224). Décliner en 3 variantes : light bg (#b21116 sur fond clair), dark bg (#ffffff sur fond foncé), favicon 32x32. Exporter en SVG + PNG @1x @2x @3x. Source de naming et formes interdites : site-context.yaml brand.forms_to_avoid.
- Effort estimé : L
- Validation :
Inspection visuelle : le logo dans screenshots/sport-home/desktop.png zone x=15-145, y=35-70 utilise une seule couleur brand. Le fichier external_cms/GUINEA/img/logo-bet-224.png a été remplacé par un SVG monochrome (vérifier via DOM <img src=...> ou <svg>). Cohérence chromatique avec les CTAs primaires (R-UI-01-01).
R-UX-01-06 : Page Promotions, ajouter un récap textuel sous chaque card et harmoniser le wording bonus
- Findings adressés : F-UX-01-07
- Routes concernées :
promotions - Priorité RICE : R=2 I=4 C=4 E=3 → score=10.67
- Action concrète :
(1) Ajouter sous chaque card promo un mini-récap textuel (3-5 lignes) : montant maximum du bonus, conditions de mise (wagering), durée de validité, sports éligibles, lien vers les conditions complètes. (2) Réécrire le titre du visuel principal pour retirer la promesse de gain (AUGMENTE TES GAINS est interdit selon site-context). (3) Renommer les CTA "EN SAVOIR PLUS" en libellé d'action explicite ("Voir les conditions").
- Copy-ready :
Titre visuel principal (à refaire avec design) : remplacer "MAXI BONUS, AUGMENTE TES GAINS JUSQU'À 500 %" par Bonus de bienvenue, jusqu'à 100 % sur votre premier dépôt. (Le pourcentage exact doit refléter l'offre réelle, à confirmer client ; éviter 500 % qui suggère un gain démesuré, formulation factuelle à privilégier.) Récap sous chaque card (template) : <div class="promo-recap"> <p><strong>Bonus maximum :</strong> 1 000 000 GNF.</p> <p><strong>Conditions de mise :</strong> Mises × N à effectuer sur des paris sportifs avant retrait (cote minimum X, sports éligibles : football, basket).</p> <p><strong>Validité :</strong> 30 jours après activation.</p> <p><a href="/promotions/welcome-sport/conditions">Voir toutes les conditions</a></p></div> (N, X et les sports exacts à obtenir du client, copy-ready paramétré). CTA card : remplacer <button>EN SAVOIR PLUS</button> par <a href="/promotions/welcome-sport/conditions">Voir les conditions</a> (action explicite, pas "savoir plus" vague).
- Effort estimé : M
- Validation :
Re-crawl /promotions : pages[3].word_count doit passer d'environ 108 à au moins 400 mots (présence du récap). Vérifier que OUVRIR PIED DE PAGE n'est plus le primary_cta (résolu via R-UX-01-01). Test manuel : 3 cards comparables sans cliquer "EN SAVOIR PLUS".
R-UI-01-05 : Définir une échelle de spacing modulaire 4-base et purger les sub-pixel
- Findings adressés : F-UI-01-05
- Routes concernées :
all - Priorité RICE : R=5 I=2 C=4 E=4 → score=10.0
- Action concrète :
Définir 8 tokens spacing en multiples de 4 : --space-0: 0px, --space-1: 4px, --space-2: 8px, --space-3: 12px, --space-4: 16px, --space-5: 20px, --space-6: 24px, --space-8: 32px. Migrer toutes les valeurs sub-pixel et hors-échelle vers la valeur 4-base la plus proche (table de migration : 1.5px / 1.8px / 2.5px / 3px / 3.75px / 4.5px -> 4px, 5px / 6px / 7.5px -> 8px, 9px / 10px -> 8px ou 12px selon contexte, 15px -> 16px, 17.5px -> 16px, 19.3594px -> 20px). Supprimer les classes utilitaires Bootstrap qui produisent du sub-pixel (.p-1 à 0.25rem donne du sub-pixel si font-size héritée n'est pas 16px).
- Copy-ready :
Tokens CSS à placer dans :root : ``css :root { --space-0: 0px; --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; } `` Migration progressive : convertir d'abord les composants atomiques (boutons, inputs) puis les molécules (cards, nav items).
- Effort estimé : L
- Validation :
Re-run analyze_design_system.py : aggregate.spacing.padding_top[].value, padding_right, padding_bottom, padding_left ne contiennent plus que des multiples de 4 px. Aucune valeur sub-pixel. Nombre de valeurs uniques par axe spacing <= 8.
Priorité LOW (RICE < 10 ou non scoré)
R-CONV-01-05 : Réduire la densité de boutons "JOUER" sur casino, ajouter alternatives (démo, info jeu)
- Findings adressés : F-CONV-01-05
- Routes concernées :
casino - Priorité RICE : R=3 I=3 C=3 E=3 → score=9.0
- Action concrète :
Sur chaque card de jeu, remplacer le bouton "JOUER" unique par un dual-CTA : (1) un bouton primaire "Démo gratuite" (sans dépôt) et (2) un bouton secondaire "Jouer en réel" (qui ouvre le jeu mode argent réel après éventuel rappel des limites du joueur si connecté). Ajouter au survol une mini-tooltip avec RTP (Return To Player) du jeu et lien "À propos de ce jeu".
- Copy-ready :
CTA primaire card (1-4 mots) : "Démo gratuite". CTA secondaire card (1-4 mots) : "Jouer en réel". Tooltip RTP (≤80 chars) : "Taux de retour joueur : XX %. Voir les règles et limites du jeu." (XX à remplir par card).
- Effort estimé : M
- Validation :
Re-crawl casino, conversion-signals/casino.json → moins de 21 boutons portant le même texte "JOUER" (mesure : compter occurrences distinctes du detailed.ctas[].text). Diversification mesurable (au moins 2 textes distincts par card : "Démo gratuite" et "Jouer en réel").
R-UI-01-09 : Limiter la densité chromatique des cards de jeux casino (uniformisation backgrounds Spribe Games)
- Findings adressés : F-UI-01-08
- Routes concernées :
casino - Priorité RICE : R=3 I=3 C=3 E=3 → score=9.0
- Action concrète :
Sur le carrousel Spribe Games (et par extension Amigo Gaming), uniformiser le fond des cards à un noir profond (#0d0d0d) ou un blanc (#ffffff) avec uniquement le logo / illustration du jeu en couleur. Conserver la spécificité visuelle de chaque jeu via l'illustration (image PNG ou SVG centrale) plutôt que via la couleur de fond. Ajouter --shadow-sm (cf R-UI-01-06) pour l'élévation et un border-radius --radius-md (cf R-UI-01-04). Effet : cognitif load réduit, hiérarchie plus lisible, et l'utilisateur scanne par illustration (familier des marques) plutôt que par couleur saturée.
- Copy-ready :
Pas de copy textuel à modifier. CSS guideline cards (à placer dans casino.css) : ``css .card-game-spribe, .card-game-amigo { background: #0d0d0d; border-radius: var(--radius-md); box-shadow: var(--shadow-sm); padding: var(--space-3); } .card-game-spribe .game-illustration, .card-game-amigo .game-illustration { width: 100%; height: auto; } ``
- Effort estimé : L
- Validation :
Re-run analyze_design_system.py sur casino : per_route[2].unique_background_colors <= 5 (vs 9 mesurés actuellement). Inspection visuelle screenshots/casino/desktop.png : carrousel Spribe Games uniformisé.
R-A11Y-01-11 : Restructurer l'architecture des landmarks main
- Findings adressés : F-A11Y-01-09
- Routes concernées :
sport-home,sport,casino - Priorité RICE : R=3 I=2 C=4 E=3 → score=8.0
- Action concrète :
Identifier dans le template le pattern qui injecte deux <main> (probablement un wrapping SPA #cg_exa-sportAppContainer ou #panel qui contient son propre <main> alors que le layout parent en a déjà un). Décision : garder un seul <main> (le plus extérieur) + transformer le second en <section aria-label="..."> ou <div> selon contexte. Promotions étant déjà OK, étudier son template comme référence.
- Copy-ready :
Si le wrapping intérieur sert de zone applicative distincte : <section aria-label="Catalogue des paris" id="panel"> (pour sport), <section aria-label="Catalogue casino" id="panel"> (pour casino).
- Effort estimé : M
- Validation :
Re-run axe-core sur sport-home, sport, casino : violations[].id ne contient plus landmark-no-duplicate-main, landmark-main-is-top-level, landmark-unique.
R-A11Y-01-14 : Corriger le rôle tablist mal employé sur accordion sport
- Findings adressés : F-A11Y-01-14
- Routes concernées :
sport - Priorité RICE : R=2 I=3 C=4 E=3 → score=8.0
- Action concrète :
Sur #accordionLaterale : soit transformer en vrai tablist avec enfants role="tab" + zones role="tabpanel" + gestion clavier (flèches gauche / droite), soit retirer role="tablist" + aria-multiselectable et utiliser le pattern accordion ARIA (chaque header = <button aria-expanded="false" aria-controls="...">). La deuxième option est la plus simple et la plus appropriée pour un accordion de compétitions.
- Copy-ready :
Si pattern accordion : retirer role="tablist" et aria-multiselectable="true", remplacer chaque <a tabindex="0"> enfant par <button aria-expanded="false" aria-controls="competition-{n}">Nom de la compétition</button> suivi de <div id="competition-{n}" role="region" aria-labelledby="trigger-{n}">[...contenus]</div>.
- Effort estimé : M
- Validation :
Re-run axe-core sur sport : violations[].id == "aria-required-children" retourne 0. Test clavier : navigation tab + Enter / Space ouvre chaque compétition.
R-UX-01-09 : Sport, contextualiser la sidebar Betbuilder avec une mini-explication
- Findings adressés : F-UX-01-09
- Routes concernées :
sport - Priorité RICE : R=2 I=2 C=4 E=2 → score=8.0
- Action concrète :
Sous le bandeau "BETBUILDER" dans la sidebar gauche, ajouter une mini-explication textuelle (1 phrase) + un lien "Comment ça marche" qui ouvre une modale ou redirige vers une page tutoriel.
- Copy-ready :
Wrapping HTML proposé : <a data-toggle="..." class="pointer bg-colore-1 bianco margine-giu" style="..."><strong>Betbuilder</strong></a><p class="sidebar-help">Combinez plusieurs paris sur un même match. <a href="/aide/betbuilder">Comment ça marche ?</a></p>. (Le ratio de contraste actuel sur le bandeau Betbuilder est insuffisant et fait l'objet d'un finding A11Y séparé [REF: DEEP-A11Y-01].)
- Effort estimé : S
- Validation :
Test manuel : un visiteur sans connaissance préalable peut lire "Combinez plusieurs paris sur un même match" sans interaction.
R-UX-01-07 : Casino, réduire la densité above-fold à 1 carrousel vedette + entrée par catégorie
- Findings adressés : F-UX-01-08
- Routes concernées :
casino - Priorité RICE : R=2 I=4 C=3 E=4 → score=6.0
- Action concrète :
Refondre l'above-fold casino : retirer le carrousel "Gains récents" (gains supposés ; cf forbidden_pattern), garder 1 carrousel vedette (par ex. "Sélection éditoriale") + tabs par catégorie (Slots, Live Casino, Jeux instantanés) au-dessus de la fold. Repousser les autres carrousels en dessous, accessibles par scroll ou tabs cliqués. Ajouter un titre H1 unique (cf R-UX-01-02).
- Copy-ready :
Wrapping above-fold (proposition) : <main id="panel"> <h1>Jeux de casino en ligne</h1> <nav role="tablist" aria-label="Catégories de jeux"> <button role="tab" aria-selected="true" aria-controls="tab-selection">Sélection</button> <button role="tab" aria-selected="false" aria-controls="tab-slots">Machines à sous</button> <button role="tab" aria-selected="false" aria-controls="tab-live">Casino en direct</button> <button role="tab" aria-selected="false" aria-controls="tab-instantanes">Jeux instantanés</button> </nav> <div role="tabpanel" id="tab-selection"> <h2>Sélection de l'équipe</h2> <!-- carrousel 5-8 jeux max --> </div> <!-- autres tabpanels masqués par défaut --></main>. Retrait du carrousel "Gains récents" : supprimer la section visible y=70-200 et son data source. (Alternative à cadrer Legal-check : si maintenu, masquer les montants et ne garder que les noms de jeux pour ne pas suggérer un gain prévisible.)
- Effort estimé : L
- Validation :
Re-run analyze_conversion_signals.py sur casino : summary.ctas_above_fold doit passer de 23 à ≤ 10. summary.ctas_total peut rester élevé en scroll mais l'above-fold doit être lisible. Test manuel : un visiteur novice doit pouvoir identifier la promesse en 3 secondes.
R-PERF-01-07 : Nettoyer le template CMS qui génère 7 background-image: url() vides
- Findings adressés : F-PERF-01-07
- Routes concernées :
all - Priorité RICE : R=5 I=1 C=3 E=3 → score=5.0
- Action concrète :
Auditer le template JSP/Velocity qui génère le bloc <style> inline lignes 45-72. Identifier la variable backend qui résout en chaîne vide (probablement ${landingBackground}, ${promozioniSfondo}, etc. non setté quand pas de promo active). Au choix : (a) générer le selector + déclaration UNIQUEMENT quand la variable est non-vide, (b) servir un placeholder transparent 1x1 px par défaut, (c) supprimer ces selectors du template si jamais utilisés.
- Copy-ready :
Pattern cible JSP (option a, conditional rendering) : ``jsp <c:if test="${not empty landingBackground}"> <style>.cg-landing-background { background-image: url('${landingBackground}') !important; }</style> </c:if> ``
- Effort estimé : M
- Validation :
Grep background-image: url() (vide) sur le <head> rendu : count = 0.