# Deferred Work

Entrées ajoutées lors du cadrage de `spec-rendu-fidele-langues-rtl.md` (2026-09-01) :
améliorations de qualité identifiées pendant l'audit du pipeline de traduction,
volontairement hors du périmètre de la spec RTL pour garder un objectif unique.

- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Fusionner les runs adjacents de même style dans PowerPoint (et les notes Word traduites run par run) pour traduire des phrases complètes au lieu de fragments.
  evidence: Word fusionne déjà les runs par signature rPr (word_translator.py l.1368-1475) ; PowerPoint traduit chaque run isolément (pptx_translator.py l.810-834) et les footnotes Word aussi (l.836-846, 909-919, 961-971) — une phrase coupée en plusieurs runs produit des traductions incohérentes. Interdit par la spec RTL (« Never : pas de refonte de la collecte des runs »).
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Rendre les contrôles qualité actionnables : retenter automatiquement les lots dont le script livré ne correspond pas à la langue cible (ex. arabe livré au lieu du persan).
  evidence: services/quality/ détecte déjà le mauvais script et la confusion arabe/persan (script_detector.py l.89-171, l.236-256) mais tous les contrôles sont en log-only (routes/translate_routes.py l.1644-1779) — aucune traduction n'est jamais corrigée ni retentée.
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Étendre le mode batch JSON (~15 textes par requête) aux providers DeepSeek et MiniMax, comme le fait déjà le provider OpenAI.
  evidence: openai_provider.py l.511-625 batch via JSON numéroté ; deepseek_provider.py et minimax_provider.py traduisent texte par texte (base.py l.60-74) — coût et latence plus élevés pour ces moteurs.
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Conserver le formatage intra-bloc des PDF (un mot en gras au milieu d'une phrase applique aujourd'hui le gras à tout le bloc).
  evidence: pdf_translator.py _extract_text_blocks l.541-734 calcule des flags gras/italique globaux par bloc et la réécriture utilise une police unique par bloc (l.905-922).

Entrées ajoutées après la revue croisée de `spec-rendu-fidele-langues-rtl.md` (2026-09-01) :

- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Utiliser insert_htmlbox (PyMuPDF) pour le texte RTL des PDF afin de garder un texte copiable et cherchable (ordre logique), au lieu du façonnage en formes de présentation.
  evidence: arabic_reshaper + python-bidi écrivent les lettres arabes en formes de présentation (U+FB50–U+FEFF) en ordre visuel : un copier-coller depuis le PDF donne un texte inversé et la recherche ne fonctionne plus ; PyMuPDF ≥ 1.22 (déjà dépendance) propose insert_htmlbox qui gère nativement la direction bidi.
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Passer en droite-à-gauche les textes des graphiques et SmartArt Word (parties chart réinjectées après traduction).
  evidence: les textes de graphiques/diagrammes sont traduits et réinjectés (word_translator.py l.1030-1186, l.1229-1356) mais aucune marque de direction n'est posée sur ces parties — étiquettes arabes affichées gauche-à-droite dans un document RTL. Exclu volontairement par la spec (« Never : pas d'inversion des graphiques »).
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Résoudre l'alignement hérité des masques/dispositions PowerPoint pour ne pas forcer à droite un titre centré par le modèle (sans algn explicite).
  evidence: _set_pptx_paragraph_rtl pose algn="r" quand algn est absent — or l'alignement réel peut venir du masque ; détecter l'héritage exige de remonter au layout/master (chantier de résolution de placeholder dédié).
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Harmoniser RTL_LOCALES du frontend (frontend/src/lib/i18n.tsx, liste ["ar","fa"]) avec la liste serveur à onze langues.
  evidence: la liste d'affichage RTL de l'interface est indépendante de core/languages.RTL_LANGUAGES ; toute nouvelle langue d'interface RTL (hébreu, ourdou) devra être ajoutée aux deux endroits sans qu'aucun contrôle ne le signale.

Évaluation des trois chantiers lourds (2026-09-01, après la vague d'améliorations ffbd85a..e5e09f0) — confirmés différés, dans l'ordre recommandé :

- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: PDF RTL copiable (insert_htmlbox) : à traiter en premier des trois chantiers lourds, dans une session dédiée avec vérification visuelle du rendu sur de vrais documents.
  evidence: le mode mise en page PDF repose sur six niveaux d'ajustement (rectangle élargi, shrink, plafond par bloc suivant) construits autour d'insert_textbox et de son code de débordement ; insert_htmlbox a une sémantique différente et exige de revoir tout ce mécanisme — trop risqué à empiler sur la vague du jour sans contrôle visuel.
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: RTL des graphiques et SmartArt Word : mécanisme réutilisable (poser rtl="1" sur les a:p des parts chart pendant la réécriture ZIP existante), à traiter en deuxième.
  evidence: les parts chart contiennent les mêmes paragraphes DrawingML (a:p/a:pPr) que PowerPoint ; la réécriture ZIP par element_path (word_translator.py l.1030-1186) est le point d'insertion naturel — chantier moyen, un seul fichier, mais à valider visuellement dans Word.
- source_spec: spec-rendu-fidele-langues-rtl.md
  summary: Gras/italique au milieu d'une phrase dans le PDF (intra-bloc) : à traiter en dernier, c'est le plus grand chantier des trois.
  evidence: exige de découper la réécriture par blocs en écriture par fragments (spans) avec positionnement propre — changement architectural du mode mise en page PDF.

Reportés de la revue marketing du 2026-09-05 (spec-hermes-marketing-execution.md) :

- source_spec: `spec-hermes-marketing-execution.md`
  summary: Remplacer les absolus de format restants (« keep the format perfect » dans la tagline Product Hunt, « Zero reformatting » du tweet T4, « la seule architecture » du blog 4) et publier une page « limites connues » — extension de la vague C1 du plan d'alignement.
  evidence: les relecteurs de Hacker News et Product Hunt cherchent un contre-exemple dès qu'un absolu est affiché ; un PDF scanné re-mis en page ou un débordement suffit à casser la promesse.
- source_spec: `spec-hermes-marketing-execution.md`
  summary: Décider du badge « POPULAIRE » (code) / « le plus choisi » tant qu'aucun client n'existe, ou le remplacer par « recommandé ».
  evidence: la preuve sociale « le plus choisi » est invérifiable au lancement et attire les remarques sur Product Hunt ; le badge est codé dans models/subscription.py et reflété dans la landing.
- source_spec: `spec-hermes-marketing-execution.md`
  summary: Définir une convention d'attribution par canal (paramètres de source dans les liens de Product Hunt, Show HN, X, Reddit, e-mails) avant le jour J.
  evidence: sans paramètre d'attribution, le rapport hebdomadaire ne pourra pas dire quel canal amène les inscriptions ; Vercel Analytics ne fournit que les référents.

- source_spec: `_bmad-output/implementation-artifacts/spec-strategie-llm-abonnements-admin.md`
  summary: Les emails marketing et la page publique de désabonnement sont en français uniquement, sans adaptation de langue.
  evidence: Les modèles d'emails d'abonnement existants (services/email_service.py) sont déjà monolingues français ; le multilinguisme des emails est un projet à part (détection de langue par destinataire, templates par langue).
- source_spec: `_bmad-output/implementation-artifacts/spec-strategie-llm-abonnements-admin.md`
  summary: Le désabonnement se fait par simple lien GET sans jeton ni confirmation (risque de désabonnement par préchargement des clients de messagerie).
  evidence: Constat des relectures ; la solution complète passe par un envoi en un clic conforme RFC 8058 (POST List-Unsubscribe-Post) plus une page de confirmation, à concevoir séparément.
- source_spec: `_bmad-output/implementation-artifacts/spec-strategie-llm-abonnements-admin.md`
  summary: GET /api/v1/admin/settings renvoie les clés API en clair alors que le commentaire du code affirme le contraire ; la nouvelle page Modèles repose sur cet aller-retour pour ne pas effacer les clés à l'enregistrement.
  evidence: Comportement préexistant à ce chantier, constaté par le relecteur « lacunes de vérification » ; toute correction (masquage) doit prévoir la préservation côté PUT, comme pour le mot de passe SMTP.
- source_spec: `_bmad-output/implementation-artifacts/spec-strategie-llm-abonnements-admin.md`
  summary: La branche base de données du calcul des audiences marketing n'est pas testée et retombe silencieusement sur le fichier JSON en cas d'échec.
  evidence: Relectures ; conséquence bornée (un repli vide refuse l'envoi plutôt que d'envoyer de travers), mais un test en mode base éviterait les mauvaises surprises.
- source_spec: `_bmad-output/implementation-artifacts/spec-strategie-llm-abonnements-admin.md`
  summary: Les cartes de revenus ne distinguent pas « aucune donnée » de « base injoignable » (affichage silencieux de zéro).
  evidence: Relecture de contenu ; amélioration d'affichage à prévoir sur RevenueOverview.tsx.

- source_spec: `_bmad-output/implementation-artifacts/spec-admin-fournisseurs-ia-emails-promos.md`
  summary: Le verrou des fichiers JSON de codes promo ne couvre qu'un processus ; avec plusieurs workers, deux paiements simultanés peuvent dépasser le plafond local.
  evidence: Relectures ; le plafond côté Stripe (max_redemptions sur le Promotion Code) reste le garde-fou réel. Un verrou inter-processus (fichier ou base) est un chantier à part, commun à tous les fichiers data/*.json.
- source_spec: `_bmad-output/implementation-artifacts/spec-admin-fournisseurs-ia-emails-promos.md`
  summary: Environ 160 clés de traduction antérieures à ces chantiers n'existent que dans une partie des 13 langues (glossaires, traduction, connexion…).
  evidence: Constat du relecteur et de l'implémentation ; rapprochement complet à faire dans un passage dédié.
