# Alpha.14 — Lost City et expansions **État : alpha.14 vérifiée, publiée et installée dans la même instance Prism Mac.** `check build assemblePack` passe sur les sources finales avec les **8 GameTests requis**, le 9 septembre 2026 à **13 h 57 min 48 s**. La création de quartiers, leur réouverture et la reprise différée du vide passent également dans leurs mondes de développement distincts. Le JAR, le MRpack et le ZIP Prism sont vérifiés. La release immuable correspond au commit source `1c5c2c2`, le canal packwiz au commit `dabf57e`. Deux synchronisations isolées puis deux dans la même instance Prism passent, avec **713 fichiers personnels et réglages suivis conservés**. Le [reçu de livraison](packwiz.md#alpha14-publiée--9-septembre-2026) consigne les artefacts, leur empreinte et la sauvegarde ciblée. Les résultats des alpha.12, 13 et 13.1 restent historiques. Ticket [WG-17](backlog.md). Les smokes des sources finales passent sous Gradle et Java 25 : `LostCityRendererSmoke` pour les 17 types, dont confinement et accès des piscines dans quatre orientations, parcs distincts et sous-sols ; `ExpansionJournalSmoke`, dont l’immuabilité du jeton de reprise du vide ; et le contrôle de placement spatial de génération 14. `LostCityPlannerSmoke` passe également. Ses 32 graines sur terrain contrôlé couvrent tous les types de lots ; un témoin distinct de faille couvre le pont, soit les 17 types. Le test de pente ascendante et descendante protège la sélection des lots contre le rejet asymétrique des terrains montants. Sur l’ancien planificateur compilé, ce nouveau test échouait avec **0 contre 9 lots** ; le planificateur corrigé satisfait l’égalité des deux sens et le minimum de cinq lots demandé par le test. Cette comparaison provient de la sortie d’exécution ; aucun journal séparé n’a été conservé. `:sanctuary:expansionVoidCertificateSmoke` passe aussi sous Gradle : champs NBT natifs obligatoires, types stricts, refus des contenus, preuves de chunks absents et stabilité du certificat face aux seuls compteurs volatils. Ces contrôles unitaires sont complétés par les essais moteur consignés plus bas. ## Périmètre et création d’un monde Minecraft **26.3-pre-2**, Fabric et Java **25**, selon les versions épinglées dans `gradle.properties`. La livraison cible `0.1.0-alpha.14` pour le mod et le pack. Créer un **nouveau monde**, type **Sanctuary**, puis le bouton natif **Personnaliser** : Petit 512, Moyen 724 par défaut ou Grand 1 024 blocs de diamètre nominal. La hauteur reste de 384 blocs. Le codec public est `sanctuary:island_v14` ; les racines et les extensions de ces mondes portent la génération **14**. Le journal est séparé : `data/sanctuary-world-v14/expansions.json`, schéma 1. Les mondes de générations 12 et 13 conservent leurs codecs, paramètres et journaux. Ils ne reçoivent pas Lost City par conversion et ne changent pas de générateur au chargement. Aucune sauvegarde personnelle ne doit être utilisée pour les essais ci-dessous. ## Lost City Les quartiers sont composés par du code Sanctuary original. Une poche urbaine peut être retenue sur l’île initiale ; les extensions de profil `lost_city` recherchent également des emplacements. Le biome suit les parcelles acceptées en surface et laisse les biomes de cavités profonds. Une île peut ne fournir aucun site convenable : la ville et ses différents types ne sont pas garantis. | Type | Aménagement distinctif | | --- | --- | | Rue | Chaussée, bordures de pierre lisse et variations de hauteur accessibles | | Pont | Tablier et garde-corps au-dessus d’une courte faille, appuis naturels aux deux extrémités | | Parc boisé | Chemins croisés, arbres et bancs | | Jardin | Haies basses, parterres fleuris et allées | | Aire de jeux | Sable, portique de balançoire, plate-forme et petit toboggan | | Parc mémorial | Cour, monument de pierre et bancs | | Place | Pavage et fontaine sèche | | Marché | Étals, auvents sobres et réserves | | Parking | Places marquées, poteaux, garage souterrain si la roche le permet, sinon en surface | | Excavation | Fouille ouverte, fondations inachevées, barrières et escalier | | Piscine abandonnée | Bassin de trois couches d’eau, marches immergées et plage minérale | | Immeuble d’appartements | Étages, chambres, coin cuisine et escaliers | | Hôtel | Réception, couloir central et chambres séparées | | Bibliothèque | Rayonnages, tables de lecture et pupitre | | Restaurant | Cuisine équipée et tables, espace de service à l’étage | | Caserne | Dortoirs et réserves | | Hall | Grande salle, estrade, rangées de sièges et balcon | Pierre, pierre lisse et briques de pierre dominent ; briques fissurées ou moussues, andésite, vitres, détails de fer et intérieurs en chêne noir complètent la palette. L’usure est déterministe. Les accès et les escaliers restent distincts des brèches de façade et de toiture. Le butin des coffres utilise des tables vanilla différées ; aucune génération de spawner ou de villageois. Le spawn naturel de monstres du biome et des pièces de structure est limité aux zombies vanilla. Lumière, difficulté, limites de population et distance aux joueurs continuent de s’appliquer ; une ruine n’implique pas la présence immédiate d’un groupe de zombies. Les classes de zombies spécifiques restent pour la bêta. Le placement vérifie la roche sous toute l’emprise. Un sous-sol, une piscine ou une excavation exige une continuité jusqu’à huit blocs sous le plancher de référence. À défaut, le parking reste en surface et piscine ou excavation se replient en parc. Les piscines gardent un fond et des parois continus ; les ponts ne construisent pas de piliers jusqu’au vide. Les volumes protégés de l’hydrologie et les sites insuffisamment supportés sont écartés. ## Commandes d’essai et placement des expansions Les commandes restent des outils opérateur, accessibles avec les permissions adéquates. Elles n’utilisent pas encore la progression ou les ressources. ```text /sanctuary expansion quick east lost_city 256 natural /sanctuary expansion list /sanctuary expansion visit island_1 /sanctuary expansion preview quartier sanctuary northeast lost_city 128 natural /sanctuary expansion create quartier sanctuary northeast lost_city 128 natural /locate structure sanctuary:lost_city ``` `island_1` est l’exemple du premier identifiant libre créé par `quick` ; utiliser l’identifiant réellement indiqué par la commande. `visit` attend une île prête. `preview` examine un emplacement sans l’activer. `resume ` sert à reprendre une réservation interrompue. `create` choisit aussi son parent explicitement. La recherche exacte `/locate structure sanctuary:lost_city` retrouve les quartiers Sanctuary admissibles ; elle peut échouer si aucun quartier ne se trouve dans sa portée de recherche. Un profil `lost_city` ne garantit pas un terrain suffisamment adapté pour accepter un quartier. Les diamètres d’expansion possibles dans les mondes 14 sont **64, 128, 256, 512 et 1 024**. Avec `quick east` ou `quick east lost_city`, le diamètre est tiré de manière reproductible à partir de la graine et de l’identifiant : | Diamètre | Poids du tirage | | --- | --- | | 64 | 40 % | | 128 | 30 % | | 256 | 18 % | | 512 | 9 % | | 1 024 | 3 % | Ces poids décrivent la distribution du tirage, pas un quota de cinq îles à reproduire sur chaque serveur. Une taille explicite remplace le tirage. Les recherches d’emplacement ne changent ni cette taille ni la graine retenue. Les mondes historiques gardent leurs tailles et comportements antérieurs. La direction choisit un secteur de 45° autour du parent. La recherche essaie d’abord des positions proches, puis des couronnes plus éloignées, avec un nombre borné de candidats. Les centres restent alignés sur les chunks. Les emprises circulaires incluent le terrain, la marge de décoration et une garde empêchant deux îles de posséder le même chunk de coin. Le voisinage lu par les étapes de génération n’est pas intégralement réservé comme terrain. Une distance minimale entre centres reste possible comme dernier argument. ## Contrat de reprise différée du vide Ce mécanisme concerne **uniquement les nouveaux mondes de génération 14** et une expansion explicitement demandée. Les générations 12/13 gardent leur refus des chunks déjà générés, même vides. Il ne permet pas la régénération générale d’une île, d’un terrain occupé ou d’une construction. 1. Examiner toute l’emprise d’écriture et produire, pour chaque chunk existant, une preuve stricte qu’il est FULL, entièrement vide et vierge. Les positions encore absentes sont également certifiées, y compris leurs stockages d’entités et de POI. La simple absence de bloc visible ne suffit pas : entités persistées, chargées ou en attente, POI, ticks, événements de blocs et autres indices de contenu font partie des refus. 2. Lier le certificat à l’identité exacte de l’expansion et à un jeton immuable dans le journal. Une preuve isolée sans réservation correspondante ne donne aucune autorisation ; un changement de paramètres ou une preuve manquante doit faire échouer la reprise. 3. Enregistrer la réservation et demander de **fermer puis rouvrir le monde**. L’expansion reste différée pendant la session ayant établi la preuve. 4. Au chargement suivant, vérifier le journal, le certificat et les données actuelles sur toute l’emprise avant toute préparation. Une divergence bloque la reprise avant l’écriture des positions absentes. Seuls les chunks explicitement certifiés peuvent être réutilisés par cette expansion. La preuve lit le format natif exact de Minecraft 26.3-pre-2 : l’état d’air sans propriétés s’écrit comme la chaîne `minecraft:air` dans la palette ; sa forme composée autorisée utilise le champ `id`. L’ancien champ `Name` ne suffit pas à certifier un chunk. Les types NBT, sections, palettes, heightmaps et données annexes restent contrôlés strictement ; une métadonnée inconnue provoque un refus. Seuls les compteurs temporels et caches de lumière valides sont exclus de l’empreinte sémantique du vide. Il ne faut supprimer ni certificat, ni journal, ni dossier de région pour débloquer une commande. L’absence de preuve est un refus, pas une invitation à reconstruire l’historique. Les sauvegardes personnelles ne sont pas ouvertes par les tests ou par la mise à jour packwiz. ## Protocole et preuves attendues Un seul processus Gradle ou Minecraft de développement à la fois. Les suites de création repartent de mondes ignorés sous `mods/sanctuary/build/run/`. Un scénario de réouverture doit suivre sa création sans intercaler un test qui effacerait ce monde de développement. ```sh ./gradlew :sanctuary:lostCityPlannerSmoke :sanctuary:lostCityRendererSmoke --console=plain ./gradlew check build assemblePack -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ./gradlew :sanctuary:runGameTest -PsanctuaryLostCityTests=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ./gradlew :sanctuary:runGameTest -PsanctuaryLostCityTests=true -PsanctuaryExpansionReload=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ``` La suite de reprise du vide repart ensuite d’un **autre monde de développement neuf**. La commande de réouverture est exécutée deux fois de suite : ```sh ./gradlew :sanctuary:runGameTest -PsanctuaryVoidReuseTests=true -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ./gradlew :sanctuary:runGameTest -PsanctuaryVoidReuseTests=true -PsanctuaryExpansionReload=true -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ./gradlew :sanctuary:runGameTest -PsanctuaryVoidReuseTests=true -PsanctuaryExpansionReload=true -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain ``` ### Résultats moteur — graine 0 Le 9 septembre 2026, la création sur les sources finales passe à **13 h 55 min 15 s** dans le processus **19155** (`build/alpha14-city-final-create.log`, deux tests requis réussis, commande terminée en **2 min 24 s**). La réouverture du même monde de développement passe à **13 h 55 min 58 s** dans un second processus, **19372** (`build/alpha14-city-final-reload.log`, deux tests requis réussis, **33 s**). Ces durées sont celles des commandes Gradle complètes, pas des mesures de chargement en jeu ou de performance multijoueur. Les rapports locaux ignorés sont `mods/sanctuary/build/run/gameTest/diagnostics/lost-city-alpha14-seed-0.json` et `lost-city-alpha14-reload-seed-0.json` dans le même dossier. Leurs copies sont conservées dans `build/alpha14-evidence/` avant le nettoyage du monde de développement. Le monde racine est de diamètre **724**, graine **0**, codec `sanctuary:island_v14`. Trois extensions de diamètre 256 ont été examinées en lecture seule : | Candidat | Graine de l’extension | Quartiers admissibles | | --- | --- | --- | | `city_test` | `7890860792428309400` | 0 | | `city_harbor` | `-1594320136210322067` | 0 | | `city_gardens` | `6666275329838981856` | 1 | Seule `city_gardens` a ensuite été activée, à l’est, centre **(2032, 624)**. Sa préparation a terminé **418 chunks FULL**. L’inspection urbaine ci-dessous couvre les chunks des quartiers, pas la totalité de cette préparation. | Site généré | Parcelles sauvegardées | Chunks FULL inspectés | Coffres non ouverts à butin différé | | --- | --- | --- | --- | | Île initiale | 26 : appartement, hôtel, bibliothèque, marché, parc boisé, mémorial et 20 rues | 26 | 4 | | `city_gardens` | 12 : appartement, parc boisé et 10 rues | 13 | 1 | Les deux quartiers possèdent leurs références de structure natives ; la recherche native retrouve respectivement **(-49, 253, 13)** et **(2012, 229, 621)**. Les intérieurs traversables et les tables de spawn limitées aux zombies sont contrôlés. Cela ne garantit pas des zombies visibles de jour. La couverture des **17 types dans quatre orientations** provient de 68 rendus témoins indépendants ; elle ne signifie pas que cette graine contient tous les types dans ses quartiers naturels. L’inspection native des bâtiments contrôle également qu’aucun minerai ne remplace la maçonnerie dans leurs volumes à partir du plancher. Cette preuve concerne les bâtiments effectivement générés et inspectés ; les minerais du terrain sous les fondations restent possibles. Une piscine native isolée, indépendante du tirage des quartiers, conserve **189 cellules d’eau**, ses marches et son confinement après l’exécution d’un tick d’eau. La réouverture conserve les mêmes 189 cellules et les marches ; elle n’exécute pas un second tick témoin. Dans le second processus, les **38 pièces natives**, les **5 coffres non ouverts**, le bloc d’or témoin à **(-61, 250, 11)** et le journal sont conservés. L’empreinte du journal contrôlé est `38e4bc1b2e493628d1e5d1775250c0bc48821bf49d025df3c37159fcff5801ba`. Ces essais utilisent uniquement un monde de développement ignoré, sans ouvrir de sauvegarde personnelle. ### Reprise du vide — création et deux réouvertures Les trois exécutions Minecraft, sur la graine **0**, génération **14**, passent le 9 septembre 2026 : | Étape | Journal local | Résultat et durée de la commande | | --- | --- | --- | | Preuves et réservations | `build/alpha14-void-create.log` | Deux tests requis réussis à 13 h 43 ; 41 s | | Première réouverture | `build/alpha14-void-reload.log` | Deux tests requis réussis à 13 h 45 ; 1 min | | Deuxième réouverture | `build/alpha14-void-second-reload.log` | Deux tests requis réussis à 13 h 46 ; 29 s | Les rapports sont `void-reuse-before-reload.json`, `void-reuse-after-reload.json` et `void-reuse-second-reload.json`, sous `mods/sanctuary/build/run/gameTest/world/`. Ce sont des preuves locales à conserver avant le nettoyage du monde de développement. La première expansion, `void_loaded`, couvre **77 chunks FULL vides déjà chargés**. La seconde, `void_saved`, couvre **un chunk FULL vide uniquement stocké et 76 positions absentes**. Ce dernier scénario emploie une copie NBT native de chunk vide, déplacée uniquement pour constituer le témoin dans ce monde jetable. Chaque réservation reçoit son jeton durable propre et reste différée, sans publication dans le générateur pendant la session initiale. Quatre témoins indépendants, chacun contrôlé vide avant modification, prouvent le refus d’un **bloc**, d’un **coffre avec son entité de bloc**, d’une **entité vivante enregistrée** et d’un **tick de bloc programmé**. Une métadonnée NBT étrangère ajoutée après certification fait également échouer la vérification globale : l’empreinte SHA-256 du fichier de région et le contenu NBT modifié restent identiques après ce refus. Le test restaure ensuite son témoin vide pour poursuivre le scénario positif. À la première réouverture, les deux expansions atteignent **154 chunks FULL**, chacun conservant le marqueur de son jeton exact, avec **128 sections non vides**. Un bloc d’or témoin est alors posé à **(6080, 376, 1264)**. À la deuxième réouverture, il est préservé : les **154 chunks FULL marqués** et **129 sections non vides** sont retrouvés. Ce passage contrôle donc aussi qu’une reprise terminée ne réinitialise pas les blocs ajoutés ensuite. Une réouverture supplémentaire passe à **13 h 48**, avec deux tests requis réussis en **37 s** (`build/alpha14-void-final-reload.log`). Elle contrôle explicitement la lumière native terminée (`isLightCorrect`) sur les **154 chunks** et **32 échantillons de biomes hors `the_void`** à l’intérieur des extensions. Le bloc d’or et les 129 sections non vides sont toujours conservés. Ce dernier rapport est copié hors du monde de test dans `build/alpha14-evidence/void-reuse-second-reload.json` pour survivre à son nettoyage. Les 32 échantillons ne constituent pas un relevé exhaustif de tous les biomes des extensions. ### Vérification finale du build et des artefacts `./gradlew check build assemblePack` passe en **1 min 34 s** : **40 tâches**, dont 33 exécutées et 7 à jour. Le journal est `build/alpha14-check-build-pack.log`. Les huit tests moteur requis réussissent ; le témoin hydrologique de graine 0 contrôle **125 chunks FULL**, **5 923 blocs d’eau conservés** et **1 800 ticks de fluides**. La même suite vérifie la sérialisation des tailles **512 / 724 / 1 024**, le défaut Moyen et le codec historique de génération **13**. Le smoke du journal valide aussi la politique de synchronisation de dossier Windows par simulation, ainsi que les échecs de stockage après remplacement. Ce résultat ne constitue pas une exécution native sous Windows. `build/verify-alpha14-artifacts.py` valide les versions alignées, l’index packwiz, le JAR de production sans classes de test, son inclusion dans le MRpack et le ZIP d’amorçage Prism. Le SHA-256 du JAR `sanctuary-0.1.0-alpha.14.jar` est : ```text 1c517a13e1151501c6f4974d1bc00faedf67aaecd9bf58f34ac4a655d09dc6ef ``` Ces vérifications portent sur les artefacts locaux. La publication du canal, les installations packwiz isolées et la synchronisation de l’instance Prism restent à consigner. | Contrôle | Preuve attendue | État de livraison | | --- | --- | --- | | Géométrie et fondations | Déterminisme, budget de colonnes, sites protégés, certificat de roche et ponts | Smoke Gradle réussi sur les sources finales | | Rendu des 17 types | Quatre orientations, limites des pièces, parcours vers les étages, lits complets, accès aux sous-sols et piscine contenue | Smoke Gradle réussi sur les sources finales | | Placement des expansions | Cinq tailles, tirage stable, huit secteurs, séparation et garde aux coins | Smoke Gradle réussi sur les sources finales | | Structures dans Minecraft | Quartier initial et extension Lost City réellement générés, références natives et coffres à butin différé | Réussi, graine 0 : 38 pièces et 5 coffres | | Rechargement dans un second processus | Journal et structures identiques, butin non recréé, bloc témoin de joueur conservé | Réussi sur les sources finales, graine 0, processus 19372 | | Protection de la maçonnerie | Aucun minerai dans les volumes des bâtiments à partir de leur plancher | Réussi sur les quartiers natifs inspectés, graine 0 | | Eau après ticks moteur | Piscine retenue et accès après écoulement, sans fuite extérieure | Réussi sur piscine native isolée : 189 cellules et marches conservées après tick puis réouverture | | Certificat de vide | Schéma NBT strict, refus des contenus et preuves de chunks absents | Smoke Gradle réussi, complété par les témoins natifs de création | | Reprise du vide | Refus des contenus et preuves invalides ; reprise bornée après réouverture avec preuve intacte | Réussi après deux réouvertures : 154 chunks FULL marqués, bloc d’or conservé | | Lumière et biomes après reprise | Lumière native terminée et remplacement du biome vide à l’intérieur des extensions | Réussi à 13 h 48 : 154 chunks éclairés correctement, 32 échantillons hors `the_void`, bloc d’or conservé | | Sérialisation et stockage | Trois tailles, codec historique et erreurs de stockage bloquantes | Suite native réussie pour les trois tailles et le codec 13 ; politique Windows simulée réussie | | Hydrologie conservée | Eau retenue après écoulement moteur | Réussi : 125 chunks FULL, 5 923 blocs d’eau, 1 800 ticks de fluides | | Build et pack | `check build assemblePack` réussi avec versions alignées | Réussi à 13 h 57 min 48 s, huit GameTests requis, JAR/MRpack/ZIP Prism vérifiés | | Distribution | Artefacts immuables vérifiés, canal avancé, deux installations isolées et deux synchronisations de la même instance | Réussi : source `1c5c2c2`, canal `dabf57e`, 713 fichiers personnels et réglages suivis conservés | Les reçus locaux sont `build/alpha14-isolated-validation.json` et `build/alpha14-prism-validation.json`. Aucun essai Windows natif, mesure de FPS ou test de charge multijoueur n’est attesté par cette liste. Une validation de géométrie en mémoire ne remplace pas la génération, les ticks et la persistance du moteur. La publication suit [Distribution packwiz et Prism](packwiz.md). Elle conserve l’instance existante, ses sauvegardes, ses réglages et les mods tiers.