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

10 KiB
Raw Blame History

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é.