Correction d'une preuve qui n'en était pas une. Ma vérification lançait le même plan deux fois et comparait les empreintes. Le porteur ayant indiqué où ComfyUI écrit ses images, le dossier a pu être inspecté : UN SEUL fichier y figurait alors que deux exécutions avaient été lancées. ComfyUI met en cache le résultat d'un graphe identique. La « deuxième exécution » n'avait rien recalculé — elle avait relu la première. Comparer deux empreintes dans ces conditions ne mesure que le cache. Après POST /free, une exécution authentique produit decor_00002_.png, bit-identique au premier. La conclusion était juste, la méthode ne l'était pas. Le test devient un mode de l'outil plutôt qu'une manipulation : --reproductibilite génère, vide le cache, régénère et compare. Un test de reproductibilité qui ne vide pas le cache se ment à lui-même. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
107 lines
4.3 KiB
Markdown
107 lines
4.3 KiB
Markdown
# Pipeline d'assets — filière B (décor)
|
|
|
|
> **Filière B uniquement.** Rien de ce qui sort d'ici ne peut servir à identifier une
|
|
> espèce. Fonds, sprites du mode arcade, badges, écrans de titre, iconographie — jamais
|
|
> une épreuve, jamais un indice (ADR 0004).
|
|
>
|
|
> La séparation n'est pas une consigne : `npm run validate:data` fait échouer le build si
|
|
> un média de filière B porte un usage identifiant, et `npm run test:porte` le prouve.
|
|
|
|
## Pourquoi cette séparation existe
|
|
|
|
Les modèles de diffusion connaissent mal le corossol, à peine la quenette, presque pas le
|
|
zikak. Sur ces espèces, ils ne refusent pas : ils produisent un fruit **plausible et faux**.
|
|
Un enfant qui apprend dessus apprend l'hallucination d'un modèle.
|
|
|
|
Le décor, lui, n'a rien à enseigner. C'est là que la génération a sa place.
|
|
|
|
## Où ComfyUI écrit
|
|
|
|
Sur la machine du porteur : `/media/sucupira/DKXONE/ComfyUI/output`, sous-dossier `ki-fwi/`
|
|
(fixé par `filename_prefix` dans le workflow). Le client rapatrie les images par l'API
|
|
`/view`, ce qui fonctionne aussi si ComfyUI tourne ailleurs — mais inspecter ce dossier
|
|
reste le seul moyen de savoir si une génération a **réellement** eu lieu.
|
|
|
|
## Utilisation
|
|
|
|
```bash
|
|
# Vérifier que les seeds sont bien déterministes (aucun serveur requis)
|
|
python3 comfyui_client.py --verifier
|
|
|
|
# Test de reproductibilité RÉEL : génère, vide le cache, régénère, compare
|
|
python3 comfyui_client.py --workflow workflows/decor-sdxl.json \
|
|
--plan plan-assets.json --reproductibilite
|
|
|
|
# Calculer les seeds d'un plan sans rien générer
|
|
python3 comfyui_client.py --workflow workflows/decor.json --plan plan-assets.json --sec
|
|
|
|
# Générer, ComfyUI devant tourner en local
|
|
python3 comfyui_client.py --workflow workflows/decor.json --plan plan-assets.json
|
|
```
|
|
|
|
Aucune dépendance n'est nécessaire : le client n'utilise que la bibliothèque standard.
|
|
|
|
## Les trois défauts du pack d'origine, corrigés
|
|
|
|
### 1. Les seeds n'étaient pas reproductibles
|
|
|
|
Le pack faisait `hash(fruit["id"] + asset_type) % 2**32` en vendant l'argument « même seed
|
|
= même style ». Or `hash()` sur une chaîne est **randomisé à chaque exécution** depuis
|
|
Python 3.3 (`PYTHONHASHSEED`) : les seeds changeaient d'un lancement à l'autre, exactement
|
|
l'inverse de ce qui était annoncé.
|
|
|
|
Remplacé par `zlib.crc32(clé.encode()) & 0xFFFFFFFF`. Vérifié empiriquement — deux
|
|
processus avec des `PYTHONHASHSEED` différents produisent les mêmes valeurs :
|
|
|
|
```
|
|
kowosol:fond 1368899280
|
|
zikak:sprite 4184016363
|
|
mansiniye:badge 1009059342
|
|
lakou:titre 4201979101
|
|
```
|
|
|
|
### 2. `json.loads(json.dumps(x))` pour copier
|
|
|
|
Remplacé par `copy.deepcopy(x)` : même effet, sans aller-retour par une sérialisation qui
|
|
écrase les types non JSON.
|
|
|
|
### 3. La licence de `rembg` n'était pas vérifiée
|
|
|
|
Le paquet est sous MIT, mais **les poids** du modèle qu'il télécharge ne suivent pas
|
|
nécessairement cette licence. `requirements.txt` porte l'avertissement, et `rembg` reste
|
|
commenté : à n'installer qu'après vérification des poids, pas du paquet.
|
|
|
|
## Format du plan
|
|
|
|
```json
|
|
{
|
|
"noeud_seed": "4",
|
|
"noeud_prompt": "6",
|
|
"assets": [
|
|
{ "id": "lakou", "type": "fond", "prompt": "jaden créole au petit matin, …" }
|
|
]
|
|
}
|
|
```
|
|
|
|
La clé de seed est `<id>:<type>`. Elle ne doit jamais changer une fois un asset retenu :
|
|
c'est elle qui garantit qu'une régénération donne la même image.
|
|
|
|
## Ce que le pipeline ne fait pas
|
|
|
|
Il ne valide rien. Tout asset sort en `valide: false` et le reste jusqu'à ce qu'un humain
|
|
tranche — comme pour les photographies. La différence est qu'un asset de filière B, même
|
|
validé, ne pourra jamais porter une épreuve.
|
|
|
|
## Piège du cache d'exécution
|
|
|
|
**ComfyUI met en cache le résultat d'un graphe identique.** Relancer le même workflow ne
|
|
recalcule rien : aucune image n'est écrite, et l'API renvoie la sortie précédente.
|
|
|
|
Conséquence : comparer deux « exécutions » sans vider le cache ne prouve rien sur la
|
|
reproductibilité — cela prouve seulement que le cache fonctionne. C'est l'erreur commise
|
|
puis corrigée en session 3.
|
|
|
|
`--reproductibilite` appelle `POST /free` entre les deux générations. Pour vérifier à la
|
|
main, regarder si un nouveau fichier est apparu dans le dossier de sortie : s'il n'y en a
|
|
pas, rien n'a été calculé.
|