Index des pièges (symptôme → emplacement de la solution)
Règle : chaque piège est enregistré après correction et validation visuelle. Si la solution appartient à un skill spécialisé, elle y est écrite et seule une référence est laissée ici ; les solutions courtes (moins de 5 lignes) propres aux pièges sans skill dédié (workflow de projet / pipeline de rendu) sont autorisées en ligne (pour voir la solution en un coup d'œil, sans cliquer). Au-delà de 5 lignes, la solution doit être déplacée dans un fichier spécialisé et remplacée par une référence. Ce fichier ne doit pas dépasser 150 lignes ; si c'est le cas, déplacez d'abord les solutions les plus longues.
Navigation par famille (déterminez d'abord la famille, puis consultez les entrées, pour éviter de sauter entre des entrées apparentées) :
- Famille : Rendu bloqué / suspendu / disparu : exécutez d'abord l'auto-test de démarrage
render-service.cjs(à partir du 24/07/2026, bloque automatiquement #37 volume public, #38 blocage de signature, chrome ne s'ouvre pas → utilisation automatique de Chrome système) ; si l'auto-test est OK mais que le problème persiste → #23 verrouillage concurrent → #25 dataless → #26 récupération harness → #24 vérification des paquets npm. - Famille : Faux positifs QC : #29 boîte fantôme (contrôle null) / #31 police gonflée au démarrage à froid (exemption qcAllow) / #32 boîte Place qui gonfle (validation visuelle → libération) ; si QC signale « zéro violation », vérifiez d'abord la couverture (#35).
| # | Catégorie | Symptôme | Emplacement de la solution |
|---|---|---|---|
| 01 | Rendu image | Texte chinois devient Songti de manière silencieuse / parfois bon, parfois mauvais | remotion-design-system §6 #01 (fonts.ts + FontGuard) |
| 02 | Workflow projet | remotion still fonctionne, mais l'image ne change pas après modification du code | remotion-design-system §6 #02 |
| 03 | Workflow projet | L'image de comparaison miniature juge mal les détails de police | remotion-design-system §6 #03 |
| 04 | Rendu image | \uXXXX dans les attributs JSX s'affiche littéralement (ex: icon="✅") | remotion-design-system §6 #04 |
| 05 | Langage design | La reproduction d'un placeholder dessiné par le composant donne l'impression de « pas vraiment ça » | remotion-design-system §0 Règle d'airain 4 (le véritable contenu est la base) |
| 06 | Rendu image | Le texte dégradé backgroundClip:text devient sombre à l'export | remotion-design-system §6 #06 (couleur unie + textShadow) |
| 07 | Langage design | Bloc de couleur unie / fond noir uni / faux logo donne un aspect « cheap » | remotion-design-system references/texture.md (bloc gélatineux + glow + vignettage + vrai logo) |
| 08 | Export | Halos / flou de peinture sur les bords du texte MG dans le rendu final, « la qualité MG s'est dégradée » | remotion-design-system §6 #08 (jpeg100+crf15 config fixe) |
| 34 | Design / Esthétique | L'utilisateur dit « pas haut de gamme / grossier / comme une erreur / pas naturel / pas fluide » | design-system references/motion.md « Les cinq lois de la fluidité » — tableau des causes : ① pré-poser la structure (rendre visible la structure avant qu'elle ne soit présentée) ② couper des éléments continus pour éviter un obstacle ③ laisser un espace vide (>2px = rupture) lorsqu'une ligne traverse ou est en suspension ④ mouvement à vitesse constante sans décélération pour s'arrêter ⑤ changement soudain et global de l'état. Vérifiez point par point, ne modifiez pas les paramètres au hasard ; en corrigeant un point, faites attention à ne pas en casser un autre (0722-01 a corrigé « la ligne ne traverse pas le cercle » mais a cassé « couper » + « révéler la structure », deux reprises) |
| 09 | Workflow projet | Rendu long qui disparaît en cours de route / fichier mp4 incomplet / pgrep détecte à tort que le processus est encore vivant | remotion-design-system §6 #09 (détachement nohup + reconnaissance des lignes + dans les logs) |
| 10 | Assemblage long métrage | Image « nue » / longue période d'immobilité, tout le MG est compressé sur la gauche, manque de puissance | remotion-design-system references/layout.md (takeover / moment de gloire du protagoniste) + remotion-assembly references/rhythm.md (audit de densité) |
| 11 | Son | Aucun effet sonore dans tout le film / effet sonore enterré inaudible / niveau sonore insuffisant | remotion-assembly references/audio.md (norme de volume + loudnorm master) |
| 12 | Assemblage long métrage | Les éléments ne bougent plus après leur entrée, donnant un aspect rigide / les chapitres disparaissent d'une frame à l'autre | remotion-design-system references/motion.md (Breathe + discipline de sortie useExit) |
| 13 | Langage design | Texte gris illisible sur fond clair (texte nu sur fond blanc) | remotion-design-system §0 Règle d'airain 5 + references/texture.md |
| 14 | Assemblage long métrage | Superposition du coin supérieur gauche / titre courant | remotion-design-system references/layout.md (occupation mutuellement exclusive de l'en-tête) |
| 15 | Sous-titres | Coupure à l'intérieur des mots / fragments anglais / absence de fond de sous-titre | remotion-assembly references/subtitle.md (césure sémantique + boîte de fond + script de validation) |
| 16 | Capture de contenu | Reproduction dessinée à la main d'un produit : « j'ai beau ajuster, ça reste très loin » | remotion-assembly references/broll.md §0 Principes généraux (le synthétiseur n'est pas une tablette de dessin ; hiérarchie du contenu en 4 niveaux + pipeline de collecte et de montage) |
| 17 | Assemblage long métrage | L'IA dit « ça ressemble », l'utilisateur dit « pas du tout » (angle mort de l'image fixe / aperçu réduit) | remotion-assembly SKILL §2.5 Atelier par segment (mesurer d'abord, coder ensuite + validation dynamique par l'utilisateur) |
| 18 | Capture de contenu | Les séquences de contenu ressemblent à des « patchs » qui ne s'intègrent pas au film | remotion-assembly references/broll.md Étape 5 du pipeline (couche d'uniformisation des couleurs) |
| 19 | Timing animation | L'entrée du film semble lente comme un PowerPoint / la durée des effets ne correspond pas au design | remotion-design-system references/motion.md §0 (les trames sont écrites pour un taux de 60fps alors que le rendu est en 30fps, convertissez d'abord en secondes, puis en trames) |
| 20 | Langage design | La taille de montage « a beau être ajustée, elle reste plus petite que la référence » | remotion-design-system references/specs.md (consultez d'abord le tableau des spécifications, puis codez ; interdiction d'évaluer à l'œil) |
| 21 | Son | Effet sonore « cheap » / faible, à la fois le rendu et l'échantillon de référence sont rejetés | remotion-assembly references/audio.md Règle 8 (la bonne solution = bibliothèque d'effets sonores professionnelle : cache de Jianying → @remotion/sfx → Mixkit → CC0 → packs commerciaux ; la qualité doit être validée par l'utilisateur en écoutant des échantillons, l'IA ne peut que filtrer les défauts spectraux) |
| 22 | Workflow projet | Planche d'écoute / vidéo assemblée : le son et l'image se désynchronisent de plus en plus | remotion-sfx SKILL §2 Règle de montage (interdiction du montage -c copy et de -shortest : les micro-différences de durée s'accumulent en dérive, il faut imposer une durée égale + ré-encoder l'intégralité) |
| 23 | Workflow projet | Rendu bloqué / timeout, échec après plusieurs tentatives | Interdiction de la concurrence pour les rendus dans un même projet (alerte de zone de danger « plantage concurrentiel » confirmé) : verrouillage mortel entre plusieurs sessions / processus orphelins. Diagnostic = ps -o etime,pcpu (etime plusieurs fois supérieur aux attentes + CPU à 0% = zombie, à tuer) ; le timeout de l'outil ne tue que le bash, laissant des processus node orphelins qui s'entrechoquent. Le rendu doit être lancé avec nohup en arrière-plan + reconnaissance des lignes + des logs (même famille que le piège #09). Avant de lancer le rendu, vérifiez d'abord le champ, mais la vérification doit éviter l'auto-correspondance : `pgrep -f "remotion render |
| 24 | Workflow projet | Erreur de rendu Named export not found / plugin is not a function (erreur interne de paquet) | L'installation concurrente de npm peut endommager les paquets (plusieurs sessions npm i simultanées / interruption des processus qui interrompt l'écriture) : symptômes = require retourne un export vide, TypeError interne dans l'arbre des dépendances ; solution = pour un paquet corrompu rm -rf node_modules/<paquet> + npm cache clean --force + réinstallation, pour une corruption multiple rm -rf node_modules && npm ci (déplacez d'abord le binaire du navigateur node_modules/.remotion pour le sauvegarder avant la suppression) ; discipline = un seul projet ne peut avoir qu'une seule session npm à la fois |
| 25 | Workflow projet | Rendu bloqué à un pourcentage fixe du Bundling, tous les processus de l'arbre à 0% CPU, changement de Node / réinstallation des dépendances sans effet | Fichier de contenu expulsé par l'application de synchronisation en coquille vide dataless (incident du 16/07/2026 : une application de synchronisation tierce, en se désinstallant, a expulsé 747 Mo de contenu principal, la copie du bundle public/ s'est bloquée en lecture permanente, tous les rendus de la nuit ont échoué en cascade). Diagnostic = ls -lO public/** pour voir le drapeau dataless ; solution = restaurer l'entité depuis le fichier original / la source de téléchargement (brctl est inefficace si le provider est déjà désinstallé) ; prévention = ajouter une vérification dataless lors de l'entrée du contenu dans la bibliothèque (broll.md 2b), ne pas placer le projet dans un répertoire géré par la synchronisation. Variante (28/07/2026, iCloud expulse node_modules) : Le CLI / Studio démarre et se bloque silencieusement à 0% CPU, même le numéro de version ne s'affiche pas (« Optimiser le stockage Mac » a expulsé les fichiers de dépendances, le paquet @remotion contient près de 10 000 dataless, chaque require attend le téléchargement depuis le cloud) ; solution = réinstaller les dépendances dans un répertoire physique node_modules.nosync/ + lien symbolique du même nom (le nom *.nosync empêche iCloud de synchroniser, corrige définitivement la récidive) ; l'ancien répertoire doit être déplacé hors de l'arborescence du projet (dans ../.trash/) — le renommer dans le projet serait scanné récursivement par le watcher de Studio, provoquant un deuxième blocage |
| 26 | Workflow projet | Le processus de rendu « disparaît » à la fin du tour d'un sous-agent, sans être un verrouillage concurrent (#23) ni une interruption en cours de long rendu (#09) | À la fin du tour d'un sous-agent, le harness récupère sa chaîne de processus enfants, que ceux-ci soient en avant-plan ou non complètement détachés → le rendu est tué à mi-chemin, laissant des fragments. La solution fait partie de la famille #09 : le lancement du rendu doit être complètement détaché du shell parent (nohup + run_in_background/setsid, rediriger tous les fd), la fin ne doit être jugée que par les logs (ligne + / dernière ligne), et non par le fait que l'agent soit encore vivant. Le lancement d'un long rendu dans un sous-agent est particulièrement dangereux (la limite du tour = la mort du processus), si nécessaire, décomposer en « lancer le rendu détaché dans ce tour → reconnaître les logs dans le tour suivant » |
| 27 | Workflow projet | Le point d'entrée .mjs/ESM du service de rendu import '@remotion/renderer' génère does not provide an export named 'Fragment' | Si package.json n'a pas type:module, charger le renderer avec l'entrée ESM déclenche une rupture d'interopérabilité de son build ESM avec react/jsx-runtime (confirmé avec Node 24) ; solution = changer le script de service en .cjs + require pour emprunter le build CommonJS (preuve : note en haut de scripts/render-service.cjs) |
| 28 | Workflow projet | <Sequence layout="none" premountFor={N}> génère une erreur tsc : premountFor n'existe pas / type incompatible | Le SequenceProps de Remotion est une union discriminée : premountFor n'est valide que dans la branche par défaut / layout:"absolute-fill" (branche AbsoluteFillLayout), la branche {layout:"none"} n'a pas cette propriété (voir Sequence.d.ts dans node_modules/remotion, type LayoutAndStyle). Solution = le média qui a besoin de premount doit être encapsulé dans une Sequence de layout par défaut (sans layout ou avec absolute-fill) ; si vous avez besoin de layout="none", encapsulez ce média dans une couche supplémentaire de Sequence de layout par défaut pour recevoir le pré-montage. Découle de la zone de danger officielle ③ (premountFor) |
| 29 | Workflow projet | La sonde QC signale un « chevauchement fantôme » faux positif : l'élément en question est invisible à l'œil nu | La sonde QC (src/design/qc.tsx) prend getBoundingClientRect pour chaque [data-qc] frame par frame pour détecter les chevauchements ; si l'élément est invisible mais toujours dans le DOM (non masqué de manière standard ou totalement transparent mais visuellement déjà cédé la place), le rect est toujours présent → faux positif (seg05 S5Appear). La sonde ne filtre que opacity<0.15 et largeur/hauteur<3, elle n'arrête pas les boîtes fantômes de type placeholder. Solution = lorsque l'élément est invisible, le composant doit retourner null directement (méthode de contrôle null) ; pas de nœud, pas de rect. Voir remotion-design-system references/layout.md §10.5 pour les règles de prévention des chevauchements de placeholder. Une variante (boîte Place qui gonfle) est listée séparément au #32, la solution du #32 fait foi |
| 30 | Workflow projet | Fichier écrit en Bash « commande réussie » mais disparaît presque immédiatement / Read ne voit pas le fichier qui vient d'être créé / le fichier final rendu n'existe pas | Une nouvelle session exécute par défaut dans un sandbox : les écritures Bash non autorisées tombent dans la copie temporaire du sandbox, et s'évaporent à la fin de la commande (confirmé le 19/07/2021 : les données de sous-titres, 18 Scènes, 590 Mo de fichier final, tout s'est évaporé, seuls 3 fichiers écrits avec l'outil Write ont survécu) ; écrire via un chemin de lien symbolique /tmp vers le projet aggrave la redirection. Solution = avant de commencer, exécutez obligatoirement l'auto-test d'environnement §0.5 étape 0 du SKILL d'assemblage ; si l'auto-test échoue, arrêtez-vous et demandez à l'utilisateur d'autoriser l'accès Bash/éditeur avant de continuer ; interdiction d'utiliser des liens symboliques pour contourner les chemins chinois (utilisez des guillemets doubles autour du chemin), interdiction d'utiliser dangerouslyDisableSandbox pour vous sauver, interdiction de copier le projet dans /tmp pour travailler ; utilisez de préférence l'outil Write pour tous les fichiers produits |
| 31 | Workflow projet | QC signale un chevauchement uniquement sur les premières frames d'un segment, aucun chevauchement visible à l'œil nu (souvent sub-zh × cadre) | Lors des premières frames à froid, la police n'est pas encore chargée, la boîte de texte est mesurée avec la police de repli, ce qui la gonfle artificiellement, les rects se chevauchent donc (faux positif de mesure, confirmé deux fois par 0715-01 seg03 et 0715-02 S04, variante de la famille #29). Solution = après vérification visuelle, mettez la paire d'éléments dans la liste blanche qcAllow (les autres assertions restent), ne modifiez pas la disposition à cause de quelques frames de faux positif |
| 32 | Workflow projet | QC signale un grand nombre de chevauchements de boîtes place@72,* dans la zone gauche, mais les éléments rendus ne se chevauchent pas visuellement | Le bounding de la boîte Place de la zone gauche pour les pages / groupes est plus haut que le contenu visuel (le conteneur est gonflé), l'intersection des boîtes n'est pas une intersection visuelle (confirmé le 15/07/2021 : 15 types de violations sur tout le film, tous de ce type). Solution = après vérification visuelle, libérez la case ; pour une correction définitive, la hauteur de la boîte Place doit être ajustée au contenu réel, ou le groupe doit être marqué qcAllow ; les sub-clearances qui dépassent la ligne de dégagement sont à traiter séparément, ne font pas partie de cette règle |
| 33 | Rendu image / Export | Un segment de personnage / vidéo dans le rendu final est figé, alors que la même partie de la source bouge (surtout avec fond 4K). À l'œil nu, le personnage ne bouge pas, mais md5/mpdecimate ne le détecte pas | Le rendu OffthreadVideo pour fond 4K a des à-coups de décodage et produit des trames répétées (plus probable avec des animations SVG complexes superposées) → passez à une source de fond 1080p H264 (le rendu final est déjà en 1080p, le 4K est un gaspillage et ralentit le décodage), changez la source du composant principal en 1080p et refaites le rendu. Diagnostic obligatoire avec ffmpeg -vf freezedetect=n=-50dB:d=0.3 — des md5 différents ne signifient pas que l'image bouge (le bruit de compression des trames fixes donne aussi des md5 différents, ce qui est trompeur). mpdecimate est également perturbé par le bruit et n'est pas fiable. Seul freezedetect a une tolérance au bruit et est précis. Les gels normaux (transition de personnage, contenu figé lui-même) ne sont pas des bugs (confirmé le 21/07/2021 : gel du personnage entre 63 et 69s, après passage en 1080p, freezedetect signale zéro gel). En annexe : utilisez -bf 0 -g 30 -movflags +faststart pour l'export final, pour améliorer la compatibilité avec les lecteurs (Remotion produit beaucoup de B-frames par défaut, certains lecteurs ont des à-coups de décodage lors du seek) |
| 34 | Rendu image | Le segment de contenu dans le rendu final présente une large barre noire / noire morte / verre vide, ne laissant qu'une fine bande verticale sur le bord. Les placeholders et le vrai contenu peuvent tous être touchés. La vérification après rendu peut facilement manquer ce défaut (le point d'échantillonnage ne tombe pas dans la fenêtre où le contenu est présent) | Le style de découpage OffthreadVideo « très grande boîte style width + objectFit/translate » ne prend pas effet lors du rendu côté largeur → le contenu est rendu à la largeur de la carte, puis tronqué par le déplacement (confirmé le 21/07/2021 pour six segments : S02/S06/S07/S10/S13/S16, seul le bon S14 utilise « video 100% de la carte + transform scale overdrive »). Solution et contrôle de validation après rendu = remotion-assembly references/broll.md Règle 12 |
| 35 | Workflow projet | Le membre de l'équipe / QC signale « zéro violation sur tout le film » alors qu'il y a de nombreux chevauchements — faux passage | La sonde QC (src/design/qc.tsx) est montée dans chaque Scene et ne s'exécute que dans la plage de trames de ce segment. Si une Scene omet de monter <QcProbe/> (déclare qc?:boolean mais ne l'utilise pas) → aucun nœud dans ce segment → summary propre = faux passage (incident 0722-01 : 1 sonde sur 20 segments, zéro violation signalé alors qu'il y avait 8 types de véritables violations). La solution est déjà en place : la sonde émet un battement de couverture QC{hb:1,n} à chaque frame, render-service.cjs qc vérifie « trames couvertes / trames rendues », si <90% ou 0 éléments sur tout le parcours → indique [FAIL] Couverture insuffisante au lieu de « zéro violation ». Discipline : « zéro violation » doit pouvoir faire la différence entre « testé et OK » et « pas testé du tout » ; en mode production, exécutez d'abord un petit segment qc pour confirmer la couverture avant de lancer le film complet. Ajout (vérification du 24/07/2026) : La sonde doit être montée à la racine (racine d'assemblage {qc ? <QcProbe/> : null}, comme dans Koubo072101/072201) — lorsqu'elle est montée dans une Scene, useCurrentFrame via Sequence retourne une trame locale (commençant à 0), le numéro de trame du battement est décalé par rapport à la plage globale : la couverture QC de tout le film / de plusieurs segments sera un faux FAIL (les trames locales des différents segments se chevauchent, après déduplication, le total est bien inférieur au nombre total de trames). Un segment manquant peut aussi être masqué comme faux PASS par les trames locales d'un segment voisin. render-service a déjà ajouté un filtrage par plage de trames, mais seule la couverture globale montée à la racine est fiable. Un test QC sur un seul segment ne détecte pas ce piège — pour valider la barrière de protection, utilisez un scénario qui déclenche une erreur (plage multi-segment / retirez intentionnellement une sonde), ne testez pas uniquement des segments normaux |
| 36 | Langage design | Le texte MG dans la zone d'information est presque illisible sur fond clair, le scrim semble inefficace | Le dégradé par défaut de InfoScrim (src/design/InfoScrim.tsx) va de la transparence à gauche → à l'assombrissement à droite, ne pressant que le côté droit. Les films avec MG d'information à gauche (décision de l'utilisateur) → le MG de la zone gauche est entièrement exposé dans la zone la plus lumineuse (placard blanc / mur clair) sans fond (confirmé le 22/07/201 ; le 15/07/201 avait rencontré le même problème, mais corrigé localement sur un seul segment, sans corriger la base). Solution = ajouter un paramètre side à InfoScrim (par défaut 'right' pour compatibilité avec les anciens films). Les films avec informations à gauche utilisent side="left". Leçon : les défauts de la base doivent être corrigés dans la base ou enregistrés comme piège, ne les corrigez pas localement sur un seul segment — un correctif local laisse le piège pour le prochain film |
| 37 | Workflow projet | Rendu bloqué au Bundling, copyfile ... ETIMEDOUT, le processus est vivant mais n'affiche rien | public/footage/ contient trop de vieux contenus de différents films (0722-01 : 2 Go / 6 segments), Remotion bundle copie tout le répertoire public/ dans un répertoire temporaire à chaque fois → timeout de copyfile (différent du #25 dataless : c'est un problème de volume / temps de copie, le fichier lui-même existe). Solution = ne garder que le contenu du film en cours dans public/footage/, déplacer le reste dans ../footage-hold/ (2 Go → 466 Mo, le bundle passe de bloqué à 1,8s). Discipline : après avoir livré une correction, ne la défaites pas sans réfléchir — avant de défaire, demandez « ce film doit-il être rendu à nouveau ? » (0722-01 a subi deux fois le même piège parce que le contenu a été remis après la livraison) |
| 38 | Workflow projet | Tout processus touchant à un fichier est bloqué en permanence, kill -9 inefficace, les zombies UE s'accumulent ; la réinstallation des dépendances / le changement de Node sont inefficaces | Le processus de vérification de signature de code macOS (amfid/syspolicyd) est bloqué → les binaires nécessitant une vérification ne peuvent pas être exécutés (différent de #25 dataless, #37 volume, #23 verrouillage, c'est un problème système). Diagnostic : ffprobe -version (système) fonctionne, mais node_modules/@remotion/compositor-darwin-arm64/ffprobe -version reste bloqué en permanence = signature bloquée ; `ps -axo pid,stat,comm |
| 39 | Capture de contenu | Trois types de défaillances avec Grok image→vidéo : résolution basse par défaut 736×400, flou après agrandissement / éléments qui se déforment et prolifèrent (morph) / composition spécifique « comblée » de force | ① Résolution : si ce n'est pas explicitement demandé, par défaut 736×400 (le grossissement 2,6x floute les halftones / bords de recadrage) — la commande doit impérativement spécifier 720p(1280×720), testé 4/4 ; le CLI resolution_name n'a que deux options 480p/720p, une demande 1080p est ignorée (testé le 24/07/2026), pour 1080p, utilisez l'API xAI (grok-imagine-video-1.5) ou changez d'outil. ② Morph / prolifération : engrenage qui grandit / calendrier qui ajoute des cases / anneau qui se brise — ajoutez à la fin du prompt une contrainte de verrouillage pour l'élément instable en question (« garder la taille d'origine, pas de prolifération », « nombre de cases inchangé », « anneau continu, pas de rupture »). ③ Complétion forcée : « éléments clairsemés + grand fond vide + silhouette humaine creuse + fragments de visage » déclenchent chez le modèle un remplissage de l'espace vide, un remplissage des trous, le développement d'un visage complet (version 14 testée 6 fois, toutes ratées) — n'ajoutez pas d'interdictions, modifiez la composition d'entrée qui déclenche cela (remplissez le fragment, délimitez l'espace négatif avec un trait, enlevez les fragments de visage, une fois modifié, le test passe). L'appel headless gbro nécessite également --always-approve --permission-mode bypassPermissions --max-turns 10 pour déclencher l'outil vidéo. Voir la section « IA génère des B-roll collés » du SKILL remotion-broll |
| 40 | Rendu image | Le petit avatar rond du badge de nom semble de travers, avec un coin de fond visible à l'intérieur de l'anneau doré. Ajuster l'angle avec CSS empire les choses | Interdiction d'utiliser CSS rotate + décalage dans le petit cercle de recadrage pour corriger un avatar de travers — la rotation se fait autour du centre de l'img, et la fenêtre de visualisation est décentrée, les deux s'additionnent pour exagérer la sensation de travers et faire sortir le bord (0724-01 a nécessité deux essais pour corriger). Solution correcte = cuisson hors ligne : utilisez PIL pour redresser la photo (quelques degrés), puis recadrez en « visage centré dans un carré » et stockez-la dans les assets. NamePlate avatarImgStyle utilise 100%/left:0/top:0 pour un collage plein écran direct. L'asset global public/assets/author-avatar.png est déjà prêt, référencez-le directement |
| 41 | Workflow projet | Le rendu d'un segment complet par render-service signale frame range 0-N is not inbetween 0-(N-1) | Les paramètres de début et de fin de segment / splice sont inclusifs : pour le film complet = 0 (durationInFrames-1) (pour une composition de 1355 trames, passez 0 1354). Recopier durationInFrames provoquera une erreur |
| 42 | Langage design | L'utilisateur trouve les sous-titres « pas beaux » sans pouvoir dire pourquoi | Vérifiez d'abord si les lignes anglaises sont rendues avec une police chinoise — les glyphes latins des polices chinoises ne sont que des compléments, la largeur et l'espacement des caractères sont tous faux, c'est la première cause de « je ne sais pas ce qui cloche » (l'ancienne version de BilingualSub rendait la ligne en avec FONT.zh, confirmé le 26/07/2026). Solution = les lignes anglaises doivent utiliser une police proportionnelle occidentale FONT.subEn (Inter) ; vérifiez également le poids de la police chinoise, la couche de sous-titres utilise FONT.subZh (PingFang SC) en 400 (léger), pas le 700 de la couche de présentation. Pour juger de la qualité d'une police, il faut utiliser un recadrage 1:1 en local, la miniature ne permet pas de voir (comme #03) ; avant de modifier une version, proposez plusieurs variantes sur la même frame pour que l'utilisateur choisisse, ne misez pas sur une seule variante |
| 43 | Assemblage long métrage | qc-master signale zéro FAIL et zéro WARN, mais l'utilisateur dit « la qualité est très différente / les animations deviennent de plus en plus moches / les sous-titres ne sont pas conformes au skill » | La validation technique vérifie « si le film est cassé », pas « si le film utilise la base » — deux choses différentes, ne prenez pas le feu vert de la première pour une preuve de la seconde. Confirmation par 0727-01 : 25 segments auto-construits avec un fichier _kit.tsx de 324 lignes recréant des cartes, animation uniquement en quad fade in + déplacement 0, zéro référence à design/motion, seulement 8 segments sur 25 ont une sortie, 77 lignes de sous-titres en sont toutes vides, dégradées en une seule ligne chinoise ; qc-master a tout validé. Solution = barrière ⓪ de l'assemblage node scripts/check-scenes.mjs src/koubo/scenes-<film> (zéro référence à motion / zéro sortie = FAIL) + vérification check-subs.mjs pour les en manquants, les deux sont exécutés après l'écriture du code et avant le rendu. Ordre du diagnostic : vérifiez d'abord ce qui manque comme technique, puis vérifiez les paramètres — une seule commande check-scenes peut montrer si l'on réinvente la roue, mais elle ne couvre que la laideur due à la non-utilisation de la base. La couleur, le rythme, la police et la composition ont chacun leur source véritable (typography/rhythm/#42/layout), ne considérez pas une seule piste comme un diagnostic universel. ⚠️ Leçon supplémentaire : à ce moment-là, les paramètres de la commande check-subs étaient erronés (nom du film au lieu du chemin du fichier), ce qui a généré une erreur ENOENT. L'équipe a vu l'erreur et est passée directement à la suite, manquant ainsi les mots suspendus en début de ligne et les dépassements de 16,5 caractères — une erreur de script de validation ≠ une validation réussie, s'il ne peut pas s'exécuter, c'est qu'il n'a pas été exécuté |
Référence de catégorie (selon le système de films de base réservé) : Rendu image / Timing animation / Studio local / Export / Son / Capture de contenu / Assemblage long métrage / Langage design / Workflow projet.
Zones de danger (44 entrées dans l'index des pièges, capture d'écran fournie par l'utilisateur le 16/07/2026)
Règle : c'est une carte des zones de danger, pas des pièges — seulement le nom du symptôme, pas de solution, la plupart ne nous sont pas encore arrivés. Si l'un d'eux se produit : corrigez + validez visuellement, puis promouvez-le en numéro officiel dans le tableau ci-dessus. Ceux qui correspondent déjà à nos pièges existants sont marqués de leur appartenance.
| Catégorie | Piège (original) | Notre statut |
|---|---|---|
| Rendu image | Logo qui clignote / Vidéo figée / Bordure noire ProRes transparente / Animation bloquée en haut à gauche / Image étirée / Chrome barre de navigation / Visage masqué / Collision avec sous-titres / Emoji / Logo noir sur noir | Déjà couverts : Collision avec sous-titres = #14 superposition ; Emoji = #04 + norme d'icône (icônes lucide) ; Visage masqué = zone interdite aux personnages en trois sections (layout.md) ; Logo noir sur noir = norme logo double version dark/light (texture.md). Les 6 autres non rencontrés, restez vigilant : Vidéo figée (OffthreadVideo bloqué), Image étirée (objectFit), Chrome barre de navigation (capture d'écran avec bordure de navigateur sur la carte) |
| Animation / Timing | Phase index oublie break / Animation ne correspond pas à la voix off / spring overshoot | Déjà couverts : Animation ne correspond pas à la voix off = §2.5 alignement au niveau du mot + visuel principal sur SRT ; spring overshoot = motion.md §11 éléments interdits. Phase index oublie break non rencontré (problème de type switch oubli) |
| Studio / Local | Studio quitte (SIGPIPE) / EMFILE poignée épuisée / staticBase hash expiré / HEVC écran noir / id underscore / Studio+still plantage concurrentiel | Aucun rencontré. Restez vigilant sur deux probabilités élevées : HEVC écran noir (les vidéos capturées avec iPhone sont en HEVC, convertissez-les en H.264 à l'entrée de la bibliothèque) ; Studio+still plantage concurrentiel (lancer still/render alors que Studio est ouvert peut provoquer une collision — notre workflow est souvent concurrent, si cela arrive, ne suspectez pas d'abord le code) |
| Export | Disque C plein / OOM / Qualité floue / Rendu lent / Encodé mal interprété | Déjà couverts : Qualité floue = #08 (jpeg100+crf15) ; Encodé mal interprété = #09 le critère de fin est uniquement les logs (ligne +) (même type : les motifs dans les logs ne signifient pas succès). OOM / Rendu lent non rencontrés (soyez vigilant sur les longs métrages 4K concernant les trames concurrentes) |
| Son | impact-heavy plein écran / chaque groupe a son whoosh / son avant, mouvement après | Déjà couverts : impact-heavy plein écran = audio.md SFX lourd ≤ 2 par film (même leçon que le whoosh d'ouverture rejeté par l'utilisateur) ; chaque groupe a son whoosh = les séquences rapides doivent avoir un pop léger par item, pas un son lourd par groupe. « Son avant, mouvement après » non rencontré, à vérifier (probablement une règle de timing SFX / animation décalée, à définir si cela se produit) |
| Capture de contenu | yt-dlp 403 / fetch ne passe pas par le proxy / Wikimedia GFW / Firefox cookie / PNG est en fait du HTML | Partiellement couverts : le pipeline de collecte yt-dlp est dans broll.md (nous téléchargeons Lovable sans 403, si cela arrive, ajoutez d'abord cookie/UA/proxy en trois pièces). « PNG est en fait du HTML » piège typique : l'« image » téléchargée est en fait une page HTML de protection anti-hotlinking — vérifiez avec la commande file avant l'entrée dans la bibliothèque, adoptez cette règle comme étape fixe du pipeline de contenu |
| Assemblage long métrage | Chapitre sans point de respiration / Host carte ↔ Chip collision | Déjà couverts : Chapitre sans point de respiration = motion.md §1/§2 écran vide entre les chapitres ; Host carte ↔ Chip collision = layout.md règle 9 occupation mutuellement exclusive (même type de superposition) |
| Langage design | Ne pas reproduire la House Style / kicker overclaim / ratio non calculé / sous-titres en boucle | Ne pas reproduire la House Style = raison d'être de tout notre design-system. kicker overclaim (le texte du kicker exagère par rapport à ce que dit la voix off), ratio non calculé (contenu déformé), sous-titres en boucle (sous-titres et texte MG répètent la même phrase) : trois non rencontrés — attention aux sous-titres en boucle : notre règle selon laquelle le texte du chip et du Stamp ne doit pas se répéter repose sur le même principe |
| Zones de danger officielles (remotion-dev/skills, comparé le 16/07/2026, voir docs/官方skills对照.md) | ① CSS transition/animation/Tailwind = le rendu échouera (OFFICIELLEMENT INTERDIT, c'est ce qui se glisse le plus facilement en écrivant du code avec codex) ② Recadrage ffmpeg sans ré-encodage = premier cadre figé (c'est l'une des causes du « vidéo figée » du film de référence, recadrage -c copy interdit) ③ Sequence contenant un média sans premountFor = première frame saccadée / noire ④ @remotion/transitions consomme la durée totale (deux images se chevauchent, le système d'alignement dur sur SRT décalera tout le film) ⑤ fetch de données externes sans delayRender = génère des trames vides | ①②④⑤ non rencontrés, à vérifier avant d'écrire du code ; ③ premountFor adopté selon les règles (Scene06 pour éviter le premier cadre noir) → a généré un nouveau piège pratique #28 (premountFor incompatible avec layout='none') |
| Workflow projet | Étendue de modification élargie / Taille police <48px / Lancement automatique du rendu 4K | Étendue de modification élargie = contre-exemple de la discipline de l'atelier par segment « ne rendre que ce segment / ne modifier que ce segment » ; Taille police <48px (le texte principal en dessous de 48px en 1080p est illisible pour le public, à distinguer du texte de légende minimum 20-22px de specs.md, il s'agit probablement du corps du texte) ; Lancement automatique du rendu 4K (démarrage non confirmé d'un gros rendu qui brûle la machine) — adoptez directement cette règle comme discipline : le rendu ne doit être lancé que pour la plage confirmée par l'utilisateur / le plan |