[
  {
    "title": "VPS - Baseline sécurité SSH",
    "source": "VPS",
    "category": "Sécurité",
    "tags": ["ssh", "debian", "vps", "hardening", "securité"],
    "context": "VPS Debian 12 exposé sur Internet.",
    "symptomes": ["Tentatives SSH fréquentes", "Besoin de durcir l'accès serveur"],
    "cause": "SSH public doit être sécurisé contre brute-force et accès root.",
    "solution": "Désactiver root, désactiver password auth, garder uniquement clé SSH, AllowUsers enzo, MaxAuthTries 3.",
    "commandes": [
      "sshd -T | egrep 'permitrootlogin|passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|allowusers|maxauthtries'",
      "systemctl reload ssh"
    ],
    "confidence": "validated"
  },
  {
    "title": "VPS - UFW ports publics propres",
    "source": "VPS",
    "category": "Sécurité",
    "tags": ["ufw", "firewall", "ports", "docker", "caddy"],
    "context": "Stack Docker derrière Caddy.",
    "symptomes": ["Risque d'exposition des ports internes Docker", "Applications accessibles hors Caddy"],
    "cause": "Les ports applicatifs Docker ne doivent pas être publics.",
    "solution": "Autoriser uniquement 22/tcp, 80/tcp, 443/tcp. Bloquer 3000, 3001, 3040, 3050, 3070, 3080, 19999.",
    "commandes": [
      "ufw allow 22/tcp",
      "ufw allow 80/tcp",
      "ufw allow 443/tcp",
      "ufw deny 3000/tcp",
      "ufw deny 3001/tcp",
      "ufw deny 3040/tcp",
      "ufw deny 3050/tcp",
      "ufw deny 3070/tcp",
      "ufw deny 3080/tcp",
      "ufw deny 19999/tcp",
      "ufw --force enable",
      "ufw status numbered"
    ],
    "confidence": "validated"
  },
  {
    "title": "VPS - Fail2ban sshd + recidive",
    "source": "VPS",
    "category": "Sécurité",
    "tags": ["fail2ban", "ssh", "recidive", "ban"],
    "context": "VPS exposé avec scans SSH réguliers.",
    "symptomes": ["IP bannies", "Tentatives SSH répétées", "Récidive d'attaques"],
    "cause": "Les bans courts ne suffisent pas contre les IP qui reviennent.",
    "solution": "Activer jail sshd et recidive avec ban longue durée.",
    "commandes": [
      "fail2ban-client status",
      "fail2ban-client status sshd",
      "fail2ban-client status recidive",
      "journalctl -u fail2ban --no-pager -n 100"
    ],
    "confidence": "validated"
  },
  {
    "title": "Docker - docker.sock uniquement pour Portainer",
    "source": "VPS",
    "category": "Docker / Sécurité",
    "tags": ["docker", "docker.sock", "portainer", "securité"],
    "context": "Stack Docker avec plusieurs apps web.",
    "symptomes": ["Un conteneur monte /var/run/docker.sock", "Risque de contrôle total Docker"],
    "cause": "docker.sock donne un accès très puissant au daemon Docker.",
    "solution": "Autoriser docker.sock uniquement à Portainer. Ne jamais le monter dans les apps maison exposées web.",
    "commandes": [
      "docker inspect $(docker ps -aq) | grep -B5 -A5 docker.sock"
    ],
    "confidence": "validated"
  },
  {
    "title": "Caddy - SSL automatique",
    "source": "VPS",
    "category": "Caddy / SSL",
    "tags": ["caddy", "ssl", "https", "certificat"],
    "context": "Sous-domaines ecosentino.fr reverse-proxy via Caddy.",
    "symptomes": ["Question renouvellement certificat SSL", "Besoin de vérifier expiration"],
    "cause": "Caddy gère automatiquement ACME / Let's Encrypt.",
    "solution": "Rien à faire si DNS OK, ports 80/443 ouverts, Caddy actif.",
    "commandes": [
      "docker logs --tail 100 enzo-stack_caddy_1 | grep -Ei 'certificate|renew|obtaining|tls|acme|error' || true",
      "echo | openssl s_client -servername domaine.fr -connect domaine.fr:443 2>/dev/null | openssl x509 -noout -dates"
    ],
    "confidence": "validated"
  },
  {
    "title": "VPS - CPU élevé vps-dashboard à cause de find slash",
    "source": "VPS",
    "category": "Performance",
    "tags": ["vps", "cpu", "docker", "dashboard", "find", "metrics"],
    "context": "Dashboard metrics sur metrics.ecosentino.fr.",
    "symptomes": ["CPU 35-50% sans rien faire", "vps-dashboard à 57-97%", "ps montre find / -path */public/index"],
    "cause": "Le dashboard scannait tout le système avec find /.",
    "solution": "Limiter le scan à /app et /opt/enzo-stack/apps avec maxdepth. Ajouter cache API et refresh 5s.",
    "commandes": [
      "docker stats --no-stream",
      "ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -15",
      "docker exec vps-dashboard sh -lc \"pkill -f 'find /' || true\""
    ],
    "confidence": "validated"
  },
  {
    "title": "Sophos IPsec - Jonction domaine KO RPC indisponible",
    "source": "Xefi",
    "category": "AD / VPN",
    "tags": ["sophos", "ipsec", "rpc", "ad", "domaine", "vpn"],
    "context": "Jonction domaine Windows via tunnel IPsec.",
    "symptomes": ["Erreur : Le serveur RPC n’est pas disponible", "DNS/Kerberos/LDAP/SMB OK", "Jonction domaine impossible"],
    "cause": "Cause validée : accélération IPsec active sur firewall Sophos.",
    "solution": "Désactiver l’accélération IPsec Sophos puis retester la jonction domaine.",
    "commandes": [
      "Test-NetConnection 192.168.25.10 -Port 53",
      "Test-NetConnection 192.168.25.10 -Port 88",
      "Test-NetConnection 192.168.25.10 -Port 389",
      "Test-NetConnection 192.168.25.10 -Port 445",
      "nltest /dsgetdc:DOMAINE.LOCAL"
    ],
    "confidence": "validated"
  },
  {
    "title": "AD - DNS du DC sur la carte réseau pour joindre le domaine",
    "source": "Xefi",
    "category": "AD / DNS",
    "tags": ["ad", "dns", "domaine", "dc", "windows"],
    "context": "Déploiement poste dans domaine client via VPN ou réseau local.",
    "symptomes": ["Jonction domaine impossible", "Nom domaine non résolu", "DC introuvable"],
    "cause": "Le poste doit utiliser le DNS Active Directory pour trouver le domaine.",
    "solution": "Mettre l’IP du DC/DNS AD dans la carte réseau du PC avant jonction.",
    "commandes": [
      "ipconfig /all",
      "nslookup domaine.local IP_DU_DC",
      "nltest /dsgetdc:domaine.local"
    ],
    "confidence": "validated"
  },
  {
    "title": "Office / Excel - Lecture seule ou téléchargement bloqué",
    "source": "Xefi",
    "category": "Microsoft 365",
    "tags": ["office", "excel", "sharepoint", "onedrive", "m365", "compte"],
    "context": "Fichiers Office/SharePoint bloqués.",
    "symptomes": ["Excel affiche Lecture seule", "Téléchargement bloqué", "Fenêtre Microsoft demandant connexion"],
    "cause": "Mauvais compte Office ou session Microsoft 365 désynchronisée.",
    "solution": "Excel > Fichier > Compte > Changer de compte. Reconnecter le bon compte M365.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Microsoft 365 - SPF standard",
    "source": "Xefi",
    "category": "Mail / DNS",
    "tags": ["m365", "spf", "dns", "exchange", "mail"],
    "context": "Configuration domaine mail Microsoft 365.",
    "symptomes": ["Mails en spam", "SPF absent", "SPF incorrect", "Migration vers M365"],
    "cause": "SPF non aligné avec Microsoft 365.",
    "solution": "Configurer le TXT SPF Microsoft 365.",
    "commandes": [
      "TXT @ \"v=spf1 include:spf.protection.outlook.com -all\""
    ],
    "confidence": "validated"
  },
  {
    "title": "DMARC - Politique de départ",
    "source": "Xefi",
    "category": "Mail / DNS",
    "tags": ["dmarc", "dns", "mail", "m365"],
    "context": "Domaine mail sans DMARC.",
    "symptomes": ["Mails en spam", "DMARC absent", "Besoin d'améliorer délivrabilité"],
    "cause": "Aucune politique DMARC publiée.",
    "solution": "Commencer avec une politique souple p=none.",
    "commandes": [
      "_dmarc TXT \"v=DMARC1; p=none;\""
    ],
    "confidence": "validated"
  },
  {
    "title": "Mail Hotmail / Outlook - Erreur 550 S3150",
    "source": "Xefi",
    "category": "Mail",
    "tags": ["hotmail", "outlook", "550", "s3150", "blacklist", "mail"],
    "context": "NDR Microsoft/Outlook/Hotmail.",
    "symptomes": ["550 5.7.1", "messages from IP weren't sent", "IP on Microsoft block list S3150"],
    "cause": "IP sortante du serveur mail bloquée par Microsoft.",
    "solution": "Demander au fournisseur/hébergeur mail de traiter la réputation IP et le déblocage. Vérifier SPF/DKIM/DMARC.",
    "commandes": [
      "Identifier l’IP dans le NDR",
      "dig TXT domaine.fr"
    ],
    "confidence": "validated"
  },
  {
    "title": "Mail Orange - SPF/DNS invalide",
    "source": "Xefi",
    "category": "Mail / DNS",
    "tags": ["orange", "spf", "dns", "mail", "550", "ofr"],
    "context": "Rejet vers boîtes Orange.",
    "symptomes": ["Emetteur invalide", "Veuillez vérifier SPF/DNS", "Rejet vers Orange"],
    "cause": "SPF absent, invalide ou domaine DNS géré par prestataire tiers.",
    "solution": "Corriger le SPF. Si le domaine n’est pas géré en interne, demander au prestataire DNS.",
    "commandes": [
      "nslookup -type=TXT domaine.fr",
      "dig TXT domaine.fr"
    ],
    "confidence": "validated"
  },
  {
    "title": "BitLocker - Clé de récupération demandée régulièrement",
    "source": "Xefi",
    "category": "Windows / Sécurité",
    "tags": ["bitlocker", "tpm", "recovery", "windows"],
    "context": "Poste Windows chiffré BitLocker.",
    "symptomes": ["Clé BitLocker demandée tous les X jours", "Volume C chiffré", "Protecteurs TPM + RecoveryPassword"],
    "cause": "Changement perçu côté TPM/boot/BIOS ou état BitLocker à resynchroniser.",
    "solution": "Suspendre BitLocker pour 2 redémarrages puis vérifier BIOS/TPM/Secure Boot/MAJ.",
    "commandes": [
      "manage-bde -status",
      "manage-bde -protectors -get C:",
      "Suspend-BitLocker -MountPoint C: -RebootCount 2"
    ],
    "confidence": "validated"
  },
  {
    "title": "Outlook TSE - Collage image KO sauf mode sans échec",
    "source": "Xefi",
    "category": "TSE / Outlook",
    "tags": ["outlook", "tse", "rdp", "clipboard", "image"],
    "context": "Outlook sur serveur TSE.",
    "symptomes": ["Impossible de coller image/capture en mode normal", "Fonctionne avec outlook.exe /safe"],
    "cause": "Add-in, cache Office, composant Outlook ou presse-papiers RDP.",
    "solution": "Tester safe mode, désactiver compléments, profil neuf, réparation Office, vérifier clipboard RDP.",
    "commandes": [
      "outlook.exe /safe"
    ],
    "confidence": "probable"
  },
  {
    "title": "TSE / RDP - Déconnexion après veille",
    "source": "Xefi",
    "category": "TSE / Windows",
    "tags": ["tse", "rdp", "veille", "powercfg"],
    "context": "Poste client qui perd la session TSE après veille.",
    "symptomes": ["Session RDP déconnectée après veille", "Déconnexion au réveil du poste"],
    "cause": "Paramètres d’alimentation ou économie d’énergie carte réseau.",
    "solution": "Désactiver veille secteur et vérifier carte réseau/stratégies RDP.",
    "commandes": [
      "powercfg /query SCHEME_CURRENT SUB_SLEEP STANDBYIDLE",
      "powercfg /change standby-timeout-ac 0"
    ],
    "confidence": "probable"
  },
  {
    "title": "PC lent - Diagnostic rapide",
    "source": "Xefi",
    "category": "Windows",
    "tags": ["pc lent", "windows", "powershell", "disque", "ram"],
    "context": "Poste client lent.",
    "symptomes": ["PC lent", "Disque presque plein", "AppData volumineux", "OneDrive/Outlook/Chrome consomment"],
    "cause": "Espace disque faible, processus lourds, disque vieillissant, RAM insuffisante.",
    "solution": "Contrôler top process, espace disque, nettoyage, sfc/chkdsk, envisager SSD/RAM.",
    "commandes": [
      "Get-Process | Sort-Object CPU -Descending | Select-Object -First 15 Name,Id,CPU,@{Name='RAM_MB';Expression={[math]::Round($_.WorkingSet64/1MB,2)}}",
      "sfc /scannow",
      "chkdsk /scan",
      "cleanmgr"
    ],
    "confidence": "validated"
  },
  {
    "title": "WMI / CIM - Classe non valide",
    "source": "Xefi",
    "category": "Windows",
    "tags": ["wmi", "cim", "powershell", "inventaire"],
    "context": "Inventaire Windows en PowerShell KO.",
    "symptomes": ["Get-CimInstance Win32_* classe non valide", "HRESULT 0x80041010"],
    "cause": "Repository WMI endommagé ou classes absentes.",
    "solution": "Vérifier/réparer WMI, utiliser Get-ComputerInfo en secours.",
    "commandes": [
      "winmgmt /verifyrepository",
      "winmgmt /salvagerepository",
      "Get-ComputerInfo"
    ],
    "confidence": "probable"
  },
  {
    "title": "Windows 11 - Vérification compatibilité",
    "source": "Xefi",
    "category": "Windows",
    "tags": ["windows 11", "compatibilite", "tpm", "uefi", "cpu"],
    "context": "Vérifier si un PC peut passer Windows 11.",
    "symptomes": ["Besoin de compatibilité Windows 11", "PC Windows 10 ancien"],
    "cause": "Windows 11 nécessite CPU supporté, TPM 2.0, UEFI/Secure Boot.",
    "solution": "Vérifier modèle, CPU, BIOS UEFI, TPM.",
    "commandes": [
      "Get-ComputerInfo | Select CsManufacturer,CsModel,BiosFirmwareType,OsName,OsVersion,CsProcessors,CsTotalPhysicalMemory",
      "Get-Tpm"
    ],
    "confidence": "probable"
  },
  {
    "title": "3CX - Rapport appels manqués hors horaires",
    "source": "Xefi",
    "category": "3CX",
    "tags": ["3cx", "rapport", "appels", "horaires", "mail"],
    "context": "Client veut le nombre d’appels manqués avant 9h, entre 12h-14h et après 17h.",
    "symptomes": ["Besoin rapport hors horaires", "Besoin envoi automatique par mail"],
    "cause": "Rapport planifié à filtrer selon plages de fermeture.",
    "solution": "Utiliser rapports 3CX en français, filtrer appels manqués/non répondus et planifier par mail.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "3CX - Message fermeture GAN et IVR",
    "source": "Xefi",
    "category": "3CX",
    "tags": ["3cx", "ivr", "horaires", "repondeur", "standard"],
    "context": "Message fermeture après 17h et mardi/mercredi/jeudi après-midi dès 14h.",
    "symptomes": ["Message fermeture spécifique", "Routage touche 1 sinistre", "Routage touche 2 administratif"],
    "cause": "Besoin horaires spécifiques + IVR.",
    "solution": "Configurer horaires, prompt audio, routage IVR vers les bons numéros/extensions.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "Synology DS218Play - Heure automatique KO",
    "source": "Xefi",
    "category": "NAS",
    "tags": ["synology", "ntp", "heure", "dns", "ds218play"],
    "context": "NAS Synology qui refuse de se mettre à l’heure automatiquement.",
    "symptomes": ["Décalage heure", "NTP automatique KO"],
    "cause": "DNS, passerelle, NTP, firewall ou timezone incorrect.",
    "solution": "Vérifier timezone DSM, DNS, passerelle, serveur NTP et firewall.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "SharePoint / Synology - Erreurs de synchronisation",
    "source": "Xefi",
    "category": "NAS / SharePoint",
    "tags": ["synology", "sharepoint", "sync", "droits", "permissions"],
    "context": "Synchronisation NAS vers SharePoint.",
    "symptomes": ["Erreurs de synchronisation", "Droits incohérents", "Disque presque plein"],
    "cause": "Permissions ou espace disque insuffisant.",
    "solution": "Corriger droits, vérifier dossiers en erreur, libérer espace, éviter dossiers non triés énormes.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "Site web KO sur un seul poste",
    "source": "Xefi",
    "category": "Windows / Réseau",
    "tags": ["dns", "proxy", "navigateur", "certificat", "site"],
    "context": "Un site fonctionne sur les autres postes mais pas sur un poste précis.",
    "symptomes": ["Erreur serveur sur un seul poste", "Autres postes OK", "Navigation privée KO", "Autre navigateur KO"],
    "cause": "Problème local : DNS/cache/proxy/certificat/antivirus web/profil.",
    "solution": "Flush DNS, vérifier proxy, date/heure, antivirus web, certificats, profil Windows, test réseau différent.",
    "commandes": [
      "ipconfig /flushdns",
      "netsh winhttp show proxy",
      "nslookup facturesfournisseurs-enedis.fr"
    ],
    "confidence": "probable"
  },
  {
    "title": "AnyDesk - Reset accès employé parti",
    "source": "Xefi",
    "category": "Accès distant / Sécurité",
    "tags": ["anydesk", "securite", "employe", "depart"],
    "context": "Employé parti qui utilisait AnyDesk.",
    "symptomes": ["Besoin de couper accès distant", "Session AnyDesk ancien employé"],
    "cause": "Accès sans surveillance ou appareil de confiance encore actif.",
    "solution": "Changer mot de passe AnyDesk, désactiver accès sans surveillance, retirer appareils de confiance, vérifier service au démarrage.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "Départ employé TSE - Sécurisation",
    "source": "Xefi",
    "category": "AD / Sécurité",
    "tags": ["tse", "ad", "employe", "depart", "securite"],
    "context": "Compte utilisateur TSE d’un employé parti.",
    "symptomes": ["Compte à désactiver", "Bureau/Documents à récupérer"],
    "cause": "Procédure de départ utilisateur.",
    "solution": "Désactiver compte AD/TSE, récupérer données nécessaires, couper VPN/M365/AnyDesk/mail selon autorisation client.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Sophos SSLVPN - Android KO mais iPhone OK",
    "source": "Xefi",
    "category": "VPN",
    "tags": ["sophos", "sslvpn", "android", "iphone", "auth"],
    "context": "Connexion SSLVPN Sophos.",
    "symptomes": ["iPhone OK", "Android KO", "Log wrong credentials"],
    "cause": "Profil VPN, identifiant, mot de passe, clavier Android, caractères spéciaux ou import config incorrect.",
    "solution": "Réimporter profil SSLVPN, vérifier username exact, mot de passe, portail utilisateur, auth locale.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "HP / Mini PC - Boot PXE",
    "source": "Xefi",
    "category": "Matériel",
    "tags": ["hp", "pxe", "boot", "bios"],
    "context": "Boot PXE sur mini PC HP.",
    "symptomes": ["Besoin booter sur PXE"],
    "cause": "Menu boot nécessaire.",
    "solution": "Touche souvent F9 pour boot menu, F10 pour BIOS, Esc pour Startup Menu.",
    "commandes": [],
    "confidence": "probable"
  },
  {
    "title": "Raspberry - Connexion via ISL",
    "source": "Xefi",
    "category": "Linux / Remote",
    "tags": ["raspberry", "isl", "linux", "remote"],
    "context": "Prise en main Raspberry via ISL.",
    "symptomes": ["Besoin connexion distante Raspberry"],
    "cause": "Compatibilité paquet ISL selon architecture ARM.",
    "solution": "Vérifier architecture et OS, installer agent compatible si disponible, sinon SSH/VNC.",
    "commandes": [
      "uname -m",
      "cat /etc/os-release"
    ],
    "confidence": "probable"
  },
  {
    "title": "Debian 12 - Mise à l’heure VPS",
    "source": "VPS",
    "category": "Linux",
    "tags": ["debian", "heure", "ntp", "timedatectl"],
    "context": "VPS Debian 12 avec heure incorrecte.",
    "symptomes": ["Décalage date/heure", "NTP non actif"],
    "cause": "Timezone ou NTP incorrect.",
    "solution": "Configurer timezone Europe/Paris et activer NTP.",
    "commandes": [
      "timedatectl",
      "timedatectl set-timezone Europe/Paris",
      "timedatectl set-ntp true"
    ],
    "confidence": "validated"
  },
  {
    "title": "SIETEL - Starlink / 4G / VoIP avec VPS IP fixe",
    "source": "Sietel",
    "category": "VoIP / VPN",
    "tags": ["starlink", "vps", "wireguard", "sip", "ucm6301", "alphalink"],
    "context": "Sites client derrière Starlink ou 4G sans IP publique fixe.",
    "symptomes": ["Pas d’IP publique fixe", "SIP ou accès distant compliqué", "Besoin stabilité téléphonie"],
    "cause": "CGNAT ou absence d’IPv4 publique fixe.",
    "solution": "Utiliser un petit VPS avec IP fixe comme ancre VPN. Tunnel sortant WireGuard/IPsec depuis site. Router SIP/RTP si nécessaire.",
    "commandes": [
      "Prévoir SIP 5060 selon opérateur",
      "Prévoir RTP 10000-20000 selon PBX",
      "Préférer WireGuard pour lien site <-> VPS"
    ],
    "confidence": "validated"
  },
  {
    "title": "SIETEL - Supervision Centreon / Prometheus / Blackbox / Grafana",
    "source": "Sietel",
    "category": "Supervision",
    "tags": ["centreon", "prometheus", "blackbox", "grafana", "supervision"],
    "context": "Supervision clients SIETEL/NEOTEL.",
    "symptomes": ["Besoin monitoring clients", "Alertes services", "Rapport quotidien"],
    "cause": "Supervision multi-clients nécessaire.",
    "solution": "Centreon pour supervision clients, Prometheus/Blackbox/Grafana pour métriques et checks HTTP/TCP.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "SIETEL - pfSense datacenter VPN / NAT / BGP",
    "source": "Sietel",
    "category": "Réseau",
    "tags": ["pfsense", "bgp", "openvpn", "wireguard", "nat", "datacenter"],
    "context": "Contexte datacenter SIETEL avec pfSense.",
    "symptomes": ["Besoin VPN client", "Besoin NAT/routage", "Contexte BGP"],
    "cause": "Infrastructure multi-sites et services hébergés.",
    "solution": "Utiliser pfSense pour VPN, NAT, états firewall, routes et BGP si nécessaire. Documenter VIPs et règles.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "SIETEL - Grandstream UCM6301",
    "source": "Sietel",
    "category": "Téléphonie",
    "tags": ["ucm6301", "grandstream", "sip", "alphalink", "yealink"],
    "context": "Déploiements téléphonie SIETEL.",
    "symptomes": ["Choix PBX hébergé ou local", "Besoin trunk SIP"],
    "cause": "Dimensionnement selon nombre de téléphones.",
    "solution": "Moins de 5 téléphones : centralisation possible. Plus de 5 : UCM6301 sur site. Adapter selon IP fixe/VPN.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "SIETEL - TP-Link MR600 / Dual WAN 4G",
    "source": "Sietel",
    "category": "Réseau",
    "tags": ["mr600", "4g", "fibre", "pppoe", "wan backup"],
    "context": "Routeurs client avec fibre et secours 4G.",
    "symptomes": ["Besoin WAN fibre", "Besoin backup 4G"],
    "cause": "Continuité de service.",
    "solution": "Configurer WAN1 fibre, WAN2 4G SIM secours. Alphalink fournit souvent identifiants PPPoE fibre.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Spotify Jam - Fonctionnalités et incidents connus",
    "source": "VPS",
    "category": "Apps / Party",
    "tags": ["spotify-jam", "node", "party", "jam", "votes"],
    "context": "Application jam.ecosentino.fr.",
    "symptomes": ["Bugs boutons retirer/block/reset votes/votes", "Besoin anti-doublon", "Besoin restrictions propres"],
    "cause": "Application Node/Express maison.",
    "solution": "Maintenir host page, délai queue, participants, kick, blocklist/whitelist, anti-doublon 5/10/15/30 min, votes.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Party Games - Règles Biskit",
    "source": "VPS",
    "category": "Apps / Jeux",
    "tags": ["party", "biskit", "rules", "dice"],
    "context": "Jeu Biskit sur party.ecosentino.fr.",
    "symptomes": ["Besoin d’implémenter règles exactes"],
    "cause": "Fonctionnalité jeu soirée.",
    "solution": "21 prison. Doubles 1/2/4/5 donnent gorgées. Double 3/6 règle/lien/distribution. 9 précédent, 10 lanceur, 11 suivant. 41/42 duel. 61/52/43 Biskit.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Party Games - Règles Mer",
    "source": "VPS",
    "category": "Apps / Jeux",
    "tags": ["party", "mer", "rules", "dice"],
    "context": "Jeu Mer sur party.ecosentino.fr.",
    "symptomes": ["Besoin synchro multi-téléphones", "Besoin règles exactes"],
    "cause": "Fonctionnalité jeu soirée.",
    "solution": "2 lancers/personne. 21/12 mer. Doubles = gorgées simples. 66 ou 21 sauve. 51 change sens. Popup perte 10s synchronisé.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Party Games - Règles Pyramide",
    "source": "VPS",
    "category": "Apps / Jeux",
    "tags": ["party", "pyramide", "cards"],
    "context": "Jeu Pyramide sur party.ecosentino.fr.",
    "symptomes": ["Besoin cartes cachées", "Besoin gestion menteur"],
    "cause": "Fonctionnalité jeu soirée.",
    "solution": "64 cartes 2-As, lignes configurables, gorgées par ligne, cartes cachées téléphone, preuve menteur par clic carte, historique masqué en partie.",
    "commandes": [],
    "confidence": "validated"
  },
  {
    "title": "Portainer - Sensibilité sécurité",
    "source": "VPS",
    "category": "Docker / Sécurité",
    "tags": ["portainer", "docker", "securite", "admin"],
    "context": "Portainer accessible via admin.ecosentino.fr.",
    "symptomes": ["Portainer contrôle Docker", "Risque fort si compromis"],
    "cause": "Portainer possède accès docker.sock.",
    "solution": "Pas d’exposition directe port 9000, HTTPS via Caddy, mot de passe fort, 2FA si possible.",
    "commandes": [
      "docker inspect portainer | grep docker.sock -n"
    ],
    "confidence": "validated"
  }
]
