# STAT-01 — Atelier d’argile et modèles 3D — beta.106 Contrat du 17 septembre 2026, branche `codex/statuary-import-beta106`. Livraison locale vérifiée, cycle natif et archives normale/Test validés. Aucune publication ni installation personnelle. ## Parcours retenu avec le créateur Un seul dossier utilisateur : `schematics/sanctuary/`. La lecture historique au premier niveau de `schematics/` reste possible, sans déplacement de fichiers. Les boutons des deux ateliers ouvrent exactement le même dossier. - **Métabli → Bibliothèque** : schémas `.litematic`, `.schem`, `.nbt` et `.schematic` historiques, avec leurs règles d’import existantes. - **Métabli → Statues → Mes modèles 3D** : modèles GLB, hauteur 4–96 blocs et palette. La conversion produit un plan et rejoint les commandes K, matériaux, export et règles de placement créatif/survie existants. Les statues des créatures découvertes gardent leur accès habituel. - **Atelier d’argile** (`sanctuary:clay_workshop`) : choix du GLB et aperçu à proportions conservées, limité à 16 × 16 × 16 voxels dans un seul bloc. Un emplacement reçoit l’argile, l’autre fournit la statue. **Un bloc d’argile est consommé pour chaque statue récupérée**, y compris en créatif. Les blocs d’argile normale conservent les couleurs du modèle ; les seize argiles Sanctuary imposent leur couleur unie. Ni boule d’argile ni terre cuite n’est acceptée. Fermer l’atelier restitue l’argile non consommée. Recette de l’atelier : un bloc d’argile au centre supérieur, trois dalles de pierre lisse au milieu, trois planches en bas. Le bloc utilise les textures actives de planches, argile et pierre lisse. Le résultat, **Statuaire** (`sanctuary:statuary`), est un objet transportable et posable. Sa miniature se voit dans l’inventaire et le monde. Il n’ouvre pas un éditeur lorsqu’on le pose. Le fichier se choisit dans la liste ou par dépôt sur l’écran de l’atelier. « Actualiser » relit le dossier. La rotation proposée à l’atelier d’argile est un quart de tour. Il n’y a pas d’éditeur de sommets ou d’animations. ## Identité des modèles et sauvegardes — contrat préalable Les identifiants des anciens blocs, formats et générations restent inchangés. Les nouveaux blocs n’apparaissent que par fabrication ou placement volontaire. Aucun monde personnel n’est ouvert et aucun chunk existant n’est régénéré. Chaque GLB reçoit un identifiant `sanctuary:model/`. Renommer ou déplacer un fichier ne change pas cet identifiant. Réexporter avec un contenu binaire différent produit un nouvel identifiant. Les différentes argiles et rotations du même modèle conservent l’identité de la source. Il s’agit d’une identité de modèle dans les données, et non d’un nouvel identifiant de bloc enregistré pour chaque import. Elle ne donne aucun droit serveur et ne désigne ni une URL ni un chemin à ouvrir. Le statuaire a une BlockEntity dédiée avec un champ `sculpture`, schéma **1** : nom, identifiant du modèle, dimensions et couples position/couleur ARGB des voxels. La position est bornée à 16³, la couleur opaque, les doublons refusés. L’objet transporte ces données dans son composant natif de bloc ; pose, butin, repose et sauvegarde utilisent le cycle Minecraft. Le bloc réplique les données aux clients qui chargent son chunk. Aucun joueur n’a besoin du fichier source pour voir une statue déjà fabriquée. Un schéma inconnu ou invalide chargé dans un bloc est préservé sans être interprété ni édité. L’atelier utilise un menu natif temporaire, sans stock caché persistant. Le serveur vérifie le menu actif, son jeton, la proximité, le bloc, les droits et le veto d’utilisation Fabric. La sélection envoie seulement des voxels bornés (un paquet atomique de moins de 32 Kio), jamais un chemin ou un fichier exécutable. La teinte vient du véritable objet d’argile côté serveur et chaque retrait du résultat consomme une unité. La fermeture ou la destruction de l’atelier annule le droit de produire ; le travail local tardif ne change pas un autre menu. ## Contrat d’import et limites GLB **2.0 autonome**, scène par défaut (ou première scène), triangles indexés ou non, transformations hiérarchiques matrice ou TRS, matériaux de couleur et textures PNG/JPEG intégrées, UV avec répétition/clamp/miroir. Le matériau opaque ou à découpe alpha est voxelisé en surface. Le calcul s’effectue sur un fil de travail ; les faces visibles du résultat sont mises en cache pour le rendu. L’extension de matériau non éclairé peut être lue pour sa couleur. Limites explicites : fichier 8 Mio, JSON 1 Mio, hiérarchie de 64 niveaux, 16 384 triangles, 4 194 304 pixels décodés et autant de pixels de matériaux. Les plans gardent les plafonds historiques de cellules et de volume. Les grands scans demandent donc souvent une simplification préalable. Squelettes et morphing doivent être figés avant export. Les animations ne sont pas jouées (la pose statique des nœuds est utilisée). Couleurs de sommets, accessors sparse, primitives non triangulaires, transparence mélangée, compressions et extensions de textures non gérées sont refusés explicitement. Les couleurs de sommets doivent être converties en texture. Aucun téléchargement ni référence externe du GLB n’est résolu. OBJ, FBX, STL, VOX et glTF multifichier ne font pas partie de ce premier import. Un GLB sans surface visible est refusé. Une miniature représente au maximum 4096 voxels de 1/16 de bloc, centrés en X/Z, posés au sol. Les petits détails peuvent disparaître. Sa collision est le cube contenant la sculpture ; les voxels ne sont pas des blocs exploitables ou des inventaires. Les argiles utilisent la palette de couleur publiée du mod, avec éclairage du rendu, sans texture de matière distincte sur chaque voxel. Aucune dépendance tierce supplémentaire : Minecraft **26.3**, Fabric et Java 25 restent ceux du dépôt. Lecture suivant la [spécification Khronos glTF 2.0](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html). ## Vérifications `Statuary106ClientChecks` passe sur un client natif Minecraft 26.3 avec serveur intégré, dans un nouveau monde plat jetable, graine 106. Il vérifie : - Lecture d’un GLB texturé avec transformation de scène, conservation des proportions et des couleurs ; refus des fichiers hors limites, références externes, offsets invalides et hiérarchies cycliques. - Import indépendant de [BoxTextured de Khronos](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/BoxTextured), triangles indexés et texture embarquée. Le fichier n’est pas distribué avec le mod. - Dossier partagé avec filtres distincts, rotation, identité du modèle et recoloration par les seize argiles. - Fabrication native en survie : absence de résultat sans argile, coût d’une unité, restitution du reliquat à la fermeture et production par Maj-clic. - Pose par clic natif dans la portée Sanctuary du joueur, butin complet, repose, rendu dans le monde, dans l’inventaire et dans l’aperçu. - Même source convertie au Métabli en plan de 32 blocs de hauteur, sans modifier une miniature existante ; annulation d’un import à la fermeture. - Sauvegarde, suppression du GLB, réouverture du monde : modèle transmis au nouveau client et sculptures colorées conservées dans l’inventaire. - Captures FR/EN relues dans `build/statuary106-evidence/`. Commande de reproduction : ```sh ./gradlew :sanctuary:runClientGameTest \ -PsanctuaryClientTests=true -PsanctuaryStatuary106ClientTests=true \ -PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true ``` Le contrôle de régression `Plans072ClientChecks` passe également sur la copie livrée en **47 s** : **88 modèles natifs, aucun refus**, textures UV, palette active, statues de 32 blocs, rotations, matériaux, export gzip, aperçu, confirmation et annulation en créatif, constructions, refus d’usurpation et pose payée en survie. Commande identique avec `-PsanctuaryPlans072ClientTests=true` à la place de `-PsanctuaryStatuary106ClientTests=true`. Journal : `build/statuary106-plans-regression.log`. Les premiers échecs ont permis de corriger le champ natif `recipes` du critère de découverte de recette. Les attentes du test ont ensuite été ajustées pour attendre la confirmation serveur des clics et respecter la portée de pose du nouveau joueur. Aucun contournement de ces règles n’est ajouté au mod. ## Livraison locale La copie `build/release-beta106` part de la livraison beta.105 et ajoute les 30 fichiers de production concernés par ce ticket. Les sources beta.107 des œufs, arrivées en parallèle dans le dossier partagé, restent conservées dans leur propre livraison. `build/statuary106-source-manifest.json` décrit la copie. La commande suivante a réussi sur cette copie en **5 min**, **132 tâches** : ```sh ./gradlew check build assemblePack assembleTestPack :sanctuary:runClientGameTest \ -x :sanctuary:runGameTest \ -PsanctuaryClientTests=true -PsanctuaryStatuary106ClientTests=true \ -PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true ``` Le GameTest dédié reste exclu conformément au refus antérieur d’accepter son EULA. Le serveur intégré a vérifié les écritures, le coût, le butin, la sauvegarde et la transmission au client. Les essais ont tourné sur macOS ; une connexion depuis deux ordinateurs et les autres pilotes graphiques n’ont pas été testés. Les sources JAR correspondent exactement aux sources Java de la copie isolée. Les deux archives contiennent le même JAR Sanctuary, avec métadonnées beta.106 et Minecraft 26.3. Aucune classe de test ni modèle GLB de test n’est distribué. Rapport et empreintes : `build/statuary106-artifact.json`. - [Pack normal](../build/Sanctuary-beta.106.mrpack), 10 144 169 octets. SHA-256 : `b8b76ba914c8ceaed1b1d25f0817bd4cdeb7a4bd5ad43222c6970162811ff901`. - [Pack de test](../build/Sanctuary-Test-beta.106.mrpack), 10 163 092 octets. SHA-256 : `e55d5871f1e31d3ed46de32d748eba51be2029c60462cf0155be90b8dd40118b`. Aucun tag publié, canal packwiz avancé ou déploiement dans Prism.