Files
koka b19e93dd21
Build Sanctuary / build (push) Canceled after 0s
Fix Windows expansion journal persistence in alpha.13.1
2026-09-09 12:37:36 +02:00

1276 lines
76 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Vérifier Sanctuary
Utiliser Java 25 et les dépendances épinglées dans `gradle.properties`.
```sh
./gradlew check build assemblePack --console=plain
```
`check` inclut les tests GameTest. Pour un diagnostic ciblé de la génération seule,
utiliser `./gradlew :sanctuary:runGameTest --console=plain`.
Pour générer de vrais chunks et vérifier le spawn sur d'autres graines :
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryTestSeed=42 --console=plain
./gradlew :sanctuary:runGameTest -PsanctuaryTestSeed=8675309 --console=plain
```
La propriété ne s'applique qu'au mod de test, jamais au mod distribué ni à une
sauvegarde de joueur. Chaque commande repart d'un monde de développement neuf.
## Correctif alpha.13.1 — journal dexpansion sous Windows
Le 9 septembre 2026, le contrôle ciblé suivant passe sur macOS et Java 25 :
```sh
./gradlew :sanctuary:expansionJournalSmoke --console=plain
```
Le journal de cette exécution est `build/alpha131-journal-smoke.log` :
`BUILD SUCCESSFUL`, en 7 secondes. Le test écrit et relit de vrais fichiers
temporaires ; il nouvre aucune sauvegarde Minecraft personnelle.
Les contrôles existants de persistance, de corruption, dhistorique immuable
et de compatibilité des racines restent actifs. Trois scénarios couvrent le
correctif :
- La politique Windows, sélectionnée par le séparateur `\`, permet la création
du journal, une réservation, sa finalisation et leurs rechargements. Le
callback de synchronisation du dossier, qui lèverait `AccessDeniedException`,
nest jamais appelé. Les écritures, remplacements atomiques et relectures du
fichier ont réellement lieu sur le système de fichiers du Mac.
- La politique Unix conserve une erreur `AccessDeniedException` injectée après
le remplacement atomique. La session devient indisponible, garde son ancien
état en mémoire et refuse toute nouvelle écriture. Le journal sur disque
contient la réservation ; une nouvelle instance la relit et peut la terminer.
- Une corruption injectée après le remplacement mais avant la relecture
empêche la publication du nouveau plan et conserve le fichier endommagé.
Le rechargement refuse ce journal au lieu de créer un historique vide.
**La branche Windows est simulée ; aucun processus Java ou Minecraft Windows
natif na encore été exécuté pour cette validation.**
`check build assemblePack` passe sur les sources alpha.13.1, en 1 min 27 s,
avec les huit GameTests du monde Moyen de graine 0. Les scénarios dexpansion
passent ensuite dans deux processus Minecraft distincts, sur la graine 42 et
le diamètre 724 : création (1 min 32 s), puis réouverture et nouvelle expansion
(26 s). Deux tests requis passent à chaque étape. Commandes de reproduction :
```sh
./gradlew check build assemblePack -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryExpansionReload=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
```
Lancer les deux scénarios dexpansion consécutivement ; le second réutilise
uniquement leur monde de développement. Comme pour lalpha.13, le témoin de
camp naturel est facultatif et absent après recherche complète sur cette
graine ; aucune nouvelle preuve de structure nest revendiquée.
Les [résultats alpha.13.1](benchmarks/alpha131-journal.json) conservent les
hashes des journaux de test, les identifiants des deux processus et les régions.
La comparaison des JAR confirme que seuls le journal, sa classe de stratégie
et la version changent ; le switch synthétique ne change que ses numéros de
lignes. Toutes les autres classes et ressources restent identiques.
Les résultats des trois tailles et de linterface ci-dessous restent ceux de
la livraison alpha.13 ; ils nont pas été réexécutés pour ce correctif de stockage.
La cause est établie par les sources de
[WindowsChannelFactory dans OpenJDK 25](https://github.com/openjdk/jdk/blob/jdk-25-ga/src/java.base/windows/classes/sun/nio/fs/WindowsChannelFactory.java#L206-L272) :
`FileChannel.open` najoute pas le drapeau `FILE_FLAG_BACKUP_SEMANTICS`, exigé
pour ouvrir un répertoire selon la
[documentation Microsoft de CreateFile](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#directories).
Seule cette synchronisation du dossier est omise sous Windows ; les exceptions
d’écriture, de remplacement ou de relecture restent bloquantes.
Le fichier temporaire est toujours synchronisé par `force(true)`, puis remplacé
atomiquement et vérifié. Cette séquence ne garantit pas sous Windows la même
durabilité du renommage en cas de coupure secteur quune synchronisation du
répertoire sous Unix :
[OpenJDK utilise MoveFileEx sans WRITE_THROUGH](https://github.com/openjdk/jdk/blob/jdk-25-ga/src/java.base/windows/classes/sun/nio/fs/WindowsFileCopy.java#L279-L294),
et le contrat de
[FileChannel.force](https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/channels/FileChannel.html#force(boolean))
porte sur les modifications du fichier. Aucun changement de format, de graine,
de générateur ou de réservation enregistrée nest introduit.
## Alpha.13 — génération unifiée
`check build assemblePack` passe, y compris le monde Moyen de graine 0 et les
smokes. Les preuves exportées, journaux, paramètres, mesures et hashes figurent
dans [le rapport alpha.13](benchmarks/alpha13-worldgen.json).
Le test courant charge `sanctuary:sanctuary`, puis règle son vrai générateur
`sanctuary:island_v13` comme le fait la personnalisation. Les suites historiques
restent accessibles avec `-PsanctuaryUnifiedTests=false`.
Les trois tailles passent les huit tests moteur sur la graine **42**, avec
1 800 ticks de fluides. Chaque inspection des cavités utilise au plus 27 chunks
FULL, choisis sur des sols et plafonds naturels ; les contrôles dhydrologie
emploient un autre échantillon borné. Ces volumes ne sont pas un inventaire de
l’île et ne mesurent pas le rendu du client.
| Taille | Chunks FULL du diagnostic deau | Blocs deau retenus après 1 800 ticks | Pilier de spéléothèmes dans lair naturel |
| --- | ---: | ---: | ---: |
| Petit, 512 | 116 | 4 722 | 25 blocs |
| Moyen, 724 | 80 | 1 196 | 18 blocs |
| Grand, 1 024 | 136 | 1 434 | 18 blocs |
Les trois cavités natives sont réellement décorées dans chacun de ces mondes :
mousse et lianes récoltables pour le luxuriant, pointes et piliers pour les
spéléothèmes, roche soufrée et pointes pour le soufre. Musiques, brouillard et
table du `sulfur_cube` restent ceux des biomes Minecraft. La graine 0 présente
seulement du luxuriant dans le raster naturel inspecté ; elle ne justifie pas
de forcer les deux autres biomes dans la roche. Une livraison exige les preuves
cumulées des trois types, pas leur présence sur toute graine.
Le garde-fou est exercé par une vraie écriture `WorldGenRegion` : eau, lit,
parois naturelles, sources et sorties sont protégés. Quatre témoins de berge
appartiennent à un chunk voisin de leur cellule deau. Une écriture hors volume
reste possible. Le test utilise une vue modifiable de chunk dédiée, car les
holders FULL exposent normalement une vue de génération en lecture seule.
Les blocs témoins temporaires sont restaurés dans le monde de développement.
Lessai client ouvre le bouton natif **Personnaliser**, parcourt les trois
tailles et vérifie Terminé, Annuler, Échap, réouverture et rafraîchissement des
réglages. L’écriture/relecture réelle des paramètres conserve la taille, la
graine, les options, le Nether et lEnd. Les anciens générateurs ne deviennent
pas personnalisables par erreur ; l’éditeur Superflat vanilla reste disponible.
Une capture confirme la lisibilité de l’écran. Cet essai ne constitue pas une
visite graphique de l’île.
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryTestDiameter=512 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
./gradlew :sanctuary:runGameTest -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
./gradlew :sanctuary:runGameTest -PsanctuaryTestDiameter=1024 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true
```
Les diagnostics détaillés restent dans le dossier ignoré
`mods/sanctuary/build/run/gameTest/diagnostics/unified-<diamètre>-seed-<graine>-*.json`.
Les anciennes mesures alpha.11 ci-dessous ne sont pas des mesures alpha.13.
### Mesure alpha.13 de Moyen
Sur le Mac M1 à 8 Go, Java 25.0.3 et heap de 2 Gio, graine 0, un seul processus
de jeu actif : la création initiale prend **17,65 s**, puis 289 chunks FULL autour
du spawn **46,01 s**, soit **63,66 s** cumulées. Le couloir suivant de 80 chunks
FULL prend **7,82 s**. Le maximum observé pour une requête de chunk est de 1,30 s
autour du spawn et de 0,79 s dans ce couloir.
Le protocole conserve les anneaux 17 × 17 et le couloir est de lalpha.11.
Lancien Grand et le nouveau Moyen ont le même diamètre nominal de 724 blocs,
mais la décoration et le spawn peuvent différer : ce nest pas une mesure
d’équivalence de génération. Le résultat de départ reste proche des 62,67 s
mesurées pour lalpha.11. Un seul passage par version, sans mesure du GPU,
des FPS, du réseau, de la disponibilité des chunks pour les ticks ou dune
charge multijoueur. Grand na pas de benchmark complet 289 + 80 dans cette
livraison ; ses tests moteur ci-dessus ont une autre charge de travail.
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryBenchmark=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
```
Rapport local : `diagnostics/generation-performance-unified-724-seed-0.json`,
log `build/alpha13-benchmark-medium.log`.
### Expansions et rechargement alpha.13
Sur le monde unifié Moyen de graine 42, les deux processus réussissent :
refus des huit premiers sites occupés, tropicale plus loin au nord, branche
aride à au moins 2 048 blocs de son parent, relecture du journal et des blocs
témoins, puis nouvelle expansion après redémarrage. Les colonnes de terrain
et les biomes enregistrés restent identiques après décodage du générateur.
Le framework reconstruit les paramètres actifs depuis le preset ; le test
vérifie séparément le codec sauvegardé et les fichiers réellement rechargés.
Aucun camp admissible na été observé sur lorigine unifiée des graines 42 et
8 675 309 : les fondations naturelles ou la protection hydrologique écartent
les candidats. Les essais stricts y échouent donc sur la preuve de structure.
La paire unifiée validée utilise explicitement un témoin de structure
facultatif, seulement après inspection complète des candidats. Ses rapports
indiquent `native_structure_observed=false` et ne constituent aucune preuve
positive de placement ou de butin dans lorigine alpha.13. Les critères de
fondation et la génération ne sont pas assouplis pour faire passer un test.
Exécuter les deux commandes sans lancer un autre GameTest entre elles :
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
./gradlew :sanctuary:runGameTest -PsanctuaryExpansionTests=true -PsanctuaryExpansionReload=true -PsanctuaryOptionalStructureWitness=true -PsanctuaryTestDiameter=724 -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
```
Sans ce drapeau explicite, le scénario exige toujours une vraie structure avec
son conteneur et sa table de butin native. La réouverture vérifie toujours ces
trois éléments lorsquils ont été observés dans le premier processus.
La paire historique, rejouée avec le binaire alpha.13, réussit sur la graine
42 sans rendre le témoin facultatif : camp abandonné de forêt, bloc du
conteneur et table de butin native retrouvés après redémarrage. Cela valide
la chaîne génération 12 conservée ; ce résultat ne vaut pas comme preuve
dun camp dans lorigine unifiée. Le smoke du journal teste aussi une origine
13 de diamètre 1 024 avec un enfant 12, le schéma 1 et le refus dune lecture
avec une autre génération ou taille, sans modifier les octets enregistrés.
## Correctif alpha.12.1 — tous les premiers emplacements occupés
Le scénario laboratoire utilise les mêmes commandes Gradle ci-dessous. Il
prépare maintenant un vrai chunk FULL vide sur chacun des huit premiers sites,
constate leur occupation puis ouvre une tropicale plus au nord. Une branche
aride demande ensuite une distance explicite de 2 048 blocs depuis cette île.
Les anciens chunks vides et le bloc témoin restent inchangés.
Le second processus vérifie dabord les huit refus sur disque avec les chunks
témoins non chargés, puis ouvre une autre île plus loin au sud et attend du
terrain prêt. Les preuves se trouvent dans
`diagnostics/expansion-alpha12-1-seed-42.json` et
`diagnostics/expansion-alpha12-1-reload-seed-42.json` sous le dossier GameTest.
Le rapport exporté est [alpha.12.1](benchmarks/alpha121-expansion.json).
`expansionPlacementSmoke`, inclus dans `check`, vérifie les huit directions,
les quatre tailles, les distances minimales diagonales/cardinales, les bornes,
les réservations existantes et limmutabilité. Les tests de commandes contrôlent
les anciennes syntaxes, les retours `preview` à 2 048 blocs et les distances
hors limites. Le correctif ne change ni le codec, ni la génération 12, ni le journal v1.
## Laboratoire alpha.12 — validation locale
`check build assemblePack` passe sur Java 25 / Minecraft 26.3-pre-2, avec
les douze tests moteur Grand de graine 0 et 1 800 ticks de fluides. Les smokes
`expansionJournalSmoke` et `expansionReliefSmoke` sont inclus dans `check`.
Le premier contrôle atomicité, corruption, immutabilité, relecture et réservation
interrompue ; le second couvre cinq graines, quatre diamètres et quatre reliefs.
Le laboratoire possède un scénario moteur distinct, à lancer puis à rouvrir
**dans cet ordre**, sans autre GameTest entre les deux :
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryUnifiedTests=false -PsanctuaryExpansionTests=true -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
./gradlew :sanctuary:runGameTest -PsanctuaryUnifiedTests=false -PsanctuaryExpansionTests=true -PsanctuaryExpansionReload=true -PsanctuaryTestSeed=42 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false
```
Le premier passage crée le monde jetable. Le second saute volontairement
`cleanGameTestWorld` et ouvre cette même sauvegarde dans un nouveau processus
Java. Il échoue si les preuves du premier passage manquent ; il ne les fabrique
pas après rechargement. La propriété reload est réservée à cette paire de tests.
Les deux passages réussissent sur la graine 42. Le premier ouvre une tropicale
au nord puis une branche aride, vérifie les vrais chunks FULL, les biomes,
les commandes opérateur, les refus de doublons incohérents et du vide déjà
chargé, et la conservation dun bloc témoin. Il observe un camp Vanilla placé
avec un tonneau et sa table de butin native. Le second retrouve le journal,
un bloc dor écrit avant larrêt, les colonnes de blocs/biomes/densités et le
tonneau. Il décode également le codec sauvegardé, mais le framework reconstruit
les réglages actifs depuis le preset : aucun parcours client normal ou joueur
connecté nest simulé. Le crash forcé au milieu dune préparation reste à essayer.
La graine 0 a fourni les deux expansions mais aucune structure acceptable :
neuf sites étaient vides et deux avaient une fondation trop mince. Le scénario
exigeant une preuve positive de butin y échoue ; cela ne justifie aucun ajout
forcé de terrain ni relâchement des fondations. Les validations visuelles des
villages, temples, reliefs et grandes tailles restent ouvertes.
Les preuves exportées figurent dans [le rapport alpha.12](benchmarks/alpha12-expansion.json).
Les diagnostics complets de chaque exécution restent dans
`mods/sanctuary/build/run/gameTest/diagnostics/expansion-alpha12[-reload]-seed-42.json`.
Les commandes et le contrat serveur sont dans [Laboratoire](alpha12-laboratory.md).
Aucun monde personnel na servi aux essais.
## Tests de forme
La tâche `:sanctuary:worldgenSmoke`, incluse dans `check`, vérifie les invariants de
l'enveloppe de l'île : absence de noyau imposé, conservation des trous naturels,
sculpture du bord, limite extérieure, hauteur et stabilité de la fonction
géométrique. Elle complète les tests en jeu ; elle ne charge pas à elle
seule les ressources de génération de Minecraft.
La tâche `:sanctuary:hydrologySmoke`, également incluse dans `check`, vérifie
le planificateur sur des reliefs contrôlés : reproductibilité, variation de la
graine, limites de profondeur et dexcavation, support naturel, parois, ruisseau
sur plateau compatible et partition indépendante de lordre des chunks. Les
scénarios vides, percés ou trop minces ne reçoivent aucun bassin de secours.
Les tâches `:sanctuary:naturalHydrologySmoke` et `:sanctuary:starterLavaSmoke`
complètent ces contrôles pour lalpha.5 : dépôts de trois à cinq couches sur
support naturel, terrasses peu creusées, niches de source, parcours de cascade
et petite réserve de lave avec accès sec. Elles vérifient le déterminisme et
labsence de remplissage de secours lorsque la géométrie ne convient pas.
## Tests dans le moteur Minecraft
`runGameTest` démarre le serveur de test headless officiel de Fabric dans
`mods/sanctuary/build/run/gameTest/`. La tâche `cleanGameTestWorld` supprime uniquement
son monde jetable avant chaque exécution afin de générer des chunks neufs, sauf
lors du second passage explicite `sanctuaryExpansionReload` décrit ci-dessus.
Il ne déploie rien dans un serveur ou une installation de jeu personnels.
La configuration garde `eula=false` : aucun fichier d'acceptation n'est écrit par
Loom. Fabric dispose d'un chemin de démarrage propre à ses tests automatisés.
Le source set `gametest` est un mod de test séparé, exclu du JAR Sanctuary distribué.
Deux adaptations y sont nécessaires, vérifiées contre les classes Minecraft
`26.3-pre-2` :
- `GameTestServer` sélectionne normalement `minecraft:flat_all_dimensions`.
Le mixin de test sélectionne directement le preset de production
`sanctuary:sanctuary`, sans recopier ses JSON. Lalpha.11 utilise le défaut
Grand (`-PsanctuaryTestPlayers=10`) et Petit (`5`). Les profils historiques
restent accessibles aux diagnostics de compatibilité, séparément de la liste
publique de création.
- Le framework désactive normalement les structures. Le test les active dans
`WorldOptions` pour examiner les chunks après toutes les étapes de génération.
La seed du serveur de test est `0` par défaut ; `-PsanctuaryTestSeed` est transmis
à la propriété JVM `sanctuary.test.seed` utilisée uniquement dans ce mixin.
Le framework déplace aussi le spawn vers une grille de tests située loin du centre.
Le test capture donc le spawn juste avant ce déplacement, après l'initialisation
normale du monde, et examine les coordonnées absolues de l'île.
Les scénarios suivants couvrent le socle et les générations historiques ;
les contrôles validés pour lalpha.10 et les résultats historiques
des générations précédentes figurent plus bas :
1. Le vrai générateur Sanctuary est chargé et le spawn collectif repose sur une
surface déjà présente dans la densité naturelle, avec un sol plein de 3×3
blocs et deux blocs libres et secs pour les graines de régression.
2. Douze chunks entièrement générés sont vides dans les quatre directions, juste
après l'enveloppe de décoration puis à environ 512 et 4 096 blocs. Cela couvre
notamment l'ancien retour automatique de l'archipel au loin.
3. La densité du datapack réellement chargé, compilée par `RandomState`, est
reproductible pour la seed `0` et change pour la seed `8675309`.
4. La densité compilée des graines `0`, `42` et `8675309` ne crée aucune matière
là où le terrain source est vide. Le relief supérieur reste celui de l'alpha.2
translaté de 64 blocs et le dessous varie avec le terrain et les bruits.
5. Le nouveau monde et son bruit utilisent bien 384 blocs, à partir de Y=0,
tandis que les anciens paramètres restent à 256 blocs. Les nuages sont
au-dessus de l'île, à Y=352,33.
6. Aucun plancher solide napparaît sous l’île, à Y=0..15. Dans les générations
alpha.5 à alpha.7, seules les eaux des cascades déclarées peuvent traverser cette marge.
7. Le relevé après génération compte exactement tous les états des blocs des
chunks demandés, avec des totaux cohérents et une complétude explicite.
Voir [Expansion et ressources](expansion.md) pour le mode complet facultatif.
8. Le plan hydrologique se retrouve dans les vrais chunks après décoration :
profils épais de sédiments, bassins retenus, raccords entre chunks, canne à
sucre valide, niches rocheuses et descente réelle des cascades. La palette
active et les minerais sont inspectés sur le terrain. Une réserve de lave
présente conserve ses 18 sources, ses supports et son accès après simulation.
9. Les anciennes clés gardent leur traitement dorigine. Seuls les nouveaux
paramètres activent le traitement ajouté pour leur génération.
La recherche de spawn parcourt l'île finie par anneaux de quatre blocs,
jusqu’à la limite de terrain du profil choisi. Les anciens réglages conservent
leur borne de 288 blocs. Elle examine d'abord la hauteur brute pour éviter de
générer entièrement les colonnes vides, puis vérifie le sol et les dégagements
après décoration. Elle préfère une zone naturelle de 3×3 ; si aucune n'est trouvée,
elle utilise le premier emplacement naturel sûr d'une colonne avec deux blocs
libres. Elle ne pose aucun bloc. Une graine pathologique sans emplacement sûr
échantillonné produit une erreur explicite, sans plate-forme de secours.
Le passage avec la graine de serveur `0` produit aussi, pour les trois graines,
des PNG et CSV dans `mods/sanctuary/build/run/gameTest/diagnostics/` :
- `island-density-seed-<graine>.png` : vue de dessus et coupes centrales X/Z,
avant/après, calculées avec les fonctions de densité réellement compilées.
La colonne « alpha.2 » utilise ses anciennes ressources conservées ; la colonne
de droite utilise la densité alpha.3, sur toute la hauteur Y=0..383.
- `island-heightmap-seed-<graine>.csv` : coordonnées et hauteurs échantillonnées
des deux versions (`-1` indique une colonne vide dans cet échantillon).
La vue de dessus échantillonne tous les quatre blocs en X, Y et Z. Les coupes
échantillonnent tous les deux blocs horizontalement et chaque bloc en hauteur.
Ces diagnostics montrent les volumes ; ils n'affichent pas les arbres, matériaux,
fluides ou structures et ne remplacent pas un essai visuel dans le client.
Le chargement du serveur valide également les codecs et les références des
registres de biomes, densités, réglages et presets. Un échec de chargement ou un
test obligatoire en échec doit faire échouer la tâche Gradle.
Le framework et les hooks de test sont spécifiques à la version épinglée. Lors
d'une mise à jour Minecraft, vérifier ces hooks avant de conclure que les tests
exercent toujours le preset de production. La vérification explicite du générateur
dans le premier test empêche un résultat positif sur un simple monde plat.
Référence du workflow : [tests automatiques Fabric](https://docs.fabricmc.net/develop/automatic-testing).
Les signatures propres à `26.3-pre-2` ont été vérifiées dans les dépendances locales,
car la documentation publiée vise actuellement `26.2`.
## Diagnostic hydrologique
Les essais hydrologiques demandent les chunks contenant tous les sites du plan
et un halo dun chunk. Ils inspectent des chunks `FULL`, avec minerais, arbres
et plantes déjà générés, et comparent tous les blocs deau observés au volume
annoncé. Leur carte montre les vrais blocs de surface ; le feuillage et les
troncs sont masqués pour lire les berges. Il ne sagit pas dune capture du jeu.
Pour lalpha.5, les chunks de l’île sont maintenus actifs, puis le test attend
`ServerLevel.isPositionTickingWithEntitiesLoaded` sur chaque chunk de fluide.
Ce prédicat, réellement utilisé par le planificateur des ticks en 26.3, exige
à la fois le statut de simulation et le chargement des entités. `FULL` et
`shouldTickBlocksAt` seuls ne prouvent pas que les ticks programmés sexécutent.
Un témoin deau temporaire est vérifié dans chaque chunk de source et de lave,
puis retiré entièrement. La simulation des sites dure **1 800 ticks** après cette
activation. La graine 0 doit notamment démontrer une cascade qui atteint `Y=0`.
Les fichiers `natural-hydrology-seed-<graine>-generated.json/.png` et
`natural-hydrology-seed-<graine>-after-1800-ticks.json/.png` sont écrits dans
`mods/sanctuary/build/run/gameTest/diagnostics/`, avec des profils PNG des
cascades. Ils décrivent les sites, dépôts, fluides, biomes et ressources des
chunks inspectés, ainsi que la graine et la version. Ce relevé de ressources
reste local à ces chunks et ne représente pas le stock total de l’île.
Le diagnostic alpha.4 est conservé séparément, avec ses fichiers
`surface-hydrology-…-after-200-ticks` et ses eaux entièrement retenues.
Le nombre de blocs deau ne mesure pas un débit ; un résultat sans site
`STREAM` ne valide pas une rivière, même sil contient des lacs.
Pour itérer sur leau sans recalculer les trois grandes cartes de densité :
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryDensityMaps=false -PsanctuaryResourceSurvey=off --console=plain
```
Ces options désactivent seulement les exports de densité et le relevé de
ressources général (neuf chunks ou île entière). Le diagnostic hydrologique
garde ses propres comptes locaux. Les options gardent les assertions de densité et tous les tests de
comportement, y compris les cartes et contrôles hydrologiques. Le parcours
standard conserve les exports complets de densité pour la graine 0.
## Vérification client facultative
```sh
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true --console=plain
```
Ce test charge les vrais `SkyRenderer` et `FogRenderer` et vérifie l'application
des deux mixins, puis ferme automatiquement le client sans ouvrir de sauvegarde.
Il nécessite un environnement graphique ; `check` ne le lance pas. Ses sources
dans `src/clientGametest/java` ne sont ajoutées au mod de test que lorsque la
propriété est activée. Le test de transformation ne remplace pas l'essai visuel
de l'horizon dans un nouveau monde Sanctuary.
Pour cet essai visuel en monde de développement créatif, comparer la même vue
à Y=70, 62, 32, 8 puis 8. Il ne doit apparaître ni disque noir au passage de
Y=63 ni assombrissement d'altitude au passage de Y=32. Les brouillards de l'eau,
de la météo et des effets d'aveuglement ou d'obscurité doivent rester présents.
## Petit, Grand et optimisation alpha.11 — 9 septembre 2026
`check build assemblePack` réussit sur les sources finales avec Grand, puis
la suite moteur réussit également sur Petit. Douze tests requis passent dans
chaque monde neuf, graine `0`. Les mondes personnels restent fermés.
| Choix | Chunks FULL inspectés | Eau retenue | Ticks de fluides |
| --- | --- | --- | --- |
| Petit (`population_5`) | 110 | 5 656 | 1 800 |
| Grand (`population_10`, défaut) | 125 | 5 923 | 1 800 |
Les deux essais vérifient les sources, déversoirs, coulées de lave et témoins
de réentrée après post-traitement. La persistance réelle sur disque préserve
les quatre références 5/10/20/100, le défaut Grand, les deux seuls choix publics
et lancien défaut 20 lorsque le champ `players` est absent dune densité sauvée.
Loracle alpha.10 effectue **3 183 804 comparaisons bit à bit** de densités
compilées réelles : références 5/10/20/100, graines `0`, `42`, `8675309`,
volumes, coordonnées signées, frontières et accès concurrents. Pour 10,
loracle utilise lancien algorithme paramétré à cette nouvelle taille ;
aucun ancien preset 10 nest supposé. Les tests synthétiques ajoutent
122 528 comparaisons sur les arrondis, collisions et changements de contexte.
Les expressions de datapacks non reconnues gardent le sampler vanilla.
Un test de concurrence vérifie quun plan prêt reste lisible pendant un
calcul lent, sans publier de plan incomplet ni conserver un échec en cache.
### Mesure à géométrie identique et nouveau Grand
Machine : Apple M1, 8 Gio de RAM, Java 25.0.3, heap 2 Gio, huit processeurs
visibles, Minecraft 26.3-pre-2 / Fabric 0.19.5. **Une exécution par configuration**,
graine `0`, nouveau monde à chaque fois, spawn `(0,252,0)`. La référence
alpha.10 est le commit `a26b72f` avec uniquement le harnais de mesure ajouté :
aucun fichier de production modifié. Aucun autre serveur ou build simultané.
| Phase serveur | Alpha.10, ancien 20 | Alpha.11, ancien 20 | Alpha.11, Grand 10 |
| --- | --- | --- | --- |
| Création du monde et spawn | 96,766 s | 18,888 s | 18,376 s |
| 289 chunks autour du spawn | 310,664 s | 43,647 s | 44,291 s |
| Somme création + zone | 407,430 s | 62,535 s | 62,667 s |
| 80 chunks dexploration | 103,142 s | 14,051 s | 7,685 s |
À géométrie 20 identique, la somme initiale baisse de **84,65 %** et
lexploration de **86,38 %**. Le gain minimal de 30 % est dépassé sur ce
protocole. Grand respecte le proxy de 120 secondes pour créer le monde et
produire la zone demandée. Sa surface différente ne compte pas comme preuve
du gain algorithmique. La latence maximale dun chunk dexploration sur
lancien 20 passe de 25,13 à 5,15 secondes : une région froide conserve donc
un coût ponctuel. Le cache ne rend pas toute exploration instantanée.
Le benchmark demande 289 chunks `FULL` par anneaux jusquau rayon huit,
puis 80 dans un corridor vers lest. Il distingue la création relevée dans
`Time elapsed` des phases mesurées dans le test. **FULL ne garantit pas le
statut de simulation ni la fin du post-traitement.** Le libellé du rapport
brut alpha.10 affirmait par erreur inclure ce dernier ; seul ce texte a été
corrigé dans le harnais alpha.11, sans changer les demandes de chunks.
Ni rendu client, ni réseau, ni FPS, ni délai dentrée visuellement confirmé,
ni capacité multijoueur ne sont mesurés. Une graine et une répétition ne
mesurent pas la variance sur toutes les îles ou machines.
Les [résultats structurés et hashes](benchmarks/alpha11-generation.json)
conservent les phases, anneaux, latences, périmètres et preuves moteur.
Les journaux bruts locaux sont `build/alpha11-baseline-20.log`,
`build/alpha11-optimized-20.log`, `build/alpha11-grand-10.log`,
`build/alpha11-check-build.log` et `build/alpha11-small-5.log`.
Reproduire le benchmark sur cette version (utiliser `10` pour Grand) :
```sh
./gradlew :sanctuary:runGameTest -PsanctuaryBenchmark=true -PsanctuaryTestPlayers=20 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
```
Loption sélectionne le harnais de performance à la place de la suite moteur,
jamais dans le JAR livré. Le build obligatoire reste une exécution normale :
```sh
./gradlew check build assemblePack -PsanctuaryTestPlayers=10 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
./gradlew :sanctuary:runGameTest -PsanctuaryTestPlayers=5 -PsanctuaryTestSeed=0 -PsanctuaryResourceSurvey=off -PsanctuaryDensityMaps=false --console=plain
```
Les tableaux alpha.10 suivants restent historiques.
## Contrôles et validation alpha.10 — 9 septembre 2026
Les profils `sanctuary:population_5`, `population_20` et `population_100`
passent chacun les onze tests requis sur la graine `0`, avec **1 800 ticks de
fluides de production**. Aucun réveil manuel des sources naturelles nest
ajouté par le diagnostic. `check build assemblePack` passe sur le profil 5 ;
les profils 20 puis 100 sont ensuite exécutés dans des mondes de test neufs.
| Capacité | Diamètre nominal | Régions inspectées | Chunks FULL | Régions en cache au spawn → après inspection | Durée de la commande |
| --- | --- | --- | --- | --- | --- |
| 5 | 512 | (0, 0) | 110 | 1 → 1 | 3m 46s |
| 20 | 1 024 | (0, 0), (1, 0) | 185 | 1 → 2 | 6m 31s |
| 100 | environ 2 290 | (0, 0), (1, 1), (2, 0) | 290 | 1 → 4 | 11m 37s |
La durée du profil 5 inclut les tâches de construction ; celles des profils
20/100 concernent `runGameTest`. Ces temps ne mesurent ni un tick en régime
établi ni une charge multijoueur. Le calcul du premier plan central reste
coûteux sur cette configuration : 5 joueurs : 87.710 s; 20 joueurs : 82.834 s; 100 joueurs : 85.761 s.
La génération en masse reste à optimiser. Le cache commence localement et
ne construit pas demblée toutes les régions de l’île.
| Capacité | Colonnes de sédiments sélectionnées | Blocs deau retenus | Sources de lave retenues | Sources deau / débordements / coulées de lave testés | Témoins de réentrée sans marqueur |
| --- | --- | --- | --- | --- | --- |
| 5 | 3196 | 5656 | 19 | 1 / 1 / 1 | 3 |
| 20 | 3367 | 6319 | 20 | 2 / 3 / 2 | 3 |
| 100 | 4325 | 8106 | 57 | 3 / 4 / 3 | 3 |
Les témoins vérifient les fonds et sédiments après décoration, la conservation
des sources, les composantes d’écoulement réellement descendantes et les
supports de lave naturels. Les débordements sélectionnés rejoignent leur bassin
cible ou leur chute terminale. Le rappel du post-traitement sans marqueur
préserve une modification ultérieure de lexutoire. Les nombres décrivent
uniquement les éléments sélectionnés dans les chunks indiqués.
| Capacité | Pas horizontal du relevé de densité | Colonnes avec roche | Colonnes vides | Colonnes avec roche au-delà de lancienne emprise |
| --- | --- | --- | --- | --- |
| 5 | 9 | 1015 | 3210 | 0 |
| 20 | 17 | 1753 | 2472 | 790 |
| 100 | 37 | 2375 | 1850 | 2170 |
Ces échantillons de densité attestent des masses naturelles, du vide et de
lextension réelle des grandes tailles. Ils ne mesurent pas toute laire
habitable. Les comptes de blocs, troncs et minerais des régions inspectées
sont des constats locaux avant lintervalle fluide ; ils ne doivent être
extrapolés ni en stocks de l’île entière ni en ressources par joueur.
Le test de persistance utilise l’écriture et la lecture officielles de
Minecraft 26.3-pre-2 dans des dossiers temporaires. Il vérifie les trois clés
de paramètres enregistrées, la graine, **Sanctuary = 20 par défaut**, et un
témoin alpha.9 qui conserve `sanctuary:sanctuary_cavern`. Le smoke pur régional
vérifie le rejet atomique des bassins et groupes, les dépendances de sources,
les limites, les traductions signées et les index de cellules multihauteurs.
Le gel porte sur 267 fichiers de production ; 212 anciens fichiers restent
strictement identiques, huit fichiers de liaison/interface sont modifiés.
Preuves locales ignorées :
- `build/alpha10-check-build-final.log`, puis `build/alpha10-players20-seed0.log`
et `build/alpha10-players100-seed0.log`.
- `mods/sanctuary/build/run/gameTest/diagnostics/population-<capacité>-seed-0-engine.json`
et `population-<capacité>-seed-0-density.json` avec leurs CSV.
- `mods/sanctuary/build/run/gameTest/diagnostics/population-persistence-seed-0/round-trip.json`.
Le JAR, le MRpack et le ZIP damorçage sont vérifiés localement. La publication
et les synchronisations de la même instance Prism sont suivies séparément dans
[Distribution](packwiz.md). Aucun test de cent joueurs simultanés ni garantie
de performances nest annoncé. Les preuves alpha.9 suivantes restent historiques.
## Contrôles et validation alpha.9 — 9 septembre 2026
Les mondes neufs des graines `0`, `42` et `8675309` utilisent les paramètres
de production `sanctuary:sanctuary_cavern`. Chaque journal termine au moins
dix tests requis et sa tâche Gradle sans échec, avec 1 800 ticks de fluides.
Les sources naturelles deau et de lave, les débordements et les geysers
démarrent uniquement avec leurs ticks de production. Le test programme
seulement un témoin artificiel indépendant pour vérifier que les ticks
fonctionnent ; il ne réveille pas les sources naturelles.
Le build complet `check build assemblePack` réussit en 6m 24s,
avec 15 tâches de tests purs de comportement.
Les rapports sont postérieurs au gel du code final ; les résultats de
lalpha.8 et les essais alpha.9 intermédiaires ne servent pas de preuve ici.
La présence dun groupe de terrasses connecté, dun geyser réellement actif,
de baies lumineuses, de spéléothèmes et daméthyste bourgeonnante est vérifiée
sur lensemble des trois graines. Chaque élément nest pas imposé à chaque
graine ; leurs absences locales restent visibles dans les tableaux.
| Graine | Chunks FULL | Failles / témoins | Chênes / bouleaux supérieurs | Chênes noirs inférieurs | Gros champignons | Petits sous plafond | Minerais dehors : charbon / fer / cuivre |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 251 | 3 / 3 | 321 / 251 | 18 | 14 | 211 | 506 / 178 / 147 |
| `42` | 246 | 2 / 2 | 362 / 177 | 11 | 8 | 69 | 617 / 269 / 193 |
| `8675309` | 242 | 3 / 3 | 248 / 125 | 14 | 11 | 131 | 761 / 317 / 328 |
Les arbres sont des groupes de pieds de troncs sur sol naturel, avec feuilles
observées ; les gros champignons ont une tige et un chapeau connectés.
| Graine | Blocs à baies lumineuses | Blocs émissifs | Spéléothèmes pointus | Améthyste bourgeonnante | Blocs daméthyste | Geysers dormants + éruptifs | Sources deau de geyser |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 363 | 391 | 501 | 214 | 818 | 1 | 1 |
| `42` | 280 | 308 | 592 | 210 | 945 | 4 | 4 |
| `8675309` | 446 | 476 | 380 | 141 | 504 | 5 | 5 |
Le décor souterrain est compté sur les blocs initiaux réellement générés.
Ses témoins sont revérifiés après les fluides : support, conservation de
laméthyste bourgeonnante et lumière du moteur pour les blocs émissifs.
Ces nombres comptent des blocs, pas des cavités ni des géodes distinctes.
Laméthyste bourgeonnante est reliée à une cavité naturelle par un parcours
dair vérifié avant et après les ticks ; les JSON donnent la position de
chaque raccord et les exemples de blocs souterrains, limités à 64 témoins.
Les geysers observés possèdent la vraie entité de bloc `potent_sulfur`,
du magma dessous et une source deau retenue au-dessus. Un même geyser
doit passer par les états dormant et éruptif pendant les ticks, sans
activation artificielle par le test.
| Graine | Niveaux Y des bassins | Colonnes deau par bassin | Descente depuis la bouche | Nouveaux blocs écoulés accessibles | Deux paliers connectés |
| --- | --- | --- | --- | --- | --- |
| `0` | 148 / 140 | 53 / 76 | 148 | 1 230 | Oui, après ticks |
| `0` | 177 / 163 | 169 / 47 | 177 | 3 370 | Oui, après ticks |
| `42` | 129 / 114 | 116 / 53 | 129 | 181 | Oui, après ticks |
| `42` | 112 / 107 | 105 / 161 | 112 | 354 | Oui, après ticks |
| `8675309` | 154 / 149 | 128 / 149 | 7 | 7 | Oui, après ticks |
| `8675309` | 153 / 112 | 87 / 58 | 153 | 871 | Oui, après ticks |
Chaque groupe réunit deux bassins retenus à des niveaux différents. Le
diagnostic suit leau réelle depuis chaque bouche, horizontalement ou en
descendant, sans mouvement vers le haut, jusquau bassin cible ;
un exutoire terminal sans bassin cible nest pas compté comme cette liaison.
La descente est mesurée sur ce parcours propre à la bouche. Les nouveaux
blocs accessibles en sont les eaux écoulées qui n’étaient ni retenues dans
les bassins ni présentes avant la simulation. Les exutoires terminaux
facultatifs doivent descendre dau moins douze blocs réels.
Les terrasses sont limitées à trois blocs de profondeur et cinq blocs
dincision ; les lacs, à huit blocs de profondeur et douze blocs dincision.
Pour les terrasses, le diagnostic exige aussi quatre blocs dair naturel
au-dessus de chaque colonne excavée, en plus des fonds et supports conservés.
| Graine | Longueur rivière | Déplacement | Niveau Y | Colonnes deau | Colonnes des bassins terminaux | Sources liées |
| --- | --- | --- | --- | --- | --- | --- |
| `0` | 409,8 | 199,7 | 243 | 2 863 | 240 / 241 | 1 |
| `42` | 247,8 | 171,0 | 247 | 1 712 | 254 / 247 | 1 |
| `8675309` | 340,7 | 251,3 | 239 | 2 247 | 265 / 244 | 1 |
La longueur additionne les déplacements du tracé, diagonales comprises. Les
bassins terminaux et larrivée de leur cascade sont contrôlés après les ticks.
| Graine | Colonnes du lac | Blocs deau réels | Profondeur retenue maximale |
| --- | --- | --- | --- |
| `0` | 728 | 3 746 | 8 |
| `42` | 722 | 3 027 | 8 |
| `8675309` | 992 | 4 978 | 8 |
Chaque ligne décrit un site classé `LAKE`, après simulation. Les étangs,
bassins de rivière et terrasses sont consignés dans leurs propres catégories.
| Graine | Eau retenue, geysers inclus | Dont sources de geyser | Eau hors retenues | Eau totale | Lave totale | Sources de lave | Coulées | Accès poche de lave |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 9 845 | 1 | 4 971 | 14 816 | 144 | 20 | 2 | `(96, 100, -45)` |
| `42` | 7 267 | 4 | 903 | 8 170 | 144 | 20 | 2 | `(67, 133, -108)` |
| `8675309` | 10 268 | 5 | 1 230 | 11 498 | 144 | 20 | 2 | `(-93, 156, -21)` |
Ces volumes sont mesurés après 1 800 ticks actifs ; ils ne mesurent pas un
débit et ne signifient pas que les coulées ont atteint leur état final.
Leau retenue correspond au volume attendu après décoration et comprend
les sources propres aux geysers. Les composantes extérieures sont rattachées
aux sources rocheuses ou aux débordements déclarés, avec leurs raccords
réels. La lave des coulées est distinguée de la poche couverte.
| Graine | Sols de mousse | Sols de podzol | Sols de mycélium |
| --- | --- | --- | --- |
| `0` | 13 175 | 10 936 | 5 074 |
| `42` | 4 897 | 3 712 | 2 200 |
| `8675309` | 10 058 | 6 714 | 3 293 |
Les stocks suivants portent sur les seuls chunks inspectés, avant les
ticks de fluides. Les variantes ordinaires et dardoise de chaque minerai
sont additionnées. Ce relevé ne couvre pas toute l’île et ne déclenche
jamais de remplissage pour atteindre un quota.
| Minerai | Graine 0 | Graine 42 | Graine 8675309 |
| --- | --- | --- | --- |
| Charbon | 7 858 | 6 788 | 4 992 |
| Fer | 3 224 | 2 700 | 2 172 |
| Cuivre | 2 439 | 2 132 | 1 621 |
| Or | 930 | 687 | 507 |
| Redstone | 924 | 631 | 523 |
| Lapis | 278 | 279 | 137 |
| Diamant | 162 | 86 | 88 |
| Émeraude | 64 | 41 | 42 |
| Matière | Graine 0 | Graine 42 | Graine 8675309 |
| --- | --- | --- | --- |
| Tuf | 657 813 | 491 736 | 239 434 |
| Cobblestone | 285 441 | 172 282 | 162 791 |
| Cobblestone moussue | 593 694 | 420 042 | 229 846 |
| Boue compactée | 168 698 | 167 276 | 158 922 |
| Ardoise des abîmes | 1 443 679 | 901 821 | 858 181 |
| Roche noire | 539 269 | 275 994 | 324 101 |
| Basalte | 605 828 | 390 889 | 307 652 |
| Soufre | 87 811 | 57 838 | 82 209 |
| Cinabre | 11 797 | 13 597 | 20 095 |
La sélection des chunks suit les sites deau et d’écologie ; elle nest pas
un échantillon représentatif de toute l’île. Ces stocks ne démontrent pas
laccessibilité de chaque bloc et ne prouvent pas, seuls, une réduction du
soufre par rapport à une autre version sur un périmètre différent.
Le tableau des minerais extérieurs sélectionne charbon, fer et cuivre ; les
JSON gardent les autres familles effectivement observées avec une face dair.
| Graine | Réentrée source deau | Réentrée source de lave | Réentrée débordement |
| --- | --- | --- | --- |
| `0` | 1 vérifiée(s) | 1 vérifiée(s) | 1 vérifiée(s) |
| `42` | 1 vérifiée(s) | 1 vérifiée(s) | 1 vérifiée(s) |
| `8675309` | 1 vérifiée(s) | 1 vérifiée(s) | 1 vérifiée(s) |
Après consommation des marqueurs, les rappels du post-traitement préservent
les modifications témoins apportées aux bouches ; les blocs sont restaurés
ensuite. Les 176 fichiers historiques suivis hors raccordement
conservent leur SHA-256. Aucun monde personnel nest ouvert par ces tests.
Preuves locales ignorées : `build/alpha9-check-build-final.log` (build et graine 0),
`build/alpha9-seed42-final.log`, `build/alpha9-seed8675309-final.log` et les rapports
`cavern-seed-<graine>-after-1800-ticks.json` et `-postprocessing-reentry.json`
sous `mods/sanctuary/build/run/gameTest/diagnostics/`.
`build/report-alpha9-validation.py` extrait les mesures et vérifie les preuves
cumulées, le gel des sources et les journaux. Le hash final du JAR est lu
dans `build/alpha9-jar-sha256.txt`, sans valeur codée dans lextracteur.
Ces résultats ne garantissent aucune géode, terrasse, rivière, geyser ou
ressource sur chaque graine. Lappréciation visuelle et l’équilibrage en
partie restent ouverts. La release alpha.9 et le canal packwiz sont publiés
depuis `40b6555`. Deux synchronisations avec le véritable installateur
réussissent dans un dossier isolé, puis deux dans la même instance Prism.
Un seul JAR Sanctuary alpha.9 est actif ; 260 fichiers personnels et réglages
conservent leurs hashes. Lancien JAR et les manifestes sont sauvegardés hors
de `mods/`. Voir [Distribution](packwiz.md) pour le hash public du JAR.
## Contrôles et validation alpha.8 — 9 septembre 2026
Les trois essais utilisent des mondes neufs et le preset de production
`sanctuary:sanctuary_rift`, avec Minecraft 26.3-pre-2, Java 25, Fabric Loader
0.19.5 et Fabric API 0.160.0+26.3. Les journaux propres aux graines `0`, `42`
et `8675309` terminent leurs tests requis et leur tâche Gradle sans échec.
Le build complet `check build assemblePack` est exécuté sur la graine `42`.
Il passe en 4m 57s,
avec 12 tests purs de comportement et les tests serveur.
Les exports généraux facultatifs sont désactivés ; les diagnostics ciblés et
les assertions de comportement restent actifs.
Les nouveaux contrôles exigent de vrais bassins terminaux connectés à la
rivière et la continuité physique entre chaque tige et son chapeau de gros
champignon. Les rapports antérieurs à ces contrôles ne sont pas utilisés.
| Graine | Chunks FULL | Failles / colonnes témoins | Chênes / bouleaux supérieurs | Chênes noirs inférieurs | Gros champignons | Petits sous plafond | Minerais dehors : charbon / fer / cuivre |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 246 | 3 / 3 | 331 / 249 | 19 | 22 | 273 | 488 / 170 / 124 |
| `42` | 216 | 2 / 2 | 361 / 178 | 17 | 15 | 140 | 379 / 209 / 148 |
| `8675309` | 231 | 3 / 3 | 236 / 125 | 31 | 17 | 202 | 633 / 261 / 262 |
Les mêmes échantillons montrent la coexistence de chênes noirs et de gros
champignons sur les graines `0`, `42`, `8675309`.
Les arbres sont comptés par groupes de pieds de troncs avec sol et feuilles
observés. Les gros champignons ont une tige enracinée, un chapeau connecté et
une voûte naturelle ; leurs blocs sont de nouveau contrôlés après les fluides.
Les petits champignons sous plafond ont également leurs supports naturels.
Ils ne sont pas confondus avec le sous-ensemble `actual_lower_terrace_vegetation`.
Les failles sont vérifiées sur des colonnes témoins à lintérieur des traces :
ce nombre ne mesure pas la longueur complète des canyons.
| Graine | Longueur rivière | Déplacement | Niveau Y | Colonnes deau | Colonnes des deux bassins | Sources liées | Descente liée observée |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 409,8 | 199,7 | 243 | 2 863 | 240 / 241 | 1 | 8 |
| `42` | 247,8 | 171,0 | 247 | 1 712 | 254 / 247 | 1 | 6 |
| `8675309` | 340,7 | 251,3 | 239 | 2 247 | 265 / 244 | 1 | 8 |
La longueur vient de `river_routes[].length`, somme des déplacements successifs
du chemin, diagonales comprises. Le déplacement est la distance entre ses
extrémités. Les deux bassins ont des élargissements mesurés au-delà du lit ;
chaque raccord local et larrivée réelle de la cascade sont contrôlés. Le
tracé est arrondi à l’échelle de 16 à 32 blocs, avec un lit denviron 5 à 7
blocs de large. Les limites sont de 16 blocs retirés pour le lit, 12 pour ses
berges progressives et 2 pour les autres rives, sur support naturel.
| Graine | Eau retenue | Eau hors bassins | Eau totale | Lave totale | Sources de lave | Coulées déclarées | Accès à la poche de lave |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `0` | 6 463 | 363 | 6 826 | 144 | 20 | 2 | `(-5, 106, 80)` |
| `42` | 4 899 | 358 | 5 257 | 144 | 20 | 2 | `(-35, 108, 6)` |
| `8675309` | 5 841 | 345 | 6 186 | 144 | 20 | 2 | `(-55, 132, 0)` |
Ces fluides sont lus après 1 800 ticks dans des chunks actifs, avec témoins
indépendants du fonctionnement des ticks. Les volumes retenus correspondent
exactement aux volumes attendus. Leau extérieure reste reliée aux sources
déclarées ; la lave des coulées est distinguée des sources de la poche couverte.
La poche contient 18 sources lorsquelle est présente ; ses coordonnées
daccès ne sont pas les niveaux des blocs de lave. Sa recherche privilégie
Y=64..160, avec un site plus haut possible si la recherche basse échoue.
Les coulées supplémentaires partent de sources entre Y=40 et Y=160. Ce relevé
à 1 800 ticks ne signifie pas que tout écoulement a atteint son état final.
| Graine | Sols de mousse | Sols de podzol | Sols de mycélium |
| --- | --- | --- | --- |
| `0` | 16 268 | 15 441 | 6 855 |
| `42` | 7 197 | 6 684 | 3 502 |
| `8675309` | 12 519 | 10 616 | 5 185 |
Les sols sont des colonnes inférieures naturelles réellement revêtues de ces
matières. Les proportions de placement ne sont pas imposées au relevé.
Les stocks suivants comptent les blocs dans les seuls chunks inspectés,
**avant les ticks de fluides**. Ils incluent les variantes ordinaires et
dardoise de chaque minerai. Ils ne représentent pas toute l’île et ne sont
jamais complétés pour atteindre un quota.
| Minerai | Graine 0 | Graine 42 | Graine 8675309 |
| --- | --- | --- | --- |
| Charbon | 7 291 | 5 738 | 4 295 |
| Fer | 2 899 | 2 330 | 1 860 |
| Cuivre | 2 229 | 1 804 | 1 416 |
| Or | 829 | 533 | 425 |
| Redstone | 819 | 534 | 432 |
| Lapis | 237 | 229 | 122 |
| Diamant | 126 | 80 | 71 |
| Émeraude | 55 | 34 | 30 |
| Matière | Graine 0 | Graine 42 | Graine 8675309 |
| --- | --- | --- | --- |
| Tuf | 562 892 | 439 519 | 264 881 |
| Cobblestone | 288 921 | 140 182 | 73 681 |
| Cobblestone moussue | 452 727 | 381 339 | 220 767 |
| Boue compactée | 192 049 | 145 758 | 101 652 |
| Ardoise des abîmes | 1 437 063 | 712 417 | 807 405 |
| Roche noire | 379 527 | 194 967 | 248 247 |
| Basalte | 549 851 | 293 938 | 137 965 |
| Soufre | 462 657 | 313 445 | 401 190 |
| Cinabre | 118 411 | 74 761 | 114 313 |
Ces stocks ne prouvent pas seuls laccessibilité de chaque bloc. Les cartes
de surfaces, les positions des minerais exposés et les témoins de corniches
complètent le relevé. Les minerais « dehors » ont une vraie face dair ouverte
vers le ciel ou une ouverture horizontale naturelle inspectée sur douze blocs.
Le tableau présente le charbon, le fer et le cuivre. Les JSON conservent aussi
les autres familles effectivement recensées dehors, comme l’émeraude lorsquelle
est observée ; le choix des colonnes ne limite pas le périmètre du diagnostic.
L’échantillon couvre les eaux et leurs voisins, des cibles écologiques et le
site facultatif darbre remarquable ; il est volontairement orienté par ces
sites, sans prétendre donner un pourcentage représentatif de l’île.
| Graine | Réentrée bouche deau | Réentrée bouche de lave |
| --- | --- | --- |
| `0` | 1 vérifiée(s) | 1 vérifiée(s) |
| `42` | 1 vérifiée(s) | 1 vérifiée(s) |
| `8675309` | 1 vérifiée(s) | 1 vérifiée(s) |
Après consommation des marqueurs de génération, le rappel du post-traitement
conserve les modifications temporaires appliquées aux bouches testées ; les
blocs témoins sont ensuite restaurés. Les 113 fichiers historiques
suivis conservent leurs SHA-256. Aucun monde personnel nest ouvert par ces tests.
Preuves locales ignorées par Git : `build/alpha8-build.log` (build complet sur
42), `build/alpha8-seed0.log`, `build/alpha8-seed42.log`,
`build/alpha8-seed8675309.log`, les JSON `rift-seed-<graine>-after-1800-ticks`
et `-postprocessing-reentry`, les cartes de canopée et de corniches et les
profils de cascades sous `mods/sanctuary/build/run/gameTest/diagnostics/`.
`build/report-alpha8-validation.py` extrait leurs champs sans remplacer les
données absentes par des résultats supposés. Le hash du JAR vérifié est
conservé dans `build/alpha8-jar-sha256.txt`.
Ces résultats portent sur les graines testées. Ils ne garantissent aucune
rivière, essence rare ou quantité de ressources sur toutes les graines.
Lappréciation visuelle du paysage et l’équilibrage en partie restent ouverts.
La distribution est également vérifiée : deux synchronisations packwiz dans
un dossier de développement neuf, puis deux dans la même instance Prism.
Le second passage ne change aucun fichier géré ; un seul JAR Sanctuary
alpha.8 reste actif. Les SHA-256 des 161 fichiers personnels et réglages
suivis sont identiques avant et après. La livraison et le hash du JAR figurent
dans [Distribution Prism](packwiz.md).
## Contrôles et validation alpha.7 — 8 septembre 2026
`WoodlandDiagnostics` reprend les preuves hydrologiques et ajoute les forêts,
les champignons sous plafond, les roches exposées et les minerais visibles.
Les arbres sont comptés par pieds de troncs sur le sol naturel, avec au moins
trois bûches verticales et des feuilles réellement observées. Le chêne noir
requiert un pied principal de 2×2 et trois couches de support par pied ; ses
branches retombantes ne comptent pas comme de nouveaux arbres. Podzol et
mycélium sont des sols explicites : le tag `minecraft:dirt` de cette version
ne les contient pas.
Les essais utilisent des mondes neufs, le vrai preset de production et
Minecraft 26.3-pre-2 / Java 25 / Fabric Loader 0.19.5. Les dix tests requis
passent sur chacune des trois graines. `check build assemblePack` passe en
3 min 41 s sur la graine 0, avec les huit tests purs de forme, hydrologie,
lave, écologie et nouveaux bois. Les exports de densité et le relevé général
facultatifs sont désactivés ; les contrôles de densité restent actifs.
| Graine | Chunks FULL inspectés | Chênes de surface | Bouleaux de surface | Chênes à rayon ≤128 | Chênes noirs inférieurs | Minerais exposés dehors : charbon / fer / cuivre |
| --- | ---: | ---: | ---: | ---: | ---: | --- |
| `0` | 167 | 292 | 263 | 218 | 30 | 4 / 19 / 5 |
| `42` | 154 | 313 | 125 | 250 | 13 | 8 / 3 / 13 |
| `8675309` | 167 | 336 | 99 | 272 | 36 | 7 / 6 / 9 |
Ces nombres décrivent un échantillon borné : les eaux et leur voisinage, des
cibles écologiques et lemplacement de larbre remarquable. Ce nest pas un
inventaire complet de l’île ni un pourcentage représentatif de toutes ses
surfaces. Les sols sont mesurés sous les canopées. Les minerais recensés dans
la dernière colonne ont une face dair réelle, ouverte vers le ciel ou vers
une paroi dégagée sur douze blocs ; les faces dans de petites cavités sont
comptées séparément. Les trois roches présentent des nappes contiguës exposées.
La graine 42 démontre un cerisier remarquable en `(-88, 251, -88)`, avec son
tronc, ses feuilles et 21 bûches dans le volume prévu. Le site sélectionné sur
la graine 0 ne produit pas darbre rare : lespace et les conditions après
décoration restent déterminants. Aucun terrain nest ajouté pour le forcer.
Les autres essences rares et le soufre ne sont pas garantis sur chaque graine.
Les eaux sont vérifiées après décoration puis pendant 1 800 ticks réels dans
des chunks actifs, avec témoins indépendants du fonctionnement des fluides.
Les bassins et les dix-huit sources de chaque niche de lave sont conservés ;
les cascades restent reliées à leurs sources et dans lemprise observée.
Les pieds des arbres et les champignons observés gardent leur support. Les
sédiments sont comparés à leur matériau prévu sur toutes leurs couches ; une
roche peut être remplacée seulement par les roches, minerais ou dépôts de
terre effectivement configurés. Les berges de sable et gravier sont comptées
sur les vrais blocs, y compris par profondeur.
Les anciens générateurs restent isolés : les 77 fichiers historiques suivis
gardent leur SHA-256. La réentrée au post-traitement après consommation des
marqueurs respecte une modification ultérieure de bouche de source sur les
trois graines. Aucun monde de joueur nest ouvert par ces tests.
Preuves locales ignorées par Git : `build/alpha7-build.log`,
`build/alpha7-seed42.log`, `build/alpha7-seed8675309.log`, et les fichiers
`woodland-seed-<seed>-<phase>.json`, `-canopy.png`, `-lower-terraces.png` et
profils de sources dans `mods/sanctuary/build/run/gameTest/diagnostics/`.
Les cartes montrent des lectures de blocs ; lappréciation du paysage dans
le client reste à faire lors du prochain essai.
## Contrôles alpha.6
`layeredHydrologySmoke` vérifie les bassins sans ruisseau de secours, les
supports des dépôts, leur déterminisme et les sources sur les faces des
strates inférieures. Les reliefs vides, trop minces ou percés ne sont pas comblés.
`layeredEcologySmoke` vérifie les sols et le dégagement des corniches,
lexclusion du sommet et du vide, ainsi que la variation verticale des biomes.
`LayeredHydrologyDiagnostics` inspecte les nouveaux paramètres et refuse
Dappled Forest dans leur palette. Il vérifie les couleurs communes, les biomes
des surfaces hautes et basses, la végétation réelle et les surfaces rocheuses.
Les plantes vanilla sur une corniche mince sont relevées séparément : elles
ne constituent pas une preuve des trois supports exigés par la nouvelle
décoration moussue. Leurs coordonnées et leurs supports sont exportés.
Les tickets de toute lemprise sont posés avant le chargement des chunks `FULL`.
Le test appelle ensuite `ServerLevel.waitForEntities(chunk, 0)` sur cette même
emprise : le serveur GameTest accélère ses ticks et un délai en ticks seul ne
prouve pas que les lectures asynchrones dentités sont terminées. Le prédicat
`isPositionTickingWithEntitiesLoaded` et les témoins d’écoulement restent requis.
Le diagnostic simule 1 800 ticks dans les chunks actifs. Les bassins doivent
retenir leur eau. Les écoulements extérieurs doivent être reliés à une source
rocheuse déclarée par des connexions deau réelles, sans eau orpheline ni voisin
horizontal en dehors de lemprise inspectée. Les seuls sites de surface sont
des étangs et des lacs ; aucune rivière nest activée dans cette livraison.
Les ouvertures des sources sont vérifiées après toute la décoration ; une
source bouchée par du lichen ne peut pas satisfaire le contrôle de descente.
Après ces mesures, un test de réentrée pose temporairement un lichen à une
bouche dont les marqueurs de génération ont été consommés. Un nouvel appel au
post-traitement doit le conserver ; le test restaure ensuite le bloc dorigine.
La preuve est dans `layered-hydrology-seed-<seed>-postprocessing-reentry.json`.
Les cartes `layered-hydrology-seed-<seed>-<phase>*.png` montrent les surfaces,
les corniches et les profils de sources. Les JSON associés contiennent les
résultats et leur emprise. Ces lectures de blocs ne remplacent pas lexamen
du paysage dans le client.
## Validation alpha.6 — 8 septembre 2026
Les dix tests serveur passent sur chacune des graines `0`, `42` et `8675309`,
dans des mondes neufs Minecraft 26.3-pre-2 avec Java 25, sur Apple M1 à 8 Go.
Chaque emprise est réellement active pendant 1 800 ticks mesurés. La commande
finale `check build assemblePack`, avec les exports de densité et le relevé
ressources général facultatifs désactivés, passe en **3 min 30 s** sur la graine 0.
Les six tests de forme, hydrologie, lave et écologie passent également.
| Graine | Spawn naturel | Eau des bassins | Eau des cascades | Canne | Lave | Chunks FULL | Plantes sur corniches épaisses |
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
| `0` | `(0, 252, 0)` | 1 533 | 414 | 20 | 18 | 151 | 11 021 |
| `42` | `(0, 249, 0)` | 1 376 | 913 | 4 | 18 | 149 | 6 334 |
| `8675309` | `(0, 247, 0)` | 1 590 | 2 350 | 10 | 18 | 160 | 9 532 |
Ces nombres décrivent uniquement les chunks inspectés, après décoration et
simulation. Les plantes incluent la végétation vanilla et la nouvelle décoration,
sur des corniches avec trois supports naturels ; les plantes de corniches
plus minces sont comptées séparément. Les cinq variantes de biome sont observées
sur les surfaces inférieures, avec respectivement cinq, trois et deux changements
verticaux contrôlés. Les surfaces inspectées comportent 5 805, 4 765 et 10 045
colonnes de pierre au sommet ; il ne sagit pas dun quota pour l’île entière.
Sur la graine 0, les sources `(-112, 103, 0)` et `(-108, 227, -96)` atteignent
Y=0 ; celle de `(-110, 148, -46)` rejoint un palier à Y=130. La première traverse
une frontière de chunks. Sur la graine 42, la source `(-62, 151, -82)` dégage
correctement son ouverture autrefois obstruée par du lichen et descend de
49 blocs ; les deux autres descendent de 103 et 236 blocs. Les trois cascades
de la graine 8675309 atteignent Y=0. Tous les écoulements observés sont reliés
à leur source, sans eau orpheline ni dépassement horizontal de lemprise.
Les bassins conservent leur eau ; les sédiments et leurs supports résistent aux
ticks de gravité. Les trois niches de lave gardent leurs 18 sources, leur coque
et leur accès sec. Le test de réentrée après consommation des marqueurs réussit
sur les trois graines : une modification ultérieure de la bouche reste intacte.
Les 52 fichiers historiques de génération suivis pour cette livraison gardent
leur SHA-256 davant modification.
Les cartes de surface, de corniches et les profils de cascade ont été examinés.
Ce sont des lectures de blocs ; le rendu dans le client reste à apprécier en
jeu. La grande rivière traversante nest pas activée : cette livraison adopte
les petits bassins et les sources de paroi. Les ressources restent observées
après génération, sans garantie de toute la progression Minecraft pour chaque graine.
## Validation alpha.5 — 8 septembre 2026
Les essais utilisent Minecraft 26.3-pre-2, Java 25 et le preset de production
sur des mondes neufs, sur Apple M1 à 8 Go. Le diagnostic attend les chunks
réellement simulables avant de mesurer 1 800 ticks de fluides.
Les dix tests serveur réussissent sur chacune des graines `0`, `42` et
`8675309`. La vérification finale `check build assemblePack`, avec les cartes de
densité et le relevé général facultatifs désactivés, réussit en **3 min 11 s**
sur la graine 0. Les contrôles ciblés de ressources, de biomes et de fluides
restent actifs. Les tâches de forme, dhydrologie et de lave réussissent aussi.
| Graine | Spawn naturel | Eau des bassins | Eau des cascades | Canne à sucre | Lave | Chunks FULL inspectés |
| --- | --- | ---: | ---: | ---: | ---: | ---: |
| `0` | `(0, 252, 0)` | 1 930 | 1 649 | 52 | 18 | 189 |
| `42` | `(0, 249, 0)` | 1 859 | 1 058 | 25 | 18 | 177 |
| `8675309` | `(0, 247, 0)` | 1 830 | 3 960 | 16 | 18 | 195 |
Sur la graine 0, les trois sources partent de `(-108, 227, -96)`,
`(-26, 203, -141)` et `(-82, 176, 141)` et atteignent toutes **Y=0**. Les trois
sources des graines 42 et 8675309 atteignent également Y=0. Les bassins conservent leur
volume ; la niche de lave conserve 18 sources et son accès praticable, sans
incendie détecté. Le cours deau reste continu à travers les frontières de chunks.
Les dépôts ont trois à cinq couches et deux supports naturels en dessous.
La rive sèche la plus éloignée de leau atteint une distance de Manhattan de
20 blocs sur la graine 0, 28 sur la graine 42 et 27 sur la graine 8675309. Les cartes montrent des plages
larges et asymétriques, des bandes de gravier et des interruptions par la roche
ou lherbe. Quelques petites poches restent anguleuses à l’échelle du bloc.
Les profils montrent les cascades réelles ; ces lectures de blocs ne remplacent
pas lappréciation du relief et des couleurs dans le client.
Les cinq biomes sont vérifiés dans des chunks réels. Dans les **189 chunks
inspectés de la graine 0**, le relevé compte 754 minerais de charbon, 464 de fer,
197 de cuivre, 215 dor, 210 de redstone, 23 de lapis et 14 de diamant. Ce sont
des blocs présents, pas des rendements de minage ni un total pour l’île entière.
Le bois, la pierre et les ressources renouvelables nont pas de plafond de
construction ajouté. La progression complète et l’équilibrage coopératif restent
à éprouver en partie.
Le calcul initial du plan hydrologique prend 23 623 ms dans la vérification
finale de la graine 0 et 24 475 ms dans lessai de la graine 42 ; la recherche
de lave ajoute respectivement 1 075 ms et 1 568 ms. Le plan est mis en cache par état aléatoire de monde,
sans charger de chunks voisins. Ces durées sont distinctes du chargement des
chunks de diagnostic.
Le premier essai court a révélé un défaut du banc de test : un chunk FULL muni
dun ticket pouvait encore attendre ses entités et ne pas exécuter ses ticks de
fluide. Le contrôle utilise désormais le prédicat exact du moteur et un témoin
indépendant par chunk de source. Un autre essai a rencontré trois blocs de chêne couché vanilla au niveau
supérieur dun étang. Le diagnostic conserve cette décoration et distingue le
volume deau prévu des sources restantes : seuls des troncs horizontaux de
surface jouxtant une source, avec de leau dessous ou le fond peu profond
plein, sont acceptés. Leur position et leur état exacts, lappui ou leau sous
le bois, les parois et le reste des sources sont vérifiés
après simulation. Le contrôle de continuité du cours deau reste strict.
Le dernier essai de la graine 8675309 conserve les 1 830 sources prévues sans
tronc dans l’étang ; le décor vanilla peut varier avec lordre de génération
des chunks, tandis que le plan Sanctuary reste identique.
Deux arbres sur des paliers de la troisième graine dévient aussi les cascades.
Le trajet sur densité nue ne prévoit pas ces feuilles. Le diagnostic final
compare cette prévision aux blocs réels, puis vérifie les composantes deau
par connexions de face : toute composante hors bassin doit rejoindre une source
déclarée. Aucune eau ne doit toucher un chunk horizontal non inspecté. Lemprise
reste celle prévue initialement avec son halo dun chunk, sans élargissement
après observation des écoulements. Sur la graine 8675309, les trois composantes
comptent 2 445, 1 152 et 363 blocs deau après simulation ; toutes rejoignent
leur source et restent entièrement dans les chunks inspectés.
Les anciennes classes et ressources de terrain et dhydrologie sont également
comparées octet par octet avec lalpha.4.
Journaux : `build/alpha5-build.log`, `build/alpha5-seed42-final.log` et
`build/alpha5-seed8675309-provenance.log`. Les exports JSON/PNG sont dans le dossier
`diagnostics` décrit plus haut. Le dernier contrôle par composantes deau est
exécuté sur les graines 8675309 et 0 ; lessai réussi de la graine 42 utilisait
encore le contrôle plus restrictif du trajet prévu sur densité nue. Le code de
génération est identique entre ces essais.
## Validation alpha.4 — 8 septembre 2026
Les tests serveur utilisent le preset de production et des mondes neufs. Sur
la graine `0`, le scénario exige un véritable site `STREAM` ; les autres graines
vérifient la continuité de chaque cours deau quelles produisent, sans exiger
quune graine arbitraire soit artificiellement complétée.
| Graine | Spawn naturel | Eau après 200 ticks | Canne à sucre | Chunks FULL inspectés | Raccords deau aux frontières |
| --- | --- | ---: | ---: | ---: | ---: |
| `0` | `(0, 251, -4)` | 1 938 | 15 | 94 | 253 |
| `42` | `(-4, 249, -4)` | 1 501 | 24 | 94 | 213 |
| `8675309` | `(0, 247, 0)` | 1 551 | 12 | 90 | 190 |
Pour la graine `0`, le cours deau est à **Y=250**, de **X=48, Z=48** à
**X=20, Z=20**. Son chemin suit 18 points et relie deux petites poches deau.
Deux petits lacs et quatre étangs sont également présents, en comptant la poche
de départ du cours deau. La graine `42` produit elle aussi un cours deau, à
Y=221, de `(72, 24)` à `(60, 40)` en X/Z. Ce sont des observations de ces
graines, pas un minimum promis pour toutes les îles.
**10/10 tests requis réussissent sur chacune des trois graines**, avec un cours
deau observé sur chacune. Les contrôles comparent chaque bloc deau avant et après une simulation réelle
confirmée par un témoin d’écoulement et lactivité de tous les chunks concernés.
Les quantités deau restent identiques. Les cartes des vrais blocs ont été
inspectées : les lacs sont arrondis et les chenaux restent continus. Le tracé
des cours deau comporte encore des segments géométriques ; lappréciation du
relief, des berges et de leur aspect dans le client reste à faire par le joueur.
Les cartes masquent la canopée et ne remplacent pas une vue en jeu.
Le plan initial prend **12 060 ms** pour la graine `0` et **8 743 ms** pour `42`
et **9 755 ms** pour `8675309`, sur le poste Apple M1 à 8 Go utilisé pendant ces
essais. Il est calculé une seule
fois par état aléatoire de monde, sans charger les chunks voisins. La préparation
des 94 chunks FULL de chaque diagnostic est distincte du calcul du plan et
ne représente pas le travail requis à chaque lancement de partie.
Les trois exécutions serveur réussies ont été suivies de
`./gradlew check build assemblePack -x :sanctuary:runGameTest` : le serveur déjà
validé séparément nest pas relancé à lidentique. Les tests de forme et
dhydrologie pure, la compilation et lassemblage du pack réussissent en 2 s.
Le JAR ne contient aucune classe de test, et le `.mrpack` contient exactement
ce même JAR, avec les versions Minecraft et Fabric attendues.
Journaux : `build/alpha4-hydrology-v2-seed0.log` et
`build/alpha4-validation-seed42.log`, `build/alpha4-validation-seed8675309.log`
et `build/alpha4-build.log`. Les exports correspondants sont dans
le dossier `diagnostics` décrit plus haut. Les cartes de densité, inchangées
par lhydrologie, ont été exportées lors des premières exécutions de ce ticket ;
les assertions de densité restent actives pendant chaque validation.
## Validation alpha.3 — 8 septembre 2026
Sur Java 25 / Minecraft 26.3-pre-2 / Fabric Loader 0.19.5 :
| Vérification | Résultat |
| --- | --- |
| `check build assemblePack` avec relevé complet, graine `0` | 8/8 tests requis réussis ; 14 min 49 s, dont le relevé complet |
| Serveur neuf, graine `42` | 8/8 réussis ; 1 min 3 s |
| Serveur neuf, graine `8675309` | 8/8 réussis ; 1 min 4 s |
| Test client facultatif | Réussi en 23 s ; les deux injections de rendu sont appliquées |
La graine `0` place le spawn naturel en `(0, 251, -4)` ; la graine `42` en
`(0, 249, 0)` et la graine `8675309` en `(0, 247, 0)`. Les tests confirment les 384 blocs du nouveau monde, les nuages
relevés, le vide inférieur et extérieur et la conservation des anciens réglages.
Les coupes des trois graines ont été inspectées : l'ancienne silhouette est
relevée et le dessous devient irrégulier. Une comparaison supplémentaire de
1 039 155 échantillons de l'ancienne géométrie refactorée donne des densités
identiques bit à bit à l'alpha.2.
Le relevé complet constate **8 584 514 blocs non vides** dans les 1 444 chunks
de l'enveloppe définie. Sa préparation prend 13 min 2,659 s, son comptage et sa
préparation JSON 135 ms, sur un Apple M1 avec 8 Go de mémoire. Ce poste exécute
d'autres applications et a aussi exécuté le test client pendant le relevé :
c'est une mesure locale, pas une promesse de performance. Les quantités exactes
et les exclusions figurent dans [la référence de ressources](expansion.md).
Les journaux sont `build/alpha3-validation-seed0.log`,
`build/alpha3-validation-seed42.log`, `build/alpha3-validation-seed8675309.log`
et `build/alpha3-client-test.log`. Le JAR alpha.3 a été inspecté : aucune classe
de test n'est distribuée. Le `.mrpack` contient exactement le JAR vérifié.
Le test client valide le chargement et l'application des mixins. Il n'ouvre
aucun monde et ne remplace donc pas l'essai visuel en vol décrit plus haut.
## Historique : validation alpha.2 — 8 septembre 2026
Commande `./gradlew check build assemblePack --console=plain` réussie en **1 min 10 s**
sur Java **25**, Minecraft **26.3-pre-2**, Fabric Loader **0.19.5**, Fabric API
**0.160.0+26.3** et Loom **1.17.20**, pour Sanctuary **0.1.0-alpha.2**.
Les deux commandes supplémentaires de graines ont ensuite été exécutées
séquentiellement, chacune sur un monde de développement neuf.
| Graine | Spawn naturel initial | Tests requis | Durée des tests | Durée Gradle |
| --- | --- | --- | --- | --- |
| `0` | `(-4, 187, -4)` | 5/5 réussis | 51,40 s, diagnostics compris | 1 min 10 s, build et pack compris |
| `42` | `(0, 185, 0)` | 5/5 réussis | 1,843 s | 20 s |
| `8675309` | `(0, 183, 0)` | 5/5 réussis | 1,681 s | 17 s |
Les cinq tests requis comprennent les quatre tests Sanctuary et le test du
framework. Pour chacune des trois graines, le spawn possède naturellement une
zone sèche de 3×3 avec deux blocs libres ; les douze chunks extérieurs inspectés
au statut `FULL` sont vides. Aucun repli sur une colonne seule n'a été nécessaire.
- Les invariants `WorldgenSmoke`, le chargement des codecs et registres, la
reproductibilité des densités et l'absence de matière ajoutée par la sculpture
ont été vérifiés.
- Les trois diagnostics PNG et CSV ont été produits avec la densité actuelle.
Leur calcul synchrone explique la durée plus longue du test de graine `0` et
son avertissement serveur « Can't keep up » ; ce diagnostic est absent du mod
distribué.
- La compilation du JAR, l'assemblage dans `build/packwiz/` et la vérification des
versions et empreintes du pack ont réussi.
- Le JAR `mods/sanctuary/build/libs/sanctuary-0.1.0-alpha.2.jar` ne contient aucune
classe ni configuration de mixin GameTest.
Les journaux de cette validation sont conservés localement dans
`build/alpha2-validation-seed0.log`, `build/alpha2-validation-seed42.log` et
`build/alpha2-validation-seed8675309.log`. Les journaux courants de Minecraft sont
dans `mods/sanctuary/build/run/gameTest/logs/` et sont remplacés au prochain test.
Ces preuves et les diagnostics restent ignorés par Git. Les vérifications
manuelles ci-dessous restent à effectuer ; les tests n'ont ouvert ni modifié
aucune sauvegarde de joueur.
La fondation alpha.1 avait été validée le même jour sur la graine `0`, avec un
spawn `(0, 118, 0)` reposant sur l'ancien noyau imposé. Ce résultat historique
ne décrit plus la génération alpha.2.
## Vérifications manuelles restantes
- Créer un monde avec le preset Sanctuary dans le client et évaluer visuellement
la côte, les trous, les surplombs, la végétation et la lecture du vide.
- Rejoindre à plusieurs joueurs, mourir et réapparaître ; les tests headless ne
simulent pas de connexion client ni les offsets de réapparition des joueurs.
- Modifier le spawn administrateur, arrêter puis recharger le monde et vérifier
sa conservation. Le test automatique couvre le premier démarrage, pas un cycle
de sauvegarde et de redémarrage complet.
- Explorer plusieurs seeds dans le client. Les tests compilent trois seeds et
chaque invocation génère des chunks complets pour la seed demandée ; leur
échantillonnage extérieur ne constitue pas une inspection exhaustive de toutes
les coordonnées.
- Tester les resource packs, shaders et mods communautaires après leur ajout et
vérification de compatibilité avec la version exacte du pack.