POUR UN AGENT IA

Cette page contient tout le contexte du projet Blueprint Factory. Le handoff complet, en 27 sections, se trouve juste en dessous, en HTML statique : aucun JavaScript n'est nécessaire pour le lire.

Commence par la section 1 « En bref » et la section 2 « Règles dures », puis lis la section 21 « Problèmes connus » et la section 24 « Conventions de travail ». Les chiffres et les chemins viennent du dépôt blueprint-factory, et les points non vérifiés sont marqués [à confirmer].

Versions brutes du même contenu : handoff.md (Markdown) · llms.txt (index court) · context.json (inventaire machine). La visionneuse 3D, en bas de page, sert aux humains et n'ajoute aucun contexte.

KAGE GAMES · BLUEPRINT FACTORY

Contexte projet et livrables

Blueprint Factory : handoff pour agent IA

À lire en premier. Ce document résume tout le contexte du projet Blueprint Factory (Kage Games) pour un agent qui arrive sur le projet. Point d'entrée public : https://kg.g.caute.re/factory/. Cette page contient ce document en entier, rendu en HTML statique : aucun JavaScript n'est nécessaire pour le lire. Versions alternatives : handoff.md (ce texte en Markdown brut), llms.txt (index court) et context.json (inventaire lisible par machine).

  • État figé au : 10 novembre 2026, vers 23 h (heure de Paris), au commit 2700872. Le handoff a été ajouté en 8b7432b, puis rendu dans l'accueil.
  • Langue du projet : français, pour l'UI, les docs, les commits et les échanges avec le propriétaire.
  • Convention de ce document : chaque fait vient du dépôt, des docs ou de l'historique des demandes. Ce qui n'est pas vérifié est marqué [à confirmer].

Sommaire

  1. En bref
  2. Règles dures, à ne jamais enfreindre
  3. But et vision
  4. Index des livrables en ligne
  5. Chronologie (commits)
  6. Glossaire
  7. Architecture du dépôt
  8. Principes de conception transverses
  9. V1 : bâtiments de colonie (spec → SVG → 3D)
  10. Kit KX : cargo spatial modulaire
  11. Configurateur et galerie de variantes KX
  12. Chaîne factory en 9 étapes
  13. Kit OX : avant-poste minier sur astéroïde
  14. Kit GX : grille voxel pour pixel art
  15. Référentiel IA
  16. Formats de fichiers et schémas
  17. Commandes : build, lint, tests, export
  18. Palette : jamais de vert
  19. Budgets triangles et poids web
  20. Données gameplay
  21. Problèmes connus
  22. Journal des décisions
  23. Questions ouvertes et prochaines étapes
  24. Conventions de travail pour un agent
  25. Contexte : Deep City
  26. Données publiques lisibles par machine
  27. Ce qui n'a pas pu être confirmé

1. En bref

2. Règles dures, à ne jamais enfreindre

  1. Pas de vert dans les chartes graphiques, les UI, les SVG ou les matériaux. Est interdite toute teinte entre 70° et 170° avec une saturation ≥ 0,25 et une valeur ≥ 0,15. Voir §18.
  2. Aucun secret dans le chat, les logs, git ou les pages publiques : clés, jetons, mots de passe, adresses internes.
  3. Ne jamais déployer soi-même. On prépare un overlay, on le documente (taille, sha256, liste des fichiers) et un opérateur le fusionne.
  4. Overlays uniquement : des fichiers ajoutés ou remplacés un par un.
    • Ne jamais lancer le build-site.sh complet du lanceur : il échoue, car des builds de POC ne sont plus présents.
    • Ne jamais remplacer le Caddyfile.
    • Ne jamais livrer un factory/ entier qui écraserait les sous-pages (voir §21 sur add-factory.sh).
  5. Ne jamais toucher au DNS, à l'edge (proxy), au VPN ni aux ACL réseau.
  6. Ne pas câbler jobs.json (file de jobs d'un autre outil, hors périmètre).
  7. Unreal Engine est exclu (décision du propriétaire : « oublie Unreal Engine »). Le moteur cible des exports est Godot 4.7.2.
  8. Les étapes Steamworks restent entre les mains du propriétaire. N'en engage aucune.
  9. Documenter la chaîne : chaque étape doit avoir un script, un artefact et une trace (README, planche, capture).
  10. Vérifier chaque affirmation avant de la reporter : un lint, un test ou un curl doit le confirmer. Une page en ligne n'est « en ligne » qu'une fois qu'elle a répondu 200.

3. But et vision

4. Index des livrables en ligne

Base : https://kg.g.caute.re. Le lanceur général du studio est à la racine /.

Factory

URLContenuSource dans le dépôt
/factory/Accueil pour une IA et pour un humain. On y trouve d'abord ce handoff complet, en HTML statique, puis la visionneuse V1 en bas de page : 3 bâtiments (habitat S, QG, aire d'atterrissage) en filaire, plein ou texturé, avec le plan SVG à côtéviewer/index.html (généré depuis src/handoff/home.template.html + viewer/handoff.md), viewer.js, viewer.css
/factory/handoff.mdCe documentviewer/handoff.md
/factory/llms.txtIndex court pour LLMviewer/llms.txt
/factory/context.jsonInventaire lisible par machineviewer/context.json (généré)
/factory/referential/Référentiel IA : 6 rendus IA (depuis le plan et depuis la 3D) comparés à leurs sourcesviewer/referential/
/factory/kit/Kit KX en 4 niveaux : composants, modules, coques, assemblagesviewer/kit/
/factory/kit/configurator/Configurateur KX : une coque plus des modules, validation en direct, budgets, export AXviewer/kit/configurator/
/factory/kit/variants/Galerie de 20 variantes KX par seedviewer/kit/variants/
/factory/chain/Chaîne en 9 étapes appliquée à AX-02, avec ses artefacts téléchargeablesviewer/chain/, assemblée par src/chain/chain_site.py
/factory/outpost/Kit OX en 4 niveaux : composants, bâtiments, parcelles, assemblagesviewer/outpost/
/factory/grid/Kit GX en 5 onglets (les 4 niveaux plus « Méthodes ») : voxels 3D et sprites pixel artviewer/grid/

Liens profonds utiles :

Contexte jeu (Deep City)

Ces pages servent de contexte seulement : elles ne font pas partie de la factory. Voir §25.

