# TOOL-01 — Clé dorée et états de blocs — beta.120 Contrat du 17 septembre 2026, branche `codex/golden-wrench-beta120`. Le créateur valide les gestes du debug stick : clic gauche choisit la propriété, clic droit parcourt ses valeurs, Maj inverse le parcours. L'orientation est proposée en premier, puis les propriétés de forme et les autres états natifs. La sélection est personnelle, par type de bloc, pour la session courante. Une indication dans la barre d'action affiche la propriété et sa valeur. La clé ne casse pas le bloc, y compris en créatif, et ne remplace pas son type. Les propriétés natives sont disponibles en survie avec la clé, sans condition opérateur, dans le respect des droits de construction, protections, portée et verrous de conteneurs. Comme avec le debug stick, les formes choisies restent en place immédiatement ; les mises à jour ultérieures du jeu peuvent recalculer les états dynamiques (redstone, connexions, cultures…). Les multiblocs assemblés gardent leurs commandes d'ouverture/dissociation et leurs propriétés techniques ne sont pas éditées individuellement. Un assemblage complet garde priorité au clic droit ; Maj permet de régler les composants non assemblés. Hors d'un assemblage complet, même un four, un baril, un piston ou un établi reçoit l'action générique. ## Rotation de texture et contrat de stockage La terre n'a pas d'orientation dans son blockstate vanilla. Une propriété supplémentaire de la clé, « Rotation des textures », parcourt 0°, 90°, 180° et 270° sur les faces des modèles de blocs. La géométrie, l'éclairage, les teintes, les ressources actives, le bloc, son inventaire et son butin restent natifs. Les rendus spéciaux d'entités de blocs ne sont pas transformés par ce réglage des faces ; leur orientation demeure modifiable par leurs états natifs. Nouvelle donnée facultative `sanctuary:wrench_textures_v1`, attachée au chunk : table immuable position entière → quart de tour (1 à 3). Une absence signifie 0°. Elle n'est créée qu'après une action de clé ; revenir à 0° retire l'entrée, puis l'attachement s'il est vide. Aucun état vanilla ni format existant n'est modifié ; aucun parcours, conversion ou régénération des anciens mondes. Les modifications de blockstate du même type conservent la rotation. Casser, remplacer ou déplacer par piston retire la rotation à l'ancienne position ; les objets récupérés restent ordinaires. Les nouveaux clients la reçoivent après le chunk natif, par lots bornés de 1 024 entrées au maximum. Déconnexion, changement de dimension et déchargement libèrent le cache visuel. Revenir à une ancienne version du mod supprime seulement cet effet visuel ; les blocs conservent leurs identifiants, données et états natifs. ## Vérifications et livraison Le parcours `Wrench120ClientChecks` passe en **47 s** sur Minecraft 26.3, client macOS et serveur intégré, dans un monde plat jetable de graine 120 : - **2 522 propriétés natives** parcourues, avec valeurs inverses et type conservé. - Vrais clics sur les escaliers : orientation, moitié supérieure et forme, sans casser le bloc en créatif ; gestes inverses et sélection distincte. Les doubles événements créatifs d'un même clic sont filtrés à la cadence native de cinq ticks. - Terre en survie : rotation réelle des UV émis, positions des sommets et nombre de faces identiques ; retour exact après quatre quarts de tour ou un inverse. - Rechargement des ressources conservant les UV tournés ; capture de terre relue. - Coffre tourné avec ses 23 diamants intacts, sans ouverture accidentelle. - Assemblage/dissociation par vrais clics des quatre familles : Métabli, Fût, Fourneau et super piston. Un clic gauche sur un assemblage ne modifie pas les numéros de composants ; barils et pistons isolés tournent normalement. - Refus en aventure, spectateur ou hors portée ; retrait des données visuelles après remplacement, maintien lors d'un changement d'état du même bloc. - Sauvegarde/reconnexion : rotation de terre côté serveur et client, état natif de l'escalier et inventaire du coffre conservés. ```sh ./gradlew :sanctuary:runClientGameTest \ -PsanctuaryClientTests=true -PsanctuaryWrench120ClientTests=true \ -PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true ``` Marqueurs `WRENCH120_PASS` et `WRENCH120_PROPERTIES 2522` dans `build/wrench120-client.log`, captures dans `build/wrench120-evidence/`. Aucun monde personnel ouvert ; pas de validation Windows ni depuis deux ordinateurs. Les rendus de faces natifs et le rechargement du pack sont vérifiés ; pas de validation spécifique d'un shader tiers. Le GameTest dédié reste exclu conformément au refus antérieur de son EULA. `./gradlew check build assemblePack assembleTestPack -x :sanctuary:runGameTest` passe en **2 min 12 s**, 125 tâches. Les sources JAR correspondent exactement aux sources du dépôt. La comparaison avec beta.119 limite les différences de production aux classes de clé/assemblage, aux deux nouveaux hooks, au rendu et aux libellés prévus ; toutes les autres ressources sont identiques. Les packs normal/Test contiennent le même JAR Sanctuary et aucune sauvegarde ni fixture de test. - Sanctuary-beta.120.mrpack : 10237973 octets, SHA-256 `86b5e480a12ba20b5c1e308c77dbb54bdf8a56806915fb32ca2d16f9a72cc9c9`. - Sanctuary-Test-beta.120.mrpack : 10256895 octets, SHA-256 `2e3818483ba7dfa6e5652b97933e105a44e7cc4b269fc567116bf895d54bd8d9`. - JAR Sanctuary : SHA-256 `8e35ef0f134a46b7760604175ad768264946d31fdd0694982e049e7a928fde2a`. Reçu local : `build/wrench120-artifact.json`. ## Publication et installation La [release beta.120](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.120) est publiée depuis `248dff47b7a0ebd11026230581fe69641dbde76d`. Le tag exact et les artefacts sont immuables ; leurs téléchargements publics sont vérifiés. Le canal packwiz avance à `e8060764a444a58b0a17318a3821dfeb1a0c33c6`. Deux synchronisations isolées puis deux dans **Sanctuary Beta** réussissent. Un seul JAR Sanctuary beta.120 est actif ; le second passage est identique. Les **923 fichiers personnels et réglages suivis** restent inchangés, sans ouvrir de monde personnel. Copie préalable dans `sanctuary-backups/before-beta.120/` de l'instance existante. Reçus locaux : `build/wrench120-isolated.json` et `build/wrench120-prism.json`.