Le manuel
Les règles

Les règles de la photo

Les sept décisions du moteur pour chaque photo, et les règles de chacune.

8 sections

Le parcours d'une photo

ÉtapeLa question que le moteur se pose
1

Qu'est-ce que ce plat, au juste ?

Un plat à dresser, un produit fermé (canette, bouteille) ou une formule à composer ?

2

Jusqu'où ai-je le droit de m'écarter de la photo d'origine ?

Sublimer, transformer, ou créer sans photo.

3

Sur quel décor la photo est-elle prise ?

Un seul décor gagne : le gabarit validé de la catégorie, sinon un fond uni d'enseigne, sinon la plaque de décor choisie.

4

De quel point de vue ?

L'angle choisi à la main prime toujours sur ce que le moteur aurait déduit.

5

Dans quoi le plat est-il servi ?

Un seul contenant fait autorité : le packaging ⚙ de la catégorie, sinon celui taggé « formule », sinon la famille de la marque.

6

Que contient exactement l'assiette ?

Ni un composant de moins, ni un contenant de plus.

7

Qu'ajoute-t-on autour ?

Le strict nécessaire, jamais un ingrédient absent du plat.

A · Sur quel décor ?

#Règle
A1Un seul décor par photo — choisi par les faits, ou par l'humain. cheminScene = canonique > packshot > decor : dès qu'un chemin gagne, les deux autres produisent une chaîne vide (fond, packshot, plaque en référence comprise). Un décor forcé à la main par l'opérateur — archétype ou plaque précise — impose le chemin décor (le seul où ils s'expriment) et fait taire le gabarit comme le packshot, exactement comme B1 fait primer l'angle humain. Le traçage des références suit le même critère que l'envoi. 10/09 (R6) : le gabarit canonique n'est plus « le dernier combo validé de la catégorie » mais le combo validé ÉPINGLÉ par un humain au gate — sans épingle, pas de gabarit, le chemin décor s'applique.
A2Le premier combo validé devient le gabarit de sa catégorie. Il impose fond, lumière, angle et contenants aux suivants ; sa NOURRITURE, elle, est interdite de copie.
A3Clause de guerre du gabarit. « Where any other instruction conflicts… THE TEMPLATE WINS » — l'exclusivité est désormais STRUCTURELLE (A1), la clause est retirée d'angle.ts.
A4Packshot enseigne : fond uni et ombre de contact. Sans « OVERRIDING the brand art direction » (le routage A1 suffit) ; en version formule, les contenants sont disposés proprement, une ombre par contenant.
A5La plaque de décor ne sert que sur le chemin décor. Jamais en concurrence avec un gabarit validé ou un packshot d'enseigne.

B · De quel point de vue ?

#Règle
B1Une seule hiérarchie d'angle. Humain (typologie manuelle ou rejet) > gabarit validé de la catégorie > formule à 3 composants et plus = 90° > typologie automatique.
B2Pas de 90° forcé sans plaque vue du dessus. Une formule à 3 composants et plus ne bascule à la verticale que si une plaque top-down validée existe : la vue ne colle pas à une plaque photographiée à hauteur d'horizon.
B3Un angle imposé n'annule pas la direction artistique. La plaque part quand même en référence, pour sa surface, sa matière et sa couleur — la ligne caméra reste seule autorité sur le point de vue. Seule l'absence réelle de plaque fait décrire le fond en mots. 10/09 soir (audit des matrices) : une plaque d'un autre angle est annoncée comme « surface seulement » et la caméra s'écrit en toutes lettres quelle que soit l'origine de l'angle (typologie comprise) — avant, seuls l'angle humain et la règle combo 90° le disaient, et la matrice A était écrasée en silence par la plaque disponible.
B4L'angle ne se dit qu'une fois. La ligne caméra vient d'une seule source (ligneCamera(angleFinal)), jamais répétée par un autre bloc.

C · Quelle liberté par rapport à la photo d'origine ?

#Règle
C1Un seul mode par photo. Sublimer / transformer / créer — un seul bloc FIDELITY dans le prompt.
C2Créer sans photo a son propre bloc. « Match the validated menu description exactly » — « preserve from the source photo » n'a aucun sens quand il n'y a pas de photo source.
C3Recomposer = redresser la scène, pas la nourriture. Pour les formules et les photos posées en vrac : mise en scène refaite, nourriture fidèle au pixel.
C4La retouche préserve ou corrige, jamais n'ajoute. Le plan de retouche vision n'a pas le droit d'introduire décor, props ou ingrédients.
C5Une image identique à la source est un échec. Elle est retentée (règle dure du socle).
C6Les emballages individuels font partie du plat. Le plan de retouche par photo garde les portions emballées (beurre, fromage, coupelles de sauce ou de confiture) exactement comme photographiées et les COMPTE ; il ne propose jamais de les remplacer, retirer ou dupliquer.

D · Dans quoi le plat est-il servi ?

#Règle
D1Une seule autorité de contenant. ⚙ catégorie (packaging forcé) > tag « formule » > famille de la marque — le bloc décrit la mise en scène par FAMILLE (wrap à plat, sac à côté, boîte dedans).
D2Le texte du packaging ne présume pas de sa forme. Écrit pour une boîte, il déroutait le modèle sur un plateau bois.
D3Clause de préséance du contenant. « It OVERRIDES any container seen in the source photo » — doublon du « IGNORE the containers visible in the source photo… REPLACED » du même bloc ; supprimé.
D4« Sans packaging » d'un humain ferme tous les blocs packaging. Détection FR/EN (packagingRefuseParHumain) + ligne « OPERATOR OVERRIDE » : jamais deux ordres contraires dans le même prompt.
D5Chaque composant taggé va dans SON contenant, à côté. Un sachet de frites reste à côté de la boîte principale, jamais dedans.
D6Le contenant taggé « formule » est l'ancre d'ensemble. Il passe avant toutes les familles, pour que deux générations du même combo se ressemblent.
D7Plusieurs plats + boîte à compartiments = une seule boîte. Un plat par compartiment, jamais deux boîtes.
D8Un seul bloc contenant, décidé par une fonction pure et testée. composerBlocContenant : chemin unique categorie > combo > da > neutre ; un humain qui dit « sans packaging » les ferme tous. 4 doublons fusionnés, la clause « CONTAINER PRECEDENCE (non-negotiable) » supprimée, et la contradiction tranchée : le packaging de catégorie porte les plats principaux, chaque composant taggé va dans le sien, le reste suit la même famille. Aucune règle nouvelle.
D9Copier un packaging, c'est copier sa forme, pas seulement sa marque. Reformulation de D5 (« copied exactly », trop vague) : forme, proportions, ouverture, tenue, matière, couleur, position du marquage — « un sachet reste un sachet, jamais un gobelet générique portant la marque ».
D10Un contenant refusé en boucle est un problème de DONNÉE, jamais de règle. Le contrôle de cohérence signale tout contenant dont la QA refuse ≥ 3 rendus, et tout contenant sans usage déclaré ; le watchdog en fait une décision d'équipe (ne plus l'imposer · le confirmer · tolérer). Interdiction de durcir une consigne de copie pour forcer un rendu que l'objet rend impossible.
D11Un packaging nu est dit nu. Chaque packaging porte son drapeau brande (11 sur 19 sont nus : verres, assiettes, wraps blancs). Sur un packaging de catégorie non brandé, le bloc contenant dit « PLAIN and UNBRANDED : no logo, no text, no brand mark », ne parle plus de « branding position » ni de « printed logo », et le wrap n'est plus « branded paper » ; le négatif interdit nommément le logo (« no text, no logo, no brand mark ») dès qu'aucun logo n'est attendu — c'est-à-dire seulement : packaging de catégorie BRANDÉ, DA du contenant avec logo actif, ou logo réel envoyé en référence (t8). Le vrai logo du client part TOUJOURS en dernière référence dès qu'il existe ; la POSE reste une décision (t8 ou DA du contenant, hors packaging brandé) ; sans pose, le négatif dit que ce logo est la seule marque qui puisse jamais apparaître, là où le prompt la place, jamais une inventée. Le juge sait que le logo envoyé est le vrai.
D12La vaisselle du client sert d'elle-même. Sans réglage ⚙ de packaging sur la catégorie, le contenant VU sur la photo source (lecture vision : assiette, bol, planche, verre…) désigne une famille ; si le client possède un packaging de cette famille avec photo, il part en référence comme un packaging de catégorie (tracé « vaisselle du client déduite de la photo »). Sans packaging du tout, le bloc contenant nomme le contenant de la photo : « une assiette reste une assiette, jamais une boîte que la photo ne montre pas ».

E · Que contient exactement l'assiette ?

#Règle
E1La description validée dicte la séparation. « Plus 2 » veut dire 2 éléments séparés à l'image.
E2Jamais de boisson, side ou sauce absents des références.
E3La photo BRUTE d'un composant passe avant son visuel validé. Le visuel validé embarque un contenant qui pollue la scène.
E4Six photos de référence au maximum par formule.
E5La norme formule ne se répète pas. Vocabulaire éditorial (85 mm f/4, compte de pièces non tuilé) ; la phrase-contrat finale doublonnée est retirée.
E6Pas de « SET DRESSING: none » sur une formule. Il contredisait le « garnish scattered sparingly » de la norme.
E7Négatifs de formule réduits à l'essentiel. « No duplicated cloned food pieces, no artificial stacking » — « no fake studio lighting » contredisait « professional studio lighting ».
E8Composer sans aucune photo réelle en référence est interdit.
E9Les groupes d'options donnent le compte exact. Un groupe obligatoire « drink » donne le nombre de boissons (« Choose your 2 drinks » = 2) et le moteur FOURNIT la photo d'une boisson du groupe ; les groupes facultatifs payants (dessert, side, extras) sont interdits de rendu et signalés à la QA comme inventés.
E10Ce que le menu inclut est un FAIT, déclaré toujours — au modèle ET à la QA. Reformulation de E9, qui ne déclarait le compte de boissons que si une photo de référence en montrait une : sans photo, le contrat se taisait, mais le gabarit autorisait quand même une boisson « si la formule en inclut une », le modèle en dessinait, et la QA — tenue dans la même ignorance — les comptait comme INVENTÉES. Désormais le fait se dit toujours ; seule la manière de rendre dépend des références (avec photo : celle-ci ; sans photo : un gobelet ou une canette NEUTRE, aucune marque inventée).
E11Séparer ne veut jamais dire AJOUTER. Un composant déjà servi dans son propre ramequin reste tel quel, et la scène finale compte exactement autant de contenants que de composants — jamais un de plus.
E12La recomposition dit COMMENT recomposer, rien d'autre. Une tête par chemin (crops segmentés · photo entière · même assiette : ce que montre la source), un cœur commun (angle de la plaque, héros centré, contenants droits, chaque composant annoncé par « with / plus / + » dans son propre contenant de nourriture, séparer n'est jamais ajouter). L'inventaire reste à la maison contenant et aux négatifs, la lumière et la netteté à la maison qualité, « rien d'inventé » au socle ; la fidélité par composant ne répète plus la séparation. Les trois têtes commencent par « RECOMPOSITION » : une seule maison (« mode ») pour le classificateur.
E13Ce qu'une formule inclut a UNE source de vérité. Les boissons incluses viennent des groupes de choix obligatoires ET des boissons nommées après le séparateur d'accompagnement de la description (« servi avec jus d'orange et boisson chaude ») ; le contrat de composition retient le plus grand des deux et nomme les boissons décrites ; le juge lit le même nombre.

F · Qu'ajoute-t-on autour du plat ?

#Règle
F1Une plaque manquante n'est pas un échec — la plaque maison AC-01 du bon angle part en secours. Reformulée le 10/09 soir (question Mehdi « un client sans plaque tombe sur AC-01 ? ») : le repli « fond décrit » du 03/09 validait à 0 % sur 31 formules ; la plaque neutre « Seamless Catalogue » (trois angles validés) part à sa place, annoncée au gate (« 🛟 plaque de secours AC-01 ») et sur le prompt (« surface seulement » si l'angle diffère) ; le fond décrit ne reste que si même AC-01 n'a rien. L'équipe est alertée dans les deux cas, et le digest rappelle chaque jour les décors en attente. À ne pas confondre avec l'ARCHÉTYPE par défaut AC-01 d'un client sans style ni cuisine déclarés (fiche ADN). Prérequis par client (10/09, 22 h 30, Mehdi) : comme un paiement — tant que l'archétype du client n'a pas de plaque validée pour CHAQUE angle que ses plats exigent (typologies), la génération de ce client est refusée (HTTP 409) avec le geste : « Générer les plaques manquantes » (un clic, elles partent au gate) ou « Changer d'archétype » (fiche, Identité). Le jalon « Plaques du décor » bloque, l'assignation à un archétype sans plaques notifie l'équipe une fois, la bibliothèque porte le bandeau. Les autres clients ne sont pas gênés. La plaque de secours AC-01 ne reste que pour les chemins sans pré-vol (reprises cron), annoncée. Une plaque est une surface et une lumière, jamais un objet (10/09 soir) : le prompt de génération des plaques interdit tout prop — les herbes ou l'anis cuits dans un décor se retrouvaient sur chaque plat de l'archétype ; les props sont l'affaire de l'habillage, plat par plat.
F2Habillage sobre et cohérent avec la catégorie. Le choix de thématiques est un contrat ; les fruits hors-sujet sont supprimés.
F3Les couleurs de marque sont des MATÉRIAUX, pas de la peinture. « Natural surface materials, never saturated paint ».
F4Le plat touche la surface et porte son ombre. Une seule occurrence de la consigne par prompt.
F5L'habillage générique n'invente plus de matière absente du plat. Quand une thématique choisie ne trouve aucun terme dans le plat, on ne pose plus « une trace de poussière d'épices » ni « un brin d'herbe » : ces génériques inventaient un ingrédient. Les génériques neutres (ramequin vide, pièce de l'ingrédient principal) restent. 10/09 soir (Mehdi : « l'habillage doit s'adapter au plat, des herbes sur un dessert n'ont aucun intérêt ») : plus AUCUN générique, quelle que soit la thématique — un élément n'est posé que s'il est reconnu dans le plat (nom, description, description vision de la photo) ou tiré du style pour la table (t7) ; les résidus (t3) et épices (t2) sont ceux du plat ou rien ; sans terme reconnu, plat nu et la note le dit ; un habillage forcé à la main envoie une consigne conditionnelle. 11/09 : le texte du plat qui nourrit l'habillage s'arrête au premier séparateur d'accompagnement (« servi avec jus d'orange » n'est pas le plat — même coupe que F6) ; t8 (marque) ne pose RIEN autour du plat : c'est une notion de CONTENANT — le logo réel du client part en DERNIÈRE référence et la maison PACKAGING dit une fois qu'il est imprimé sur le contenant principal, seulement quand aucun packaging brandé n'est photographié (un packaging réel porte déjà sa marque ; la vaisselle nue l'accepte) — sans logo, rien, jamais inventé.
F6Un produit fermé ne se décore jamais — et c'est LE PLAT qui est fermé, pas ses accompagnements. Une boisson ou un produit emballé de marque ne reçoit aucun habillage (verrou du 08/09, nature-plat.ts, classifieur unique). Le plat se juge sur son nom, sa catégorie et sa description avant le premier séparateur d'accompagnement (« servi avec », « with », « plus »…) ; un produit emballé se reconnaît à son nom, jamais à un ingrédient cité ; une formule n'est ni emballée ni pièce entière.

G · Comment une règle naît, change et s'applique

#Règle
G1Une règle d'orchestration ne part jamais dans un prompt image. Le socle n'injecte que les règles marquées propose et non process:true (repli plaque, scoring du gate…).
G2Le dernier rejet est la consigne prioritaire — et n'a qu'une place. La mémoire du plat (3 retours maximum, fonction pure blocMemoirePlat) contextualise avec les retours PRÉCÉDENTS et ne répète jamais le dernier rejet, déjà porté par la ligne prioritaire.
G3Un linter surveille chaque prompt, sans jamais bloquer. Marqueurs d'autorité restants, autorités de fond multiples, budget par type — 5 500 caractères pour un plat simple, 7 500 pour une formule (mesure 08/09 sur 198 prompts : les VALIDÉS font 4 559 et 6 649 en moyenne, plus courts que la médiane ; le seuil unique de 6 300 alertait sur des formules normales et laissait passer des plats simples trop longs) — et directives « absent from source » répétées 3 fois et plus. Journalisé dans crm_journal (champ linter_prompt).
G4Chaque prompt réellement envoyé est stocké et auditable.
G5Toute nouvelle règle passe par CE registre. Incident daté + vérification qu'elle ne contredit aucune ligne existante ; en conflit → décision d'équipe, jamais un marqueur d'autorité. Gardes CODÉS : les API d'amendement des blocs et du socle REFUSENT tout texte portant un marqueur (WINS, OVERRIDES…) et journalisent chaque amendement (avant/après, par qui) ; l'analyse IA de consolidation porte la doctrine « retirer vaut plus qu'ajouter » dans son prompt.
G6« C'est parfait, change juste X » retouche l'image, ne la régénère pas. Détection calibrée et testée sur les 153 consignes réelles ; exclusions : toute consigne exigeant une référence (packaging, logo, plaque, angle).
G7Structurer les constats de la QA en zones de l'image. Tableau {texte, zone 3×3} au lieu d'une chaîne — prérequis du surlignage des zones à juger ; en attendant, les réserves traduites s'affichent en overlay dans la modale de jugement.
G8Un rejet sans motif n'apprend rien : le motif est obligatoire. UI + garde serveur 400, liste resserrée à 7 cas réels ; « test sans valeur » réservé au rejet en lot.
G9Le registre est visible par l'équipe sur /visuels/regles. Embarqué au prebuild avec l'empreinte, en lecture seule : une règle change par le circuit incident → registre → code → banc, jamais par un champ de texte.
G10Deux familles de conflits, deux traitements. Un conflit que le CODE sait trancher (deux blocs sur un même sujet, un marqueur d'autorité, un budget dépassé) se corrige dans le moteur et n'atteint jamais l'équipe : le linter le journalise. Un conflit où DEUX LECTURES SE VALENT — un réglage de production contredit par les rendus, sans qu'on puisse dire si le réglage est mauvais ou si le rendu le respecte mal — remonte au cockpit en décision d'équipe, avec les options qui tranchent vraiment (garder · retirer · tolérer 14 j) et un exécuteur qui applique.
G11Un motif de rejet doit enseigner quelque chose au moteur. La table motif → consigne vit avec les motifs (motifs.ts), et un test refuse qu'un motif proposé à l'équipe n'ait pas sa consigne de prévention — sauf « autre » et « test sans valeur », qui n'apprennent rien par nature. Consigne réinjectée à partir de DEUX rejets du même motif chez le même client.
G12Ce que la QA VOIT nourrit les prompts suivants. Les éléments listés comme inventés sont classés par famille (contenant · boisson · ingrédient · décor) et, à partir de DEUX occurrences chez le même client, la consigne correspondante part dans toutes ses générations suivantes — même mécanique que les rejets humains. Les repères de position (« under the plate ») sont ignorés au classement, sinon ils comptent des objets existants comme inventés.
G13Un signal QA ne devient une consigne QUE s'il discrimine. Mesuré sur 90 j : « floating dish » est validé par l'humain 100 % du temps, « excessive set dressing » 100 %, « separation non appliquée » 92 % — en faire des leçons injecterait du bruit dans tous les prompts. Seul « container mismatch » discrimine (17 % de validation) : il est mappé sur le motif mauvais_packaging EXISTANT, sans écrire de leçon nouvelle. À re-mesurer dans quelques semaines, les motifs n'étant obligatoires que depuis le 08/09.
G14Une regex destinée à Postgres ne s'écrit pas dans un template JavaScript. Les antislashes simples y disparaissent : le moteur a répondu HTTP 500 sur chaque appel pendant 5 h le 09/09. Un test de charte refuse désormais tout antislash simple dans une ligne qui parle regex à la base, et le banc de prompts SORT EN ERREUR quand il n'a mesuré aucun prompt — il annonçait « tous les invariants tiennent » sur zéro mesure.
G15La QA contrôle ce qui est PARTI, réglage par réglage. Le brief du juge (qa-brief.ts, pur) annonce les réglages réellement envoyés — angle (et s'il vient d'un humain), fond (plaque · aplat · teinte · packshot · bois décrit), contenant, habillage — avec le MÊME critère que le prompt ; le juge rend un constat par réglage (settings_check : ok · ko · n-a), lu par reglagesContredits et affiché au gate en réserve (« réglage non appliqué : angle »). Jamais bloquant : le blocage reste aux faits d'inventaire (calibrage 09/08) tant que le pouvoir discriminant de ces constats n'est pas mesuré. 11/09 : le brief porte aussi une LISTE DE CONTRÔLE quand la description énumère ≥ 4 composants (British : champignons oubliés, tomates cerises inventées, sans que la QA le voie), et annonce le logo envoyé en référence (identique = voulu, tout autre marquage = inventé). La conformité packaging distingue le packaging IMPRIMÉ (copie exacte) de la VAISSELLE (céramique, bois, bol, métal : même couleur, matière, finition — une autre forme n'est pas un « container mismatch »).
G16Le juge est un réglage, pas un câblage. La QA visuelle, la QA bannière, la porte de conformité et la lecture des photos passent par la MÊME maison (lib/ai/texte.ts, texte et images, Anthropic · Google · DeepSeek), le modèle venant de /config et à défaut du catalogue (MODEL_TASKS, seule source du repli). Chaque verdict trace son juge (juge). Depuis le 11/09, la QA est sur Gemini (Flash pour les photos, Pro pour les bannières) — décision Mehdi, et retour possible sans code.
G17Le socle d'un agent image ne parle qu'anglais. Le socle de /prompts est un registre humain (français, daté, avec incident ou preuve). Ce qui part au modèle en est une projection faite par UN formateur pur (lib/agents/socle-bloc.ts) : entrées validées, non-process, et — pour un agent image (visuels, bannières) — écrites en anglais ; le reste est écarté et le contrôle de cohérence le signale (constat « Socle image »). Une proposition issue d'un rejet se valide REFORMULÉE en anglais depuis l'écran ; une technique déjà codée dans une maison du prompt est marquée process (elle documente, elle ne s'injecte pas).
G18Une bannière en mode auto se propose sous ses deux VUES — et « toute la production » l'enchaîne seule. Le bouton « Toute la production » pose un checkpoint banniere_apres_production ; à la fin du run (navigateur fermé ou non, le cron reprend), la bannière part en deux vues, composée sur les photos validées ou, à défaut, sur celles que la QA juge conformes (bannière PROVISOIRE, notée comme telle sur la carte, à refaire après validation). « Générer les photos » et « Générer la bannière » restent séparés pour les tests. Sans style forcé ni acté, la matrice donne le style, et la route produit aussi l'autre vue : « Table en perspective 45-60° » (F), ou « Table vue du dessus » (A) si la matrice a déjà pris F — l'humain choisit celle qui rend le mieux, et le style s'acte à ce choix. Une raison de rejet écrite en français devient une proposition d'interdit déjà en ANGLAIS (raison d'origine gardée en note) : elle arrive sur /prompts prête à valider.
G19Une règle vit tant qu'elle fait baisser quelque chose. Chaque règle validée du socle d'un agent image affiche sur /prompts son effet mesuré : rejets pour 100 visuels dans les 14 jours avant sa date et les 14 jours après (au moins 10 visuels de chaque côté). Le contrôle de cohérence signale toute règle de plus de 30 jours sans effet : elle se retire ou se reformule. Les règles de code (matrices, blocs) passent par le registre des leçons, le banc et le contrôle, jamais par empilement.
Dans la même famille