URLVersion
/play/deep-city/Deep City v0.1 (MVP, Godot 4.7.2), commit 60d370a
/play/deep-city-v2/Deep City v0.2 « 3 étages » (Godot), commit 244c82e
/play/deep-city-v3/Deep Colony : Kepler-Ombre v0.3, reskin sur planète alien (Godot), commit 6eb99f4
/play/deep-city-love2d/, /play/deep-city-raylib/, /play/deep-city-phaser/, /play/deep-city-vanilla/Portages du MVP vers d'autres moteurs

5. Chronologie (commits)

Dépôt git blueprint-factory (local, sans remote). Les heures sont celles de Paris.

DateCommitJalon
09/11 21:3787098a6V1 : spec JSON → plans SVG cotés + Blender filaire/plein/texturé pour habitat_s, command_hq et landing_pad, avec contrôle d'import Godot
09/11 21:5475fc04dVisionneuse 3D web (three.js) et textures cuites <id>_tex.glb. build.sh gère la cuisson et les assets de la visionneuse
10/11 10:2185673eaKit KX : charte mesurée, 14 composants, 5 modules, 3 coques à slots vides, 4 assemblages, lint (110 contrôles à l'époque), visionneuse /factory/kit/ (Draco), référentiel IA
10/11 11:060da1d14Kit KX : 10 rendus PNG (Cycles « hangar » et versions cinématiques), plus une planche contact
10/11 17:1051bbbdeChaîne en 9 étapes illustrée sur AX-02 : blockout, usure par seed, bake AO, QA, export .tscn Godot, planche et vignettes
10/11 17:218c6bb9cChaîne 9/9 réelle : brief → spec déterministe, carte ID cuite, fiche gameplay calculée, plafonds de triangles, page /factory/chain/
10/11 17:221278dc3Kit GX : grille voxel (g = U/2), 15 composants, 5 modules, 3 coques, 4 assemblages. Comparaison des méthodes A, B, B′ et C, sprites 4 et 8 directions, lint 107/107
10/11 17:34477f208Configurateur KX et galerie de variantes par seed. Ajout de stats.json ; lint 119/119, test 28/28
10/11 17:3694009efKit OX : avant-poste sur astéroïde, avec 12 composants OX + 10 KX, 7 bâtiments, 3 parcelles, 3 assemblages ; lint 150/150
10/11 22:142700872Correctif mémoire Draco : un seul DRACOLoader partagé, et le contexte WebGL est libéré avant de quitter la page (voir §21)
10/11 23:298b7432bAccueil factory transformé en handoff : handoff.md, llms.txt, context.json
10/11 ~23 h 50(commit suivant)Accueil v2 : ce handoff rendu en entier en HTML statique dans /factory/, avec le préambule « Pour un agent IA » et la visionneuse sous le contexte

Publication :

6. Glossaire

TermeDéfinition
Factory / Blueprint factoryLa chaîne spec → plan SVG → 3D → export, et par extension le projet
SpecFichier JSON paramétrique : la source de vérité. Le SVG et le GLB en sont des sorties
PlanchePlan technique A3 en SVG (unités en mm sur la feuille, cotes en m), avec calques, cotes, nomenclature et cartouche
KXKit de style cargo spatial. Préfixe des modules (KX-LIQ…) et de l'interface KX-4
HXCoque KX (hull) : HX-S caboteur, HX-M cargo moyen, HX-L long-courrier
AXAssemblage KX : AX-01 à AX-04. C'est une coque plus des modules, décrite en données
OXKit avant-poste minier sur astéroïde, dérivé de KX. Bâtiments OX-HAB, OX-DRL…
PXParcelle d'astéroïde OX à slots vides : PX-S, PX-M, PX-L
OAAssemblage OX : OA-01 à OA-03. C'est une parcelle, des bâtiments et des tubes de liaison
F1 / F2Emprises OX : F1 = 4,00 × 4,00 m ; F2 = 10,00 × 4,00 m (= 2 × F1 + un couloir de 2,00)
OX-4Socle commun des bâtiments OX : ancrages ANC, vérins LEG, plancher à +0,70, ombilicale UMB au centre
GXKit KX quantifié sur grille voxel, pour le pixel art. Coques GH-S/M/L, assemblages GA-01 à GA-04, interface GX-4
G8 / G4Résolutions GX : G8 = 1 voxel pour 0,125 m (8 vox/m), le modèle de référence ; G4 = 1 voxel pour 0,25 m (= U), un LOD dérivé par sous-échantillonnage 2×2×2 qui n'est jamais modélisé
U / uGrille KX : U = 0,25 m ; u = U/5 = 0,05 m. Toute cote structurelle est un multiple de u
gPas voxel GX : 1 voxel = g = U/2 = 0,125 m
SlotEmplacement vide d'une coque (C1/C2) ou d'une parcelle (F1/F2). Seules les interfaces y sont dessinées, jamais le module
C1 / C2Classes de slot KX. C1 = 3,00 × 2,00 × 2,00 m (12U × 8U × 8U). C2 = 6,25 × 2,00 × 2,00 m = 2 × C1 + une nervure de 0,25. Un C2 accepte 1 × C2, ou 2 × C1 dans les sous-slots a/b à ±1,625
Interface KX-4Accroche commune : 8 coins KXC (cubes de 0,20, jaune #f2b705), 4 verrous KXL au plancher, 4 bras KXB en tête, 1 ombilicale UMB (2 sur un C2)
ComposantPièce paramétrique d'identité, réutilisée en micro (modules) ou en macro (coques) : RVT, BVL, PNL, RIB, KXC, KXL, KXB, UMB, IFP, VNT, RNG, BCN, PIP, DOR
ModuleConteneur cargo KX qui se pose dans un slot : LIQ (citerne), BOX (fret sec), ORE (minerai), CRY (cryogénie), BIO (vivarium, en C2)
Denrée / code denréeType de cargaison avec sa couleur : LIQ, BOX, ORE, CRYO, BIO
Famille (OX)Fonction d'un bâtiment, qui fixe sa couleur : VIE, EXT, TRT, NRJ, COM. Elle reprend les 5 teintes de denrée KX
Micro / macroClasses d'échelle : rivets Ø0,03 au pas 0,15 (micro) ou Ø0,06 au pas 0,30 (macro), biseaux XXS à S ou M à XL
Habillage / liveryImmatriculation, bande de flotte et usure de 0 à 3, sans toucher à la géométrie
SeedGraine du générateur déterministe (mulberry32) des variantes, ou de l'usure dans la chaîne (4471 pour AX-02)
LintContrôles automatiques de conformité à la charte : tools/kit_lint.py, ox_lint.py, grid_lint.py
OverlayArchive tar.gz de fichiers à poser par-dessus le site déployé (préfixe launcher/site/...)
Méthode A / B / B′ / CMéthodes de rendu pixel art comparées dans GX (voir §14)

7. Architecture du dépôt

blueprint-factory/
├── README.md                 # vue d'ensemble V1 + kit KX + régénération de ces pages
├── build.sh                  # V1 (3 bâtiments) : SVG → Blender → bake → viewer/assets → Godot
├── build-kit.sh              # Kit KX : SVG + mesh + lint + Blender + bake + GLB web Draco + assets
├── build-outpost.sh          # Kit OX (même structure, FAST=1 = sans Blender)
├── build-grid.sh             # Kit GX : voxels + sprites A + Blender (B, B′) + quantification + lint
├── specs/
│   ├── habitat_s.json, command_hq.json, landing_pad.json   # V1
│   ├── kit/   style-kit.json · stats.json · modules/ · hulls/ · assemblies/
│   ├── outpost/ style-outpost.json · buildings/ · plots/ · assemblies/
│   ├── grid/  grid-kit.json · modules/ · hulls/ · assemblies/
│   └── briefs/ax02-mixte.brief.txt
├── src/
│   ├── geom.py spec.py project.py blueprint.py factory.py sheets.py   # V1 (pur Python)
│   ├── blender_bridge.py bake_textures.py kit_web_glb.py               # Blender (partagés KX/OX)
│   ├── viewer_assets.py godot_check.gd                                # V1
│   ├── kit_core.py kit_parts.py kit_modules.py kit_hulls.py kit_sheet.py kit_project.py
│   │   kit_build.py kit_viewer_assets.py kit_config_data.py            # KX
│   ├── ox_core.py ox_parts.py ox_buildings.py ox_plots.py ox_sheet.py
│   │   ox_build.py ox_viewer_assets.py                                 # OX
│   ├── grid/  gx_core gx_parts gx_hulls gx_build gx_raster gx_blender gx_quantize gx_finalize
│   ├── chain/ brief_to_spec chain_blender chain_gameplay chain_tscn chain_qa chain_sheet chain_site
│   └── handoff/build_context.py     # génère viewer/context.json + viewer/index.html (rendu de handoff.md)
│       handoff/home.template.html  # gabarit de l'accueil (préambule IA, nav, visionneuse)
├── tools/   kit_lint.py ox_lint.py grid_lint.py kit_cinematic_renders.py
│            test-viewer.mjs test-kit.mjs test-kit-config.mjs test-kit-nav.mjs
│            test-chain.mjs test-outpost.mjs test-grid.mjs test-factory-home.mjs check-factory-text.py
├── viewer/  # = ce qui est publié sous /factory/
│   ├── index.html viewer.js viewer.css handoff.md llms.txt context.json
│   ├── vendor/three/ (r170, vendorisé, dont le décodeur Draco)
│   ├── assets/ (models, plans, kit, grid, referential, buildings.json)
│   ├── kit/ (index, kit.js, kx3d.js, kxrules.js, kgltf.js, configurator/, variants/)
│   ├── chain/  outpost/  grid/  referential/
├── docs/    planches, captures, README par kit (kit/, outpost/, grid/, chain/), handoff/
└── build/   sorties (une partie est suivie : manifestes, lint, modèles ; mesh/logs/web ignorés)

Outils externes : Blender 5.2 (variable BLENDER, binaire local), xvfb-run, Python 3 avec cairosvg, Pillow et numpy, Godot 4.7.2 (optionnel, pour le contrôle d'import), Node et Playwright avec Chrome et SwiftShader pour les tests.

8. Principes de conception transverses

  1. La spec est la source de vérité.
    • Le SVG est une sortie inspectable, écrasée à chaque build : il ne faut pas l'éditer.
    • src/geom.py (pur Python) construit les maillages. Le SVG est une projection orthogonale de ces mêmes sommets, et Blender fait from_pydata avec eux aussi.
  2. Triple vérification des cotes :
    • bbox de chaque pièce dans Blender contre le manifeste (tolérance 0,1 mm) ;
    • bbox du GLB réimporté (1 mm) ;
    • import Godot (tailles et triangles).
    • Le build échoue si une pièce passe sous le sol.
  3. Dessin technique :
    • projection du 3e dièdre : dessus au-dessus de la face, profil droit à droite, même échelle, lignes de rappel ;
    • calques Inkscape et attribut data-part sur chaque pièce ;
    • échelle automatique de 1:20 à 1:200, silhouette humaine de 1,80 m, cartouche avec le sha256 de la spec.
  4. Repère : mètres, Z en haut, origine au sol au centre du socle, façade vers −Y (V1). L'export glTF est en Y-up. Dans three.js, un point du kit devient position (x, z, −y), avec rotation.y = rotZ.
  5. Ressemblance par construction : tous les objets d'un kit sont bâtis avec les mêmes sous-composants et les mêmes métriques, et un lint le vérifie. Les détails A et B du coin KX sont identiques d'un module à l'autre.
  6. Les coques et parcelles ont des slots vides. Elles ne dessinent jamais de module ni de bâtiment, seulement les interfaces. Le lint vérifie qu'aucune pièce de module n'apparaît dans un blueprint de coque.
  7. Un assemblage, ce sont des données, pas un nouveau blueprint : {slot, module, rot} (et links pour OX). Le build compose le maillage, et la visionneuse compose la même chose dans le navigateur à partir des GLB de la coque et des modules.
  8. Héritage sans copie :
    • OX étend KX ("extends": "specs/kit/style-kit.json") : le code lit les valeurs héritées dans la source unique (src/kit_core.py, objet S).
    • GX dérive ses métriques de KX (g = U/2) et le lint vérifie le lien.
  9. Déterminisme : le brief → spec suit des règles fixes, sans IA. Les variantes passent par generate(seed) (mulberry32) et l'usure par une seed. Mêmes entrées, mêmes sorties.
  10. Sobriété web : Draco plus textures JPEG, filaire calculé dans le navigateur, faces cachées retirées des SVG, un seul décodeur Draco partagé.

9. V1 : bâtiments de colonie (spec → SVG → 3D)

IDBâtimentEmprise (tuiles de 2 m)Hors-tout (m)PiècesTriangles
habitat_sModule habitat S : coque Ø2,80, sas, porte de 0,90 × 2,00, 4 hublots2×23,92 × 3,92 × 4,68322 404
command_hqQG sur 2 niveaux, PC vitré, terrasse, mât comms, radôme3×35,92 × 5,92 × 7,57572 642
landing_padAire 3×3 : piste, cercle, H, 12 feux, 2 mâts balise3×35,92 × 5,92 × 2,27131 180

10. Kit KX : cargo spatial modulaire

Source : specs/kit/style-kit.json (version 1.0). Doc détaillée : docs/kit/README.md. Page : /factory/kit/.

10.1 Métriques imposées

10.2 Contenu

Composants (14) : src/kit_parts.py

CodeNomTriangles
RVTRangée de rivets108
BVLProfil biseauté28
PNLPlaque de bordé228
RIBNervure de renfort252
KXCPièce de coin KX104
KXLVerrou tournant KX224
KXBBras de serrage KX268
UMBPrise ombilicale KX376
IFPPlaque d'interface de slot2 076
VNTGrille d'aération200
RNGPoignée / échelon200
BCNFeu balise162
PIPRaccord de tuyauterie480
DORPorte cargo1 168

Modules (5) : specs/kit/modules/*.json → src/kit_modules.py

CodeNomClasseCorpsTriangles
KX-LIQModule citerneC1tank5 430
KX-BOXModule conteneur secC1box11 200
KX-OREModule vrac mineraiC1hopper5 164
KX-CRYModule cryogéniqueC1cryo8 456
KX-BIOModule vivariumC2vivarium16 880

Tous les modules partagent le même châssis : 8 KXC, 12 lisses BVL rivetées, un plancher, une UMB mâle dessous, une bande code et un ID. Seul le corps change.

Coques (3), toutes à slots vides : specs/kit/hulls/*.json → src/kit_hulls.py

CodeNomDisposition des slotsTuyèresTriangles
HX-SCoque caboteur1 colonne : C1, C1216 924
HX-MCoque cargo moyen2 colonnes × 3 rangs de C1 (6 slots)332 744
HX-LCoque long-courrier1 colonne : C2 / C1 / C1 / C2 / C1241 076

La planche d'une coque montre le dessus, l'élévation et le profil, la coupe A-A (quille, poste, propulsion) et la coupe B-B à travers un slot.

Assemblages (4) : specs/kit/assemblies/*.json

CodeNomCoqueRemplissageTriangles
AX-01Caboteur citerne + fretHX-SS1 LIQ, S2 BOX (180°)33 554
AX-02Cargo moyen mixteHX-MS1–S2 CRY, S3 BOX, S4 LIQ (180°), S5 ORE, S6 ORE (180°)76 614
AX-03Minéralier partielHX-MS1 LIQ, S2 vide, S3–S6 ORE (en alternant 0° et 180°)58 830
AX-04Long-courrier vivariumHX-LS1 BIO (C2), S2 CRY, S3 BOX, S4 = 2 × LIQ (a, b), S5 CRY96 928

Repère des assemblages : +x vers l'avant, +z vers le haut. y < 0 est tribord, y > 0 bâbord. S1 = avant tribord, S2 = avant bâbord, et ainsi de suite.

10.3 Lint KX (tools/kit_lint.py, 119 contrôles)

GroupeCe qui est vérifié
charteU = 5u, slots sur la grille, C2 = 2 × C1 + nervure
rivets / biseaux / grillepas, marges, série de biseaux à 45°, enveloppes sur u
interface8 coins par module, verrous et bras alignés
slots videsaucun module dans un blueprint de coque
assemblagecoins, verrous, bras et ombilicales à 1 mm près
lienschaque composant est utilisé, chaque module loge dans au moins une coque
configurateurstats complètes, AX-01..04 dans les budgets, missions, config.json à jour
paletteaucun vert dans les SVG, la visionneuse, la charte, stats.json et les matériaux Blender

Résultat vérifié le 10/11 au soir : KIT_LINT OK 119/119. Le lint écrit dans build/kit/lint.json, un fichier suivi par git (voir §21).

10.4 Rendus

Dix rendus sont décrits dans docs/kit/renders/README.md : des originaux Blender Cycles en 1920×1080 et des passes cinématiques IA en 1280×720.

11. Configurateur et galerie de variantes KX

11.1 Configurateur (/factory/kit/configurator/)

11.2 Galerie de variantes (/factory/kit/variants/)

generate(seed) est déterministe (mulberry32) et procède ainsi :

  1. Tirage d'une coque pondérée (S 3, M 4, L 3).
  2. Tirage d'une mission : Citernier, Vraquier, Frigorifique, Mixte ou Bétailler. Elle pondère les denrées.
  3. Remplissage des slots :
    • chaque slot reste vide avec p = 0,12 ;
    • un C2 reçoit un BIO avec p = 0,8 en Bétailler et 0,15 sinon, et 2 × C1 dans les autres cas.
  4. Rotation de 180° avec p = 0,4.
  5. Habillage.
  6. Correction des budgets : le module fautif est remplacé par une denrée plus légère, ou le slot est vidé.

Le résultat :

Mémoire : la galerie rend 20 vignettes 3D. Depuis 2700872, viewer/kit/kgltf.js fournit un chargeur GLB partagé (un seul DRACOLoader, 1 worker wasm, cache, file d'attente). Il libère le renderer et le décodeur à la navigation. Un échec de chargement affiche l'erreur au lieu d'un « Chargement… » qui reste bloqué.

12. Chaîne factory en 9 étapes

Page : /factory/chain/, sur AX-02 « Cargo moyen mixte ». Les 9 étapes sont toutes réelles depuis 8c6bb9c. Doc : docs/chain/README.md. Planche : docs/chain/chain-9-steps.png.

#ÉtapeScript / commandeArtefact
1Briefspecs/briefs/ax02-mixte.brief.txt (texte « clé : valeur »)brief
2Spec JSONpython3 src/chain/brief_to_spec.py specs/briefs/ax02-mixte.brief.txt --check specs/kit/assemblies/asm_mixte.json (règles fixes, sans IA)build/chain/ax02-mixte.spec.json, identique à asm_mixte.json
3Blockoutxvfb-run -a $BLENDER --background --python src/chain/chain_blender.py -- --pass blockout --out build/chain --seed 4471volumes issus du manifeste, grille U
4Plan SVGpython3 src/kit_build.pybuild/kit/blueprints/asm_mixte.svg
5Kitbash 3Dsrc/blender_bridge.py (via ./build-kit.sh)rendus plein, filaire et texturé
6Usurechain_blender.py --pass wear --seed 4471bruit + AO, chocs Voronoï, pochoirs série et slot
7Bake--pass ao_bake (AO 512² sur l'atlas de hull_m_tex.glb), bake_textures.py (normales), --pass id_bake (carte ID, EMIT 1024²)cartes, atlas, id_legend.json
8QApython3 src/chain/chain_qa.pykit_lint.py, plafonds de triangles, brief ≡ spec, gameplay vs configurateur, symétrie de coque (98,6 % de pièces miroir), aucun vert dans les rendus
9Export Godotpython3 src/chain/chain_gameplay.py && python3 src/chain/chain_tscn.py, puis Godot headless --import et -s check.gdasm_mixte.tscn (9 collisions, 6 ancres Marker3D) et asm_mixte.gameplay.json. Contrôle : TSCN_OK AX-02 meshes=1 collisions=9 ancres=6 masse_t=102.5 cout_cr=18200

Fin de chaîne :

Les artefacts de chaque étape sont publics sous /factory/chain/artifacts/ : brief, spec, style-kit.json, hull_m.json, .tscn, fiche gameplay, rapport QA, cartes cuites…

Format du brief (extrait réel) :

code       : AX-02
nom        : Cargo moyen mixte
rôle       : cargo
gabarit    : moyen
slots      : 6 × C1
cargaison  : 2 cryo, 1 sec, 1 liquide, 2 minerai
placement  : avant → arrière, tribord puis bâbord
retourner  : liquide, minerai @ bâbord
ton        : lisible de loin, châssis KX commun, interface jaune visible, usure modérée
usure_seed : 4471

13. Kit OX : avant-poste minier sur astéroïde

Source : specs/outpost/style-outpost.json (version 0.1, extends KX). Doc : docs/outpost/README.md. Page : /factory/outpost/.

13.1 Héritage KX, sans copie

OX reprend de KX la grille U/u, les rivets, les biseaux, le bordé, le cadre, les marquages, les traits, la typo et la palette. Il hérite aussi de 10 composants KX : RVT, BVL, RIB, KXC, UMB, VNT, RNG, BCN, PIP et DOR.

13.2 Métriques propres à OX

13.3 Contenu

Un assemblage contient fill ({slot, sub, building, rot}) et links ([slotA, portA, slotB, portB]). Le build route chaque tube entre les brides. Il produit l'assemblage complet, plus un lnk_* qui ne contient que les tubes et les tréteaux.

13.4 Lint OX (tools/ox_lint.py, 150 contrôles)

Il vérifie :

Vérifié le 10/11 au soir : OX_LINT OK 150/150.

14. Kit GX : grille voxel pour pixel art

Source : specs/grid/grid-kit.json (version 0.1). Doc : docs/grid/README.md. Page : /factory/grid/.

14.1 Charte

14.2 Contenu

14.3 Méthodes comparées et verdict

MéthodePrincipeRésultat
A : raster voxel direct (src/grid/gx_raster.py)Projection 2:1 entière : chaque voxel est un tampon de 12 px. Peintre vectorisé numpy, plus le contourPNG indexé natif, lignes 2:1 parfaites, rivets à 1 px, 4 directions + 3/4, normales et profondeur. 27 objets en environ 2 s
A · G4Même raster sur la grille divisée par 2Bon LOD lointain (icônes, carte). Les rivets et les joints sont perdus, les coins conservés
B : Blender (gx_blender.py + gx_quantize.py)Faces voxel en ortho, Workbench FLAT sans AA, puis quantification palette8 directions (45°). Environ 82 % de pixels exacts, escaliers irréguliers, pas de rivets
B′ : maillage lisse KXGLB KX rendu en basse résolution, puis quantifié0 % de pixels exacts (écart d'environ 11). Un modèle lisse ne devient pas du pixel art lisible
C : pixel en direct (visionneuse)three.js rendu à 1/2 ou 1/4 de résolution, au plus proche voisinUtile pour cadrer. Scintille en rotation, pas de contour

Verdict, qui sert de décision :

14.4 Lint et limites

15. Référentiel IA

Page : /factory/referential/, une grille 3 × 2.

16. Formats de fichiers et schémas

Toutes les specs sont du JSON UTF-8. Les clés _doc et _rule sont des commentaires lus par les humains et les agents.

16.1 Spec bâtiment V1 (specs/<id>.json)

{ "id": "habitat_s", "name": "Module habitat S", "code": "HAB-S", "tiles": [2, 2], "description": "…",
  "parts": [ { "id": "hull", "label": "Coque pressurisée Ø2.80", "layer": "structure", "mat": "panel",
               "prims": [ { "type": "cylinder", "r": 1.40, "h": 2.60, "at": [0, 0.30, 0.45] } ] } ],
  "dims": [ … ], "levels": [ … ], "decals": [ … ] }

16.2 Charte KX (specs/kit/style-kit.json)

Clés de premier niveau :

16.3 Module KX (specs/kit/modules/<id>.json)

{"id": "mod_liq", "code": "KX-LIQ", "name": "Module citerne", "cls": "C1", "body": "tank", "cargo": "LIQ",
 "goods": "Liquides : eau, carburant, solvants", "description": "…"}

16.4 Coque KX (specs/kit/hulls/<id>.json)

{"id": "hull_m", "code": "HX-M", "name": "Coque cargo moyen", "description": "…",
 "rows": [["C1", "C1"], ["C1", "C1"], ["C1", "C1"]], "fore_len": 5.0, "aft_len": 3.4, "keel_h": 1.60, "engines": 3, "skid_h": 1.00}

rows liste les rangs de l'avant vers l'arrière. Chaque rang contient une ou deux colonnes (tribord puis bâbord). Les slots sont numérotés S1, S2… dans cet ordre.

16.5 Assemblage KX (specs/kit/assemblies/<id>.json), qui est aussi le format d'export du configurateur

{"id": "asm_mixte", "code": "AX-02", "name": "Cargo moyen mixte", "hull": "hull_m", "description": "…",
 "fill": [{"slot": "S1", "module": "mod_cryo"}, {"slot": "S4", "module": "mod_liq", "rot": 180}]}

16.6 Stats gameplay KX (specs/kit/stats.json)

16.7 Charte OX (specs/outpost/style-outpost.json)

16.8 Bâtiment, parcelle et assemblage OX

{"id": "bld_hab", "code": "OX-HAB", "name": "Habitat pressurisé", "cls": "F1", "body": "habitat", "family": "VIE", "ports": ["E", "W", "N"], "role": "…", "description": "…"}
{"id": "plot_m", "code": "PX-M", "name": "Parcelle d'exploitation", "seed": 23, "craters": 5, "rocks": 30,
 "slots": [{"id": "S1", "cls": "F1", "node": [0, 0]}, {"id": "S4", "cls": "F2", "node": [0, 1]}]}
{"id": "oa_exploitation", "code": "OA-02", "plot": "plot_m",
 "fill": [{"slot": "S1", "building": "bld_drl", "rot": 180}], "links": [["S1", "W", "S2", "W"], ["S2", "N", "S4", "Sa"]]}

16.9 Charte et objets GX

16.10 Sorties de build communes

FichierContenu
build/<kit>/blueprints/<id>.svgPlanche A3 (calques, data-part)
build/<kit>/manifest/<id>.dims.jsonToutes les cotes, bbox par pièce, triangles
build/<kit>/mesh/<id>.mesh.jsonSommets et faces, les mêmes que le SVG (non suivi par git)
build/<kit>/models/<id>.glb, <id>_tex.glbGLB plein et texturé
build/<kit>/web/*.glbGLB web (Draco + JPEG), copiés dans viewer/…
build/<kit>/lint.jsonRésultat du lint ({ok, items[{group, check, ok, detail}]})
viewer/assets/kit/kit.json, viewer/outpost/data/ox.json, viewer/assets/grid/grid.jsonCatalogues lus par les visionneuses : style, objets, triangles, lint

17. Commandes : build, lint, tests, export

À lancer depuis la racine du dépôt blueprint-factory/. BLENDER vaut par défaut le binaire Blender 5.2 local.

# V1
./build.sh                         # 3 bâtiments : SVG, Blender, bake, assets visionneuse, Godot (≈ 2 min 25)
./build.sh specs/habitat_s.json    # un seul bâtiment
python3 src/factory.py specs/*.json   # SVG + manifestes seuls (< 1 s)

# Kits
./build-kit.sh       ; FAST=1 ./build-kit.sh       # KX (FAST = sans Blender)
./build-outpost.sh   ; FAST=1 ./build-outpost.sh   # OX
./build-grid.sh      ; FAST=1 ./build-grid.sh      # GX (≈ 25–50 s complet)
python3 src/kit_config_data.py                     # stats, presets, ancres → viewer/assets/kit/config.json

# Lints (rapides, sans Blender)
python3 tools/kit_lint.py    # → build/kit/lint.json      (attendu : KIT_LINT OK 119/119)
python3 tools/ox_lint.py     # → build/outpost/lint.json  (attendu : OX_LINT OK 150/150)
python3 tools/grid_lint.py   # → build/grid/lint.json     (attendu : [gx-lint] 107/107)
python3 src/chain/chain_qa.py   # QA de la chaîne AX-02 (attendu : CHAIN_QA OK)

# Ce handoff
python3 src/handoff/build_context.py   # régénère viewer/context.json et viewer/index.html (handoff.md rendu en HTML)
python3 src/handoff/build_context.py --check   # échoue si context.json ou index.html n'est pas à jour
PYTHONPATH=/tmp/pylib python3 tools/check-factory-text.py <url-factory>   # lecture « comme un LLM » via html2text : 27/27 sections

17.1 Tests navigateur (Playwright headless, Chrome et SwiftShader)

On sert viewer/ (ou un site qui contient factory/) en HTTP local, puis on lance :

python3 -m http.server 8782 -d viewer &
node tools/test-viewer.mjs      http://127.0.0.1:8782/ docs        # accueil V1 : rotation, modes, captures
node tools/test-kit.mjs         http://127.0.0.1:8782/ docs/kit    # 4 niveaux KX, modes, coupe, éclaté
node tools/test-kit-config.mjs  http://127.0.0.1:8782/ docs/kit    # configurateur + galerie (28 contrôles)
node tools/test-kit-nav.mjs     http://127.0.0.1:8782/             # stress mémoire galerie → configurateur
node tools/test-outpost.mjs     http://127.0.0.1:8782/ docs/outpost
node tools/test-grid.mjs        http://127.0.0.1:8782/ docs/grid
node tools/test-chain.mjs       http://127.0.0.1:8782/chain/       # 10 images, liens d'artefacts en 200
node tools/test-factory-home.mjs http://127.0.0.1:8782/            # accueil v2 : source statique (27 h2), sans JS, ancres, liens, fichiers

17.2 Export Blender, GLB et Draco

  1. Contrôle et export : src/blender_bridge.py (Blender headless sous xvfb-run) vérifie chaque pièce contre le manifeste, puis exporte <id>.glb, .fbx, _wire.glb (glTF LINES) et les rendus filaire, plein et texturé.
  2. Textures : src/bake_textures.py cuit les textures PBR (atlas de 512 pour les composants, 1024 pour les modules et bâtiments, 2048 pour les coques et parcelles) dans <id>_tex.glb.
  3. Web : src/kit_web_glb.py produit les GLB web avec compression Draco, et des textures JPEG pour les _tex (option --jpeg).
  4. Visionneuses : elles décodent avec le DRACOLoader de three r170 vendorisé, via le chargeur partagé viewer/kit/kgltf.js.
  5. Godot : src/godot_check.gd (V1) et build/chain/godot/check.gd (chaîne) contrôlent l'import dans Godot 4.7.2 headless.

18. Palette : jamais de vert

RôleHex
Fond#0a1a33
Encre#eef7ff
Cyan (traits)#62d6ff
Marquage#ffad5c
Slot (orange)#ff9a3c
Coupe#ff6f61
Coque#c9ccd2
Cadre#3a3f4a
Tôle#9aa3b0
Interface (jaune)#f2b705
Roche / encrassement#4a3f36

19. Budgets triangles et poids web

20. Données gameplay

Définitions :

Modules :

ModuleTare + charge (t)CapacitéÉnergieCoût (cr)
KX-LIQ2,2 + 88 000 L0,5 kW700
KX-BOX2,4 + 610 m³0900
KX-ORE3,1 + 146 m³0500
KX-CRY3,4 + 4,56,5 m³6 kW1 800
KX-BIO (C2)6,8 + 722 m³9 kW3 200

Coques :

CoqueÀ videCharge utile maxÉnergieÉquipageCoût (cr)
HX-S18 t24 t8 kW27 000
HX-M34 t80 t16 kW312 000
HX-L46 t90 t24 kW419 000

Fiche AX-02 (chaîne, étape 9) : capacité 43,1 m³ · charge 51,0 t · masse 102,5 t · coût 18 200 cr.

Assemblages selon la règle du configurateur (recalculés depuis stats.json pour ce document) :

AXMasseCharge utile / maxÉnergie / maxCoût
AX-0136,6 t18,6 / 24 t0,5 / 8 kW8 600 cr
AX-02102,6 t68,6 / 80 t12,5 / 16 kW18 200 cr
AX-03112,6 t78,6 / 80 t (98 %)0,5 / 16 kW14 700 cr
AX-04104,4 t58,4 / 90 t22 / 24 kW28 100 cr

AX-02 pèse 102,6 t selon le configurateur et 102,5 t selon la chaîne : l'écart vient des deux modes de calcul (forfait d'un côté, volume × densité de l'autre). Il est voulu et contrôlé.

Les budgets sont de vraies contraintes de jeu : 6 × ORE sur HX-M (102,6 t de charge) est refusé, tout comme 2 × CRY sur HX-S (12 kW).

21. Problèmes connus

#ProblèmeDétail / causePiste
1Le badge du kit affiche « LINT 110/110 » alors que le vrai chiffre est 119/119viewer/kit/kit.js lit kit.lint dans viewer/assets/kit/kit.json, qui embarque build/kit/lint.json au moment de sa génération par src/kit_viewer_assets.py. Ce kit.json date d'avant l'ajout des 9 contrôles du configurateurAttention : kit_viewer_assets.py ne garde les clés glb/tex que si build/kit/web/ existe, or ce dossier n'est pas suivi par git. Il faut donc soit lancer ./build-kit.sh en entier, soit remplacer seulement la clé lint de kit.json par le contenu de build/kit/lint.json. Ensuite, livrer un overlay qui ne contient que factory/assets/kit/kit.json
2Usure peu visible en vue d'ensembleLes niveaux d'usure 1 à 3 du configurateur et l'usure de la chaîne se voient de près, mais très peu à la distance de vue d'ensemblePlus de contraste ou d'échelle sur les taches et l'écaillage, ou un niveau par défaut plus marqué
3Mémoire Draco (OOM) : corrigé dans 2700872Ouvrir le configurateur depuis la galerie, dans le même onglet, provoquait « RuntimeError: Aborted(out of memory) », parce que 20 vignettes laissaient le worker wasm et les renderers en mémoireIl faut garder kgltf.js (un seul DRACOLoader) et appeler dispose* à la navigation. Test : tools/test-kit-nav.mjs
4Cache navigateur sur /factory/*Après une mise en ligne, un navigateur qui a déjà visité la page peut garder l'ancien JSDemander un rechargement forcé (Ctrl+Maj+R). Sinon, versionner les URL des scripts [piste, non faite]
5launcher/scripts/add-factory.sh est dangereux pour la prodIl fait rm -rf site/factory, ne recopie que index.html, viewer.*, vendor/ et assets/, ce qui effacerait kit, chaîne, avant-poste, grille et référentiel. En mode --overlay, il embarque aussi le CaddyfileNe pas l'utiliser pour livrer. Il faut des overlays fichier par fichier. À réécrire en mode additif
6OX n'a pas de budget trianglesstyle-outpost.json n'a pas de budget, et chain_qa ne contrôle que les 26 objets KX. OA-03 compte 143 872 tris, PX-L 40 234Décider d'un plafond OX (question ouverte)
7build/kit/lint.json est suivi par git et réécrit par chaque lintLe compteur de fichiers scannés par la palette varie (43 → 44 fichiers depuis l'ajout de kgltf.js), ce qui laisse un diff parasitegit checkout build/kit/lint.json après un lint de vérification, ou committer volontairement
8Dépôt sans remoteLe dépôt git n'existe que sur la machine de travail du propriétaireDemander au propriétaire comment accéder au dépôt. À défaut, partir des fichiers publics (§26)
9Incohérence historique d'overlayL'overlay du référentiel utilisait le préfixe factory/… au lieu de launcher/site/factory/…Toujours utiliser launcher/site/…
10Le viewer/index.html du dépôt était en retard sur la prodLes 5 liens de nav (Configurateur, Variantes, Chaîne, Avant-poste, Kit GX) avaient été ajoutés directement dans la version en ligne. Ils sont réintégrés depuis 8b7432b. L'accueil est désormais généré, il ne faut plus l'éditer à la mainToujours repartir du fichier en ligne avant de modifier l'accueil
11Carte de normales GXElle contient des teintes cyan-vert (encodage standard)Exception technique documentée, à ne pas afficher comme art
12Limites V1 et chaînePas de booléens (ouvertures en saillie) ; le SVG n'est qu'une sortie ; collisions et ancres Godot seulement pour AX-02 ; UV smart project peu optimiséesVoir §23
13Dossiers non suivisbuild/chain/ et build/grid/ sont des sorties régénérables, non suivies et non ignoréesLes ajouter au .gitignore ou les committer, au choix

22. Journal des décisions

#DécisionJustification
D1La spec JSON est la source de vérité, et le SVG une sortieParser un SVG en 3D est fragile. La spec est lisible, diffable et éditable par une IA
D2Les mêmes sommets servent au SVG et à Blender, avec une triple vérification des cotesLa précision était le but de la V1 : les cotes du plan sont égales aux dimensions du GLB par construction
D3Projection du 3e dièdre, calques Inkscape, data-partPour se lire comme un dessin technique et rester inspectable
D4Repère en m, Z-up, export Y-up, grille colonie de 2 m et socle de 0,30Compatibilité avec le kit colonie et Godot
D5Aucun vert, éclairage neutre ou froidCharte du propriétaire. Corrige aussi le rendu « tout brun » du kit colonie
D6habitat_s passe à 2×2 tuilesÀ l'échelle humaine réelle (porte de 2,00, plafond d'environ 2,3 m), il ne tient pas sur 2 × 2 m
D7Charte mesurée et composants communs, vérifiés par un lint (KX)Faire ressembler des objets différents par construction, pas à l'œil
D8Coques à slots vides ; assemblage = donnéesSéparer le contenant du contenu, réutiliser les GLB et composer côté client
D9Filaire côté client, Draco + JPEG, occlusion des SVGServeur à 2 vCPU sans GPU : poids divisé, rendu identique
D10Les rendus Blender priment quand le rendu IA dévieFidélité au référentiel (vue éclatée, slots vides)
D11OX étend KX sans copier ; la couleur dépend de la familleSi KX change, OX suit. Aucune nouvelle couleur
D12GX : g = U/2, méthode A, B seulement pour 8 directions, G4 pour le lointain et les icônesComparaison mesurée : A donne un pixel exact, B′ lisse donne 0 %
D13Brief → spec sans IA, par règles fixesDéterminisme et vérification brief ≡ spec
D14Densités choisies pour retrouver les charges du configurateurUn seul jeu de chiffres gameplay, avec un écart ≤ 0,37 %
D15Variantes avec generate(seed) mulberry32, et correction plutôt que rejetReproductibilité, et 100 % des variantes valides
D16Un seul DRACOLoader partagé, dispose à la navigationCorrectif de l'OOM galerie → configurateur
D17Déploiement par overlays appliqués par un opérateur, jamais par le build-site.sh complet ni par le CaddyfileLes builds de POC manquent, donc le build complet échoue. Il faut aussi isoler les risques et garder des sauvegardes côté opérateur
D18Godot 4.7.2 comme moteur cible, Unreal excluDécision du propriétaire (« oublie Unreal Engine »)
D19Le handoff vit sur la page publique (handoff.md, llms.txt, context.json)Demande du propriétaire : l'agent entrant reçoit /factory/ comme point d'entrée

23. Questions ouvertes et prochaines étapes

Questions ouvertes (à trancher avec le propriétaire) :

  1. Quel jeu consomme les kits ? Deep City (2D vue de dessus), un colony builder, un jeu spatial ? [non décidé]
  2. Faut-il retenir la 3D ou le pixel art ? GX reste une exploration, et le verdict A ne porte que sur la méthode de rendu.
  3. Quel budget de triangles pour OX (OA-03 à 143 872) ?
  4. Faut-il une édition inverse (SVG annoté → patch de spec) ou un éditeur web de spec avec aperçu SVG en direct ?
  5. Faut-il étendre la chaîne en 9 étapes à tous les AX, aux OA, et à GX ?
  6. Comment l'agent entrant accède-t-il au dépôt (remote) ?

Prochaines étapes suggérées, triées du moins cher au plus cher :

  1. Corriger le badge LINT du kit (régénérer kit.json, overlay d'un fichier).
  2. Rendre l'usure lisible en vue d'ensemble.
  3. Rendre add-factory.sh additif, sans rm -rf ni Caddyfile, ou le marquer « dev seulement ».
  4. Versionner les URL des JS des visionneuses pour éviter les problèmes de cache.
  5. Ajouter un budget OX et le contrôler dans ox_lint.
  6. Généraliser l'export Godot .tscn (collisions, ancres Marker3D) aux 4 AX et 3 OA.
  7. GX : retoucher les 8 directions B, étendre GX à OX (bâtiments voxel), viser des sprites plus petits en G4.
  8. Ajouter des booléens (ouvertures percées), des LOD, et des UV mieux dépliées que le smart project.
  9. Migrer le reste du kit colonie (23 bâtiments poc-blender) spec par spec.

24. Conventions de travail pour un agent

25. Contexte : Deep City

Ce projet est distinct de la factory et n'est donné ici que comme contexte. Deep City est un hybride action-RPG en vue de dessus et jeu de gestion : un donjon (ennemis, coffres, loot) et une ville (étal de marché, vente). La version de référence est en Godot 4.7.2 (GL Compatibility, export web sans threads), avec du pixel art procédural sans vert.

VersionLienCommitContenu
v0.1 MVP/play/deep-city/60d370aMarché du Puits, donjon Les Profondeurs, loot et vente, pierre ancienne et 3 cinématiques (météore, dragon, séisme)
v0.2/play/deep-city-v2/244c82e3 étages (Profondeurs, Galeries, Cœur de pierre), 10 nouvelles créatures, loot par étage
v0.3 « Deep Colony : Kepler-Ombre »/play/deep-city-v3/6eb99f4Reskin sur planète alien : ciel violet, deux soleils, faune bioluminescente, 3 biomes, jauge d'O₂ et poches d'air, comptoir à 3 marchands, monolithe xéno

26. Données publiques lisibles par machine

Tout ceci est servi sous https://kg.g.caute.re/factory/ et peut remplacer l'accès au dépôt pour se faire une idée :

URLContenu
context.jsonInventaire de ce handoff : kits, objets, chemins des specs, URL, commits, métriques, problèmes
chain/artifacts/style-kit.jsonCharte KX complète, avec budgets et gameplay
chain/artifacts/asm_mixte.json, hull_m.json, ax02-mixte.brief.txt, ax02-mixte.spec.jsonSpec AX-02, coque, brief et spec générée
chain/artifacts/asm_mixte.gameplay.json, asm_mixte.tscn, qa_report.txt, kit_lint.txt, id_legend.json, wear_seed.jsonSorties des étapes 6 à 9
assets/kit/kit.jsonCatalogue KX (style, objets, triangles, lint, avec le badge en retard)
assets/kit/config.jsonStats, presets AX, coûts, ancres d'habillage
outpost/data/ox.jsonCatalogue OX (style OX et KX, objets, triangles, lint)
assets/grid/grid.json, assets/grid/gx_palette.gpl, gx_palette.hexCatalogue GX, spec et palette
assets/buildings.jsonBâtiments V1
assets/kit/models/, outpost/data/models/, assets/models/GLB (Draco pour les kits)
assets/kit/svg/, outpost/data/svg/, assets/plans/Planches SVG

27. Ce qui n'a pas pu être confirmé

Visionneuse 3D V1

Pour les humains : 3 bâtiments en filaire, plein ou texturé, avec leur plan SVG. Cette section n'ajoute aucun contexte.
Chargement…