framework:
    rate_limiter:
        contact_form:
            policy: sliding_window
            limit: 3
            interval: '10 minutes'

        # Par EMAIL cible : borne le mailbombing d'une même adresse, indépendamment
        # de l'IP (un bot qui tourne ses IP reste limité par destinataire).
        contact_form_email:
            policy: sliding_window
            limit: 3
            interval: '1 hour'

        register_otp_send_email:
            policy: sliding_window
            limit: 3
            interval: '15 minutes'

        register_otp_attempt:
            policy: sliding_window
            limit: 5
            interval: '15 minutes'

        forgot_password_email:
            policy: sliding_window
            limit: 3
            interval: '15 minutes'

        forgot_password_ip:
            policy: sliding_window
            limit: 5
            interval: '1 hour'

        # Limite le nombre de résolutions du lien de parrainage /r/{code} par code,
        # pour freiner l'énumération automatisée des codes de parrainage.
        referralHit:
            policy: 'sliding_window'
            limit: 30
            interval: '15 minutes'

        # Limite le nombre d'invitations de filleuls qu'un même commercial peut
        # envoyer, pour freiner le mailbombing via /commercial/filleuls/inviter.
        commercialInvite:
            policy: 'sliding_window'
            limit: 20
            interval: '1 hour'

        # Une demande de renfort en tokens par commercial et par jour : un bouton
        # sans frein finirait par noyer les administrateurs de doublons (double
        # clic, double soumission, retour arrière, deux onglets).
        commercial_token_request:
            policy: 'fixed_window'
            limit: 1
            interval: '1 day'

        # Partage public — on ne compte QUE les échecs de résolution de jeton.
        # Une classe entière derrière une même IP consomme des jetons VALIDES et
        # n'incrémente donc jamais ce compteur ; un balayage ne produit que des
        # échecs et frappe le mur en quelques secondes.
        public_share_failure:
            policy: 'sliding_window'
            limit: 30
            interval: '10 minutes'

        # Garde-fou anti-inondation, volontairement hors d'atteinte d'un usage réel.
        public_share_flood:
            policy: 'sliding_window'
            limit: 600
            interval: '1 minute'

        # Constructions EFFECTIVES d'un artefact (PPTX/ZIP) depuis un lien public.
        # Les requêtes servies depuis le cache n'y sont pas soumises.
        public_share_build:
            policy: 'sliding_window'
            limit: 20
            interval: '1 hour'
