Files
office_translator/_bmad-output/implementation-artifacts/deferred-work.md
sepehr 0a013c679d
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 2m40s
feat(admin): canaux IA par palier (z.ai/DeepSeek directs), emails generes par IA, reductions Stripe
- Chaque modele d'un palier devient une route {canal, modele} : openrouter,
  deepseek direct, zhipu (z.ai, nouveau canal), minimax, openai, xai ;
  repli automatique sur la route suivante si la cle manque, compatibilite
  ascendante avec les anciens reglages a chaines
- Page Fournisseurs refondue en sections ; interrupteurs et chaine de
  secours retablis ; tests de connexion avec delai d'attente
- Emails de relance generes par IA (canal au choix, prompt construit depuis
  le plan marketing, HTML sane, RTL arabe/persan, jamais d'envoi automatique)
- Codes promo : validation locale avant Stripe, Coupon+PromotionCode avec
  double plafond, comptage par session (webhook+sync=1 fois), ecriture
  atomique, relier-a-Stripe, suppression, validation publique au checkout
- Page Tarifs : champ code promo (?promo=) avec verification traduite
- Tests : 1357 verts (facturation par palier testee dans le worker,
  point de contact providers/available, promos, generation)
2026-09-05 19:46:33 +02:00

81 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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+FB50U+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é.