Compare commits

...
Author SHA1 Message Date
koka ea1d84160d Integrate rare chickens, aptitude prices and JEI search (beta.324)
Build Sanctuary / build (push) Canceled after 0s
2026-10-31 13:30:43 +01:00
koka 7ca566292f feat: simplify drying racks to two upright foods (beta.322) 2026-10-31 13:09:00 +01:00
koka 0c68545b63 docs: record verified beta.321 deployment
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 11:37:05 +01:00
koka 4e2b120bf2 docs: prepare beta.321 release notes
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 11:26:59 +01:00
koka 352c166b6d fix: refine culinary models and adaptive atlas (beta.321) 2026-10-30 10:33:27 +01:00
koka f3b559b23b Record beta.320 deployment to Beta server and Sanctuary website
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 09:16:20 +01:00
koka 5869f85ec3 Document beta.320 release notes
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 09:03:08 +01:00
koka e5df72bdbe Prepare beta.320: dairy churn, direct cuisine, exact-height maps and seasonal insects
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 08:55:58 +01:00
koka 163618ed54 Consigne la livraison beta.318 du serveur, du site et de Prism
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 07:17:37 +01:00
koka de6e11848a Prépare les notes de publication beta.318
Build Sanctuary / build (push) Canceled after 0s
2026-10-30 06:52:51 +01:00
koka 303210124e Consigne l’installation locale de beta.318 dans Prism 2026-10-30 06:44:48 +01:00
koka 980544e279 Ajoute les 18 recettes séchées et les réactions épicées beta.318 2026-10-30 06:26:53 +01:00
koka 7ef4d51a59 Ajoute les provisions séchées et le guide culinaire beta.317 2026-10-30 05:38:54 +01:00
koka 7b56c3cd78 Add climate-based survival foraging and the nine-island food wiki 2026-10-30 01:01:52 +01:00
koka bb61547b07 Align current beta.315 summary with published status
Build Sanctuary / build (push) Canceled after 0s
2026-10-29 10:09:41 +01:00
koka ebd35184b7 Record verified beta.315 rollout and editable texture export
Build Sanctuary / build (push) Canceled after 0s
2026-10-29 10:07:46 +01:00
koka 359f49792b Prepare It's Alive texture editing kit and beta.315 release notes
Build Sanctuary / build (push) Canceled after 0s
2026-10-29 09:49:29 +01:00
koka 4cbf350e01 Add placed cured sausage with four shared slices (beta.315) 2026-10-29 09:05:46 +01:00
koka 03935e9c89 Add shared cheese wheels and real-time wine maturation (beta.314) 2026-10-29 08:25:50 +01:00
koka 72c709ebc7 Add native sausage preparation and four-hook drying rack (beta.313) 2026-10-29 05:33:48 +01:00
koka addc4bb4db Repeat the chosen cauldron recipe across supply and serving (beta.312) 2026-10-29 04:38:03 +01:00
koka 228a953475 Start cauldron cooking by stirring and preserve ingredient containers (beta.311) 2026-10-29 04:00:59 +01:00
koka 91db17450a Stack frying pans with one paid recipe per pile (beta.310) 2026-10-28 21:15:25 +01:00
koka 36941f611f Keep one oven output and manual ingredient loading (beta.309) 2026-10-28 19:56:50 +01:00
koka 9dd63f683a Refine oven preparation and automatic cooking (beta.308) 2026-10-28 18:59:08 +01:00
koka 60bc773b80 Replace mill recipe redstone with a manual handle (beta.307) 2026-10-28 18:32:48 +01:00
koka 9fd380b782 Make the mill manual like native stonecutting (beta.306) 2026-10-28 18:07:35 +01:00
koka ca5e350e4a Replace food press with layered fruit crushing (beta.305) 2026-10-28 15:02:40 +01:00
koka feaf9ca62c Port culinary appliances and timed recipes for beta.304 2026-10-28 14:13:50 +01:00
koka a60937f77d Import 26.2 food recipes with native crafting and cooking (beta.303) 2026-10-28 09:20:23 +01:00
koka 930719d75e Rework vanilla growth textures at 16x16 (beta.302) 2026-10-28 08:01:19 +01:00
koka 394e22d805 Add upward tree-climbing vanilla with integrated sprites (beta.301) 2026-10-28 07:49:39 +01:00
koka ed11cd77a5 Port It's Alive crops, fruit trees and coffee to 26.3 (beta.300) 2026-10-28 07:11:42 +01:00
koka d78d39cd1b Import It's Alive agriculture and cooking textures for 26.3 (beta.299) 2026-10-28 06:17:33 +01:00
koka 77fdabfb4d docs: record complete beta.298 deployment
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 06:02:41 +01:00
koka fb8705369e docs: align beta.298 server kit instructions
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 05:58:46 +01:00
koka c3d1443732 docs: prepare beta.298 release notes
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 05:57:03 +01:00
koka 1967342247 fix: exclude invisible media anchors from PBR normals
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 05:36:47 +01:00
koka 89db24d7c2 docs: record complete beta.297 deployment
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 05:05:31 +01:00
koka bad2bdb0d1 docs: prepare beta.297 release notes
Build Sanctuary / build (push) Canceled after 0s
2026-10-27 04:56:22 +01:00
koka 098a5aa1bd fix: correct media frame interaction and side geometry
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 18:02:18 +01:00
koka 8b1ae25256 docs: record completed beta.296 media delivery
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 16:58:18 +01:00
koka 9674e7f3c5 Integrate shared media screens and prepare Sanctuary beta.296
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 16:42:47 +01:00
koka 4e00f028ec Merge remote-tracking branch 'origin/main' into codex/media-beta296 2026-10-26 16:28:28 +01:00
koka 584a075663 feat: add free resizable media anchors with native Dream controls 2026-10-26 10:25:57 +01:00
koka 45ea66987f feat: synchronize experimental media and add per-client video acoustics 2026-10-26 08:30:11 +01:00
koka af18f6e014 test: prototype shared Dream playback with two Vulkan clients 2026-10-26 07:23:03 +01:00
koka 34cdcfd00e docs: synchronize README through beta.295
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 06:42:57 +01:00
koka 679c0f8a5f docs: study shared media displays and placement contract 2026-10-26 06:37:12 +01:00
koka c0b6b14e89 docs: record completed beta.295 delivery
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 06:30:17 +01:00
koka 2734c2383a Add the default Sanctuary server and pack favicon (beta.295)
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 06:24:03 +01:00
koka 74dc1265a8 docs: record completed beta.293 delivery
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 04:31:27 +01:00
koka 678d77fb91 Integrate Happy Creepers and prepare the complete beta.293 update
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 04:23:06 +01:00
koka 97c601cd7f Add Sanctuary packwiz branding and optional pack mods (beta.292) 2026-10-26 03:59:53 +01:00
koka a93e261120 feat: import flying ghost whale and native egg (beta.290) 2026-10-26 02:45:21 +01:00
koka 72f1cf50ae docs: record completed beta.289 delivery
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 01:35:04 +01:00
koka 6821f6ee12 Package the verified zombie and light updates for the managed Beta release (beta.289)
Build Sanctuary / build (push) Canceled after 0s
2026-10-26 01:21:39 +01:00
koka 85d274f2ef Add special infected, shared zombie skins and held light fix (beta.288) 2026-10-26 01:12:06 +01:00
koka 235e3c08b7 Fix distant atlas surveys and add archipelago zoom (beta.279) 2026-10-25 04:10:15 +01:00
koka 697e4a205f Add inhabited claims, resident menus and consented Battle transfers (beta.278)
Build Sanctuary / build (push) Canceled after 0s
Reshape Inhabitant and Pause around the unlocked Atlas, add chunk ownership with Demeure influence priority, and draw connected ownership/protection contours.

Add eight-sapphire three-day protection and explicit two-player Battle stakes with durable, idempotent claim settlement. Preserve existing claims, protection periods and save schemas.

Validated check build assemblePack with 40 targeted server tests, 26 duel-journal checks, and Vulkan FR/EN GUI 2/3/4 flows. Verified the local beta.278 MRpack; generated artifacts remain untracked.
2026-10-25 03:48:01 +01:00
1035 changed files with 55466 additions and 410 deletions
+3
View File
@@ -2,6 +2,9 @@
Ce dépôt contient le pack Sanctuary et ses mods. Lire `README.md`, puis le ticket concerné.
La vision est dans `docs/vision.md` ; elle décrit aussi des fonctionnalités futures.
Pour développer/livrer le site, packwiz, la Beta dédiée et Prism local, lire
`docs/updates.md`. La compétence personnelle `sanctuary-updates` mémorise les
chemins et accès propres au poste ; ne pas déduire une publication d'un simple push.
- Avant une modification, lire l'état Git et préserver les changements existants.
- Un ticket correspond à un résultat jouable ou vérifiable et à une branche `codex/<sujet>`.
+113
View File
@@ -1,3 +1,116 @@
# beta.293 — Happy Creepers, logo packwiz et mods facultatifs
- Intégration de la branche `codex/happy-creepers` avec les baleines beta.290.
- Logo Sanctuary pendant packwiz et outils prêts dans le ZIP Prism.
- Simple Voice Chat, Bobby facultatif, Lithium et Entity Culling épinglés pour 26.3.
- Même canal et même instance Prism, profils client/serveur et sauvegardes conservés.
- [Contrat et reçu de livraison](docs/release-beta293.md).
# beta.290 — Baleine fantôme volante
- Import de l’IA, du modèle animé, de la texture et des effets de la baleine Sanctuary 26.2.
- Deux baleines chargées pour le serveur entier, toutes dimensions et sources d’apparition comprises.
- Œuf créatif personnalisé depuis la texture native `egg.png` de Minecraft 26.3, silhouette et ombres conservées.
- Refus d’un troisième œuf avant consommation, libellés FR/EN et calendrier propre à chaque serveur.
- [Contrat et vérifications](docs/flying-whale-beta290.md).
# beta.278 — Duel Battle pour un claim consenti
- Proposition depuis le clic droit d’un claim déjà revendiqué ; propriétaire et challenger valident le même enjeu.
- Challenger ayant habité le chunk, propriétaire connecté, Carte active et disponibilité Battle contrôlés côté serveur.
- Battle privé à deux joueurs : consentement sur le claim, puis confirmations Prêt natives ; aucun tiers admis.
- Transfert du seul claim au vainqueur, avec l’échéance de protection conservée et actualisation de la carte/minage.
- Refus, annulation avant lancement, égalité et interruption sans résultat durable ne transfèrent rien.
- Journal additif de consentement/résultat, application atomique et reprise idempotente ; anciens formats conservés.
- Interface de lecture et acceptation FR/EN, enjeu explicite dans Battle, navigation corrigée entre propositions.
- [Contrat et vérifications](docs/claim-battle-beta278.md).
# beta.277 — Claims liés à Demeure
- Habitation Demeure obligatoire avant de revendiquer un chunk libre ; simple traversée insuffisante.
- Priorité à l’habitant le plus influent, avec départage par l’ordre des premières traces en cas d’égalité.
- Un habitant plus influent peut prendre le spot tant qu’il n’a pas été revendiqué ; aucun transfert automatique après acquisition.
- Vérification serveur avant réservation ou débit, et sauvegarde des traces avant achat.
- Carte : condition expliquée, nom/couleur du joueur prioritaire, action bloquée quand nécessaire et actualisation du terrain libre.
- Claims antérieurs, protections, tarifs et formats de sauvegarde conservés ; aucun délai supplémentaire ni duel ajouté.
- [Règles et vérifications](docs/claim-demeure-beta277.md).
# beta.276 — Contours CTM et nouvelle protection des claims
- Propriétés sans protection visibles par leur contour, aux couleurs de leur propriétaire.
- Contours raccordés sur les côtés et angles, sans frontières entre chunks d’un même joueur.
- Fond coloré sur les chunks protégés ; contour conservé après expiration.
- Actualisation des contours voisins après un achat, dans l’Atlas et l’aperçu de Pause ; masquage conservé.
- Protection : 8 saphirs par chunk pour trois jours de serveur en marche ; renouvellements ajoutés au temps restant.
- Durées déjà achetées et reçus de sept jours en attente conservés, sans changement de schéma.
- Libellés FR/EN et légende incluant aussi les propriétés sans protection.
- [Contrat et vérifications](docs/claim-contours-beta276.md).
# beta.275 — Habitant et menu Pause centrés sur l’Atlas
- Retrait du conseil d’arrivée « première propriété gratuite » et du bouton Propriété d’Habitant.
- Propriétés verrouillées côté serveur et client avant l’aptitude Carte achetée et active ; ancien accès carte locale bloqué.
- Habitant : statistiques sans fond à gauche, personnage centré, biographie à droite ; navigation Factions / Familier.
- Activité et Historique retirés de cette fiche ; données conservées.
- Durée de jeu en jours, heures, minutes et secondes entières, sans minutes décimales.
- Pause sans Carte conservée ; avec Carte, Gazette et Tableau dans leurs colonnes latérales, carte au centre.
- Aventure à gauche et Communauté à droite au-dessus de la carte, y compris en grande vue ; Partie et ses actions natives dessous.
- Mise à jour automatique de Pause lors du déblocage ou de la désactivation de Carte ; droits et protections acquis conservés.
- [Contrat et vérifications](docs/menu-atlas-beta275.md).
# beta.274 — Calques de territoire continus
- Fiche Habitant conservée et claims actuels accessibles, selon la clarification du créateur.
- Refonte des règles de propriété, habitation préalable, départage par Battle et nouveau tarif consignés pour la reprise.
- Demeure sans cadres de chunks ; intensité liée à la part relative d’influence et actualisée quand celle-ci change.
- Protections actives rendues en couleur unie dans la même texture de pixels que Demeure, sans bouclier ni pointillés.
- Zones protégées adjacentes d’un propriétaire raccordées ; légende compacte couleur / personnage, avec masquage conservé.
- Aperçu de Pause teinté directement dans ses pixels, avec brouillard et vide conservés.
- Infobulle Demeure « Présence et influence d’habitation » en FR/EN ; retrait de « aucun claim ni protection ».
- Aucun changement des données, droits, prix ou durées ; aucune attribution depuis Demeure ni aucun transfert par duel automatique.
- [Contrat et vérifications](docs/demeure-overlay-beta274.md).
# beta.273 — Claims aux couleurs de leurs propriétaires
- Teinte et bordure utilisent la couleur persistante Hello World du propriétaire, y compris déconnecté.
- Protection active : bordure pleine et bouclier ; sans protection : bordure en pointillés.
- Bouton Propriétés : oui/non, partagé avec l’aperçu de Pause ; clic droit conservé quand les claims sont masqués.
- Apparition automatique avec les tuiles de la carte proche, de l’Atlas et de l’aperçu de Pause.
- Achats actualisant le claim visible ; expiration modifiant le style sans retirer la propriété.
- Légende et survol FR/EN avec nom et durée restante ; terrain inconnu non révélé.
- Aucun changement du registre, des prix, de la durée ou des droits.
- [Contrat et vérifications](docs/claim-map-beta273.md).
# beta.272 — Claims et protection sur la carte
- Clic droit sur un chunk : panneau de revendication ou de protection sur la carte, sans grille ni changement de page.
- Propriété ouvre directement la carte ; terrain proche visible dès Hello World, Atlas complet conservant ses prérequis.
- Cinq chunks gratuits par joueur, puis 100 points d’XP supplémentaires à chaque nouveau claim.
- 64 saphirs par chunk ajoutent sept jours de serveur en marche ; aucun temps décompté pendant l’arrêt.
- Minage ×2 pour le propriétaire et ×0,5 pour les autres pendant la couverture ; pose et interactions ordinaires.
- Nouveau registre séparé, achats avec reçu natif et migration volontaire des anciens volumes remboursant leurs extensions.
- Stabilisation de la sauvegarde des statistiques à la fermeture face au nettoyage de déconnexion.
- [Contrat, migration et vérifications](docs/chunk-claims-beta272.md).
# beta.271 — fiche Habitant, statistiques et activité
- Combats rétabli dans Communauté sous Habitant ; Story retiré de Pause.
- Navigation Propriété, Factions et Familier en haut ; personnage aéré à gauche et biographie à droite.
- Six compteurs personnels sous la biographie, lus dans Minecraft et le Blocodex.
- Activité sous le personnage jusqu’en bas, avec défilement et bouton Historique dans son pied de panneau.
- Publications personnelles, progrès et progression réunis sans nouveau format de sauvegarde.
- Aperçu du familier retiré d'Habitant ; réglages et consentement regroupés dans sa page dédiée.
- [Contrat, sources et vérifications](docs/inhabitant-menu-beta271.md).
# beta.270 — première propriété d’habitant
- Faction et Battle déplacés de Pause vers la fiche Habitant, avec un accès Propriété.
- Une réservation gratuite après Hello World, dans un volume fini indépendant des chunks.
- Quatre extensions de 100 à 400 points d’XP, sauvegardées avec un reçu natif.
- Contrôles serveur du minage, de la pose et des interactions des autres joueurs ; terrains libres jouables.
- Menu natif FR/EN, commandes `/sanctuary property`, `propriete` et `propriété`, aperçu sans écriture de terrain.
- [Contrat, sauvegarde additive et limites de protection](docs/property-beta270.md).
# beta.172 — cartes de horde utilisables en jeu
- Suppression de la restriction au cercle laboratoire : une carte peut ouvrir
+599 -11
View File
@@ -1,11 +1,596 @@
# Sanctuary
[Dernière release : beta.321](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.321) ·
[Reçu de livraison](docs/release-beta321.md) ·
[Installation et mises à jour](docs/packwiz.md).
Les **quatre expansions validées sont disponibles dans Sanctuary normal** :
Nord glacial, Sud des canyons, Ouest océanique et Est volcanique.
Créer un monde **Sanctuary** en Petit, Moyen ou Grand, puis activer les ancres
correspondantes. Le module Sanctuary Test n’est pas requis.
[Intégration et vérification du pack beta.224](docs/four-islands-base224.md).
## beta.324 — regroupement des nouveautés
[Lot intégré et validé](docs/integration-beta324.md) : poules colorées rares,
aptitudes rééquilibrées avec conservation des anciens achats, recherche JEI
corrigée et séchoir beta.322 à deux aliments. **221 tests serveur** et parcours
commun **Vulkan avec Sodium** réussis. [Notes de version](docs/notes-beta324.md).
## beta.322 — séchoir à deux aliments (préparation locale)
[IA-14 : séchoir et fabrications](docs/drying-rack-beta322.md). Deux aliments
indépendants, affichage plus grand et droit, séchoir sans fil et moulin sans
tailleur de pierre. Le surplus des anciens séchoirs est conservé en attente
avec sa progression. Préparation sur la même branche, sans publication.
## beta.321 — carte adaptative et modèles culinaires livrés
[Livraison vérifiée](docs/release-beta321.md) : serveur Beta, canal client/serveur
et téléchargement du site en beta.321. Carte de surface en extérieur et coupe
à hauteur du joueur en intérieur, y compris dans Pause ; baratte ouverte en
bois, saucissons en pavés et noms FR/EN corrigés. **55 tests serveur**, packs
vérifiés et JAR identique aux parcours de préparation **Vulkan avec Sodium**.
La même instance Prism récupère la mise à jour à son prochain lancement.
## beta.320 — cuisine, carte et activité saisonnière livrées
[Regroupement des trois chantiers](docs/integration-beta320.md) : cuisine directe
et baratte, carte et aperçu Pause à la hauteur exacte du joueur, insectes
adaptés à la saison, au soleil et à la météo. [Livraison vérifiée](docs/release-beta320.md) :
serveur Beta actif, canal client/serveur et téléchargement du site en beta.320.
La même instance Prism suivra ce canal à son prochain lancement.
**241 tests serveur**, trois parcours réunis sous **Vulkan avec Sodium** et
packs assemblés ; [reçu de vérification](docs/integration-beta320-verification.json).
## beta.319 — cuisine directe et baratte (intégrée au lot beta.320)
[IA-12 : cuisine directe, chaudron Minecraft et semences naturelles](docs/cuisine-beta319.md).
Les préparations artificielles quittent les fabrications, le créatif et JEI ;
les anciens stocks restent cuisinables. La [baratte](docs/wiki/alimentation/laitages.md)
fait reposer le lait pour la crème, puis travaille beurre, crème fouettée et
beurre aux herbes. Ce chantier est livré avec beta.320 ; les anciennes
préparations stockées restent utilisables.
## beta.318 — récoltes et recettes séchées livrées
[Les 18 nouvelles recettes et leur fonctionnement](docs/dried-cuisine-beta318.md) :
pains, biscuits, sandwichs, plats au chaudron, salade, dessert, provisions et épices.
Le saucisson pimenté se prépare, sèche puis se pose pour partager quatre tranches.
Manger épicé produit deux petits coups visuels et sonores sans dégât.
[Ingrédients, quantités, appareils et durées](docs/wiki/alimentation/sechoir.md).
[Livraison complète](docs/release-beta318.md) : serveur Beta, téléchargement du
site et même instance Prism à jour sur le canal public. Build et packs vérifiés,
**204 tests serveur**, **7 tests du site** et binaire du parcours **Vulkan avec Sodium**.
## beta.317 — produits séchés (préparation locale)
[Viande, poissons, fruits, herbes et vanille au séchoir](docs/drying-foods-beta317.md) :
15 recettes avec leurs propres durées, 12 objets supplémentaires, quatre crochets
indépendants. Les herbes et piments séchés rejoignent la cuisine existante.
[Recettes et 18 propositions de combinaisons](docs/wiki/alimentation/sechoir.md).
Même branche locale, sans publication ni installation. Build et packs vérifiés,
**179 tests serveur** et parcours **Vulkan avec Sodium** réussis.
## beta.316 — découverte alimentaire en survie (préparation locale)
[IA-09 : récolter et rapporter les premières semences](docs/foraging-beta316.md).
Plantes sauvages, fruitiers, café et vanille répartis par habitat sur les neuf îles ;
solutions de découverte dans les terrains déjà explorés, sans repeuplement.
[Guide et pages des îles](docs/wiki/alimentation/README.md) ·
[Planche illustrée](docs/wiki/alimentation/planche.html). Même branche locale ;
aucune publication ou installation par ce ticket.
Build et packs vérifiés, **85 tests serveur** et parcours **Vulkan avec Sodium**
réussis ; premières récoltes et sauvegarde sur le preset Sanctuary actuel.
## beta.315 — cuisine et agriculture livrées
[Livraison complète vérifiée](docs/release-beta315.md) : les incréments locaux
beta.299 à beta.315 sont publiés et installés sur la Beta dédiée, le site et
la même instance Prism. **187 tests serveur** et artefacts vérifiés ;
sauvegardes et réglages conservés. [Textures modifiables](docs/itsalive-textures-export-beta315.md).
### Saucisson posé en tranches
[Poser le saucisson séché et partager quatre tranches](docs/sausage-slices-beta315.md).
Même objet après le séchoir, quatre orientations, modèle qui raccourcit et
chair visible sur la coupe. Deux points de nourriture par tranche, sons natifs
et parts restantes conservées après sauvegarde. Préparation locale vérifiée avant cette publication. Build et packwiz, **134 tests serveur** et deux
parcours **Vulkan avec Sodium** réussis : séchoir, pose payée, quatre prises,
sauvegarde orientée, seize états de rendu et sons natifs.
## beta.314 — fromage à partager et vins de garde (préparation locale)
[Poser et partager le fromage, choisir la qualité du vin](docs/cheese-wine-beta314.md).
Le fromage garde son objet historique et se mange en sept parts posées,
comme un gâteau. Le vin jeune garde ses trois minutes de fermentation ;
le laisser dans le tonneau donne du vin de table après **un jour réel**,
de réserve après **trois jours** et un grand cru après **sept jours**,
même jeu fermé. Quatre objets/qualités, HUD FR/EN, recettes JEI et sortie
compatible avec les entonnoirs. Même branche locale, sans publication ou
installation. Build et packwiz, **126 tests serveur** et parcours **Vulkan
avec Sodium** réussis : sept parts, face de coupe, sauvegarde, jours réels,
qualités, collecte et consommation.
## beta.313 — saucisson au séchoir (préparation locale)
[Préparer le saucisson, puis le suspendre cinq minutes](docs/drying-rack-beta313.md).
Séchoir en bois sans combustible ni menu, quatre crochets indépendants,
pluie et immersion qui suspendent le séchage, toit protecteur et reprise
après sauvegarde. Recettes à l’établi, modèles cubiques aux textures vanilla,
HUD FR/EN et découverte dans JEI. Même branche locale, sans publication ou
installation. Build et packwiz, **112 tests serveur** et parcours
**Vulkan avec Sodium** réussis : fabrication, quatre crochets, humidité,
sauvegarde, collecte et consommation.
## beta.312 — recettes répétées au même chaudron (préparation locale)
[Un premier coup de bâton mémorise la recette](docs/cauldron-repeat-beta312.md).
Réapprovisionner avec les mêmes ingrédients et servir les plats ne demandent
plus de recommencer. Les ajouts en cours attendent leur lot complet ; la
sortie s’accumule et une sortie pleine attend de la place. Maj-clic à main
vide arrête la série. Même branche locale, sans publication ou installation.
Build et packwiz, **100 tests serveur** et parcours **Vulkan avec Sodium**
réussis : quatre lots après un geste, réassort, service, rechargement et arrêt.
## beta.311 — chaudron préparé puis remué (préparation locale)
[Ajouter les ingrédients, puis remuer avec un bâton](docs/cauldron-beta311.md).
Le chaudron attend le geste, conserve les mélanges incomplets et rend le seau
du lait seulement à la cuisson terminée. Toute modification demande de
remuer à nouveau ; les restes ne lancent pas une nouvelle recette. Sons
natifs discrets à l’ajout, au geste, pendant la cuisson et au service.
Même branche locale, sans publication ou installation. Build et packwiz,
**89 tests serveur** et parcours **Vulkan avec Sodium et contrôle audio**
réussis.
## beta.310 — poêles en ligne et piles de quatre (préparation locale)
[Une recette commune par pile de une à quatre poêles](docs/pan-stacks-beta310.md).
Chaque portion paie ses ingrédients, y compris les seaux de lait conservés
dans des réserves natives. Des piles voisines peuvent cuire des plats
différents, chacune avec sa chaleur par-dessous. Contenu visible, HUD FR/EN,
casse et continuité des anciennes cases documentés. Même branche locale,
sans publication ou installation. Build et packwiz, **76 tests serveur**
et parcours **Vulkan avec Sodium** réussis.
## beta.309 — une seule sortie de cuisinière (préparation locale)
[La cuisinière garde une seule sortie, comme un four](docs/oven-single-output-beta309.md).
La case d'aperçu disparaît. La grille se remplit à la main ; un entonnoir
dessous peut récupérer les plats cuits. Consommation en fin de cuisson,
annulation des modifications et poursuite avec le menu fermé conservées.
Même branche locale, sans publication ou installation.
Build et packwiz, **63 tests serveur** et parcours **Vulkan avec Sodium**
réussis ; sortie unique, entonnoirs et décalage du feu vérifiés.
## beta.308 — cuisinière automatique (préparation locale)
[Grille de préparation et cuisson comme un four](docs/oven-beta308.md) :
aperçu séparé, ingrédients consommés uniquement en fin de cuisson, annulation
si la grille change et lots successifs avec le menu fermé. Treize recettes de
cuisine, combustible natif et sortie réservée aux plats terminés.
Même branche locale, sans publication ou installation.
Build et packwiz, **63 tests serveur** et parcours **Vulkan avec Sodium**
réussis : grille modifiable, annulation, lots avec le menu fermé, menus FR/EN,
sortie et rechargement réel.
## beta.307 — recette du moulin manuel (préparation locale)
[La recette remplace la redstone par un bâton](docs/mill-recipe-beta307.md)
pour représenter la poignée, avec les trois dalles de pierre lisse, deux
lingots de cuivre et un tailleur de pierre. Elle rejoint la catégorie Divers
du livre de fabrication natif. Même branche locale, sans publication ou
installation.
Build et packwiz, **52 tests serveur** et comparaison des archives réussis.
## beta.306 — moulin manuel (préparation locale)
[Le moulin fonctionne comme le tailleur de pierre](docs/mill-beta306.md) :
entrée et résultat immédiat, sans combustible. Prendre le résultat consomme
l'ingrédient ; Maj-clic traite les lots disponibles. Le feu disparaît du menu,
avec un bref mouvement mécanique à chaque utilisation. Nom **Moulin / Mill**,
neuf recettes conservées et anciens objets stockés récupérables.
Même branche locale, sans publication ou installation.
Build et packwiz, **52 tests serveur** et parcours **Vulkan avec Sodium**
réussis : prises natives, clic droit, lots, menus FR/EN et rechargement.
## beta.305 — écrasement direct des fruits (préparation locale)
[Les blocs de tomates, raisins et olives s'écrasent en sautant dessus](docs/crushing-beta305.md) :
huit paliers descendants, résidus progressifs et neuf portions au total.
Un piston libère immédiatement le reste ; le super piston traite jusqu'à
27 blocs sur sa course complète. La presse quitte fabrication, créatif et JEI.
Même branche locale, sans publication ou installation.
Build et packwiz, **78 tests serveur**, parcours d'écrasement et régression
complète du super piston sous **Vulkan avec Sodium** réussis.
## beta.304 — appareils culinaires (préparation locale)
[Six appareils et 80 recettes physiques portés en 26.3](docs/kitchen-beta304.md) :
poêle, chaudron vanilla qui devient une marmite, cuisinière 3 × 3, tonneau de
fermentation, moulin et pressoir à piston. Récipients conservés, lots limités,
contenus visibles et progression sauvegardée. La fermentation instantanée de
beta.303 cède la place au tonneau. Même branche locale, sans publication.
Les dix nouvelles entrées rejoignent Nourriture et boissons, sans nouvel onglet.
Build et packwiz, **72 tests serveur** et parcours **Vulkan avec Sodium**
réussis : appareils, JEI, menus FR/EN GUI 2/3/4, sauvegardes et régressions
cuisine/agriculture.
## beta.303 — recettes de cuisine (préparation locale)
[Les 92 recettes alimentaires de la 26.2 utilisent les nouvelles récoltes](docs/cuisine-beta303.md).
Salades, soupes, plats, pains, gâteaux, boissons et ingrédients intermédiaires.
Préparation à la table, cuisson au four/fumoir ; transformations de fermentation
adaptées en fabrication manuelle immédiate. 129 objets dans Nourriture et
boissons, sans nouvel onglet. Même branche locale, sans publication.
Les appareils culinaires restent dans leurs tickets.
Build, packwiz et **55 tests serveur** réussis. Parcours **Vulkan avec Sodium**
validé : fabrication, fumoir, 196 étapes dans JEI, 129 modèles, onglet natif
FR/EN GUI 2/3/4 et rechargement ; régression agricole réussie.
## beta.302 — vanille en 16 × 16 (préparation locale)
[Les quatre stades de vanille passent en 16 × 16 pixels](docs/vanilla-16px-beta302.md).
Dessin simplifié pour cette résolution, feuillage, fleurs et gousses sur un
seul plan contre le tronc. Même branche `codex/itsalive-26-3`, sans publication.
Dimensions vérifiées dans le JAR et dans l'atlas chargé par Minecraft.
Build et packwiz, 46 tests serveur et parcours Vulkan avec Sodium réussis.
## beta.301 — vanille grimpante (préparation locale)
[La vanille s'attache aux troncs comme les lianes et pousse vers le haut](docs/vanilla-beta301.md).
Faces fines contre l'écorce, nouvelle texture réunissant feuilles et gousses
sur un seul plan, appui requis pour chaque segment, maturité et poudre d'os.
Elle s'arrête aux obstacles et à la fin du tronc.
Bouture dans Naturel, gousses dans Nourriture et boissons, sans nouvel onglet.
Même branche locale `codex/itsalive-26-3`, sans publication ou installation.
Build et packwiz, **46 tests serveur** et parcours **Vulkan avec Sodium**
réussis, avec contrôle du plan unique et rechargement réel de 24 segments.
## beta.300 — cultures, arbres fruitiers et caféier (préparation locale)
[Les 20 cultures d'It's Alive ! deviennent jouables en 26.3](docs/agriculture-beta300.md),
avec le citronnier, l'olivier et le caféier. Les 45 objets rejoignent les
onglets vanilla Naturel et Nourriture et boissons, sans nouvelle page créative.
Semences, croissance, récoltes pérennes, plants hauts, riz immergé, fruits et
grains de café. Les textures fournies sont conservées, les libellés sont FR/EN.
Quinze cultures, dont l'oignon et l'ail, utilisent deux plans en croix pour
mieux montrer le pied ; les PNG restent intacts.
Même branche locale `codex/itsalive-26-3` ; apparition naturelle, vanille
grimpante et appareils culinaires restent dans leurs prochains tickets.
Aucune publication ni mise à jour d'installation.
Build, **34 tests serveur**, packwiz et parcours **Vulkan avec Sodium**
réussis : modèles, onglets vanilla FR/EN GUI 2/3/4 et rechargement réel.
## beta.299 — textures d'It's Alive ! (préparation locale)
[Premier lot de la refonte cuisine et agriculture pour 26.3](docs/itsalive-26-3.md) :
343 textures importées, dont les 38 PNG fournis prioritaires et conservés
sans retouche. Cultures, citronnier, olivier, caféier, ingrédients et appareils
disposent de leurs sources graphiques ; leur fonctionnement reste à porter.
Le suivi conserve les tickets chaudron, plats ratés, séchoir, poêle, vanille
grimpante et cuisinière. Branche locale `codex/itsalive-26-3`, sans publication.
Build, 13 tests serveur ciblés, contenu du JAR et assemblage packwiz vérifiés.
## beta.298 — normales de l'ancre corrigées
[Retrait du petit cadre résiduel dans la passe PBR](docs/media-anchor-normals-beta298.md).
Le modèle invisible de l'ancre ne laisse plus de reflet sur la vidéo
avec les shaders Sanctuary activés.
[Livraison vérifiée](docs/release-beta298.md) : serveur Beta, site et même
instance Prism à jour ; écrans existants et réglages conservés.
## beta.297 — correctifs des cadres disponibles
[Menu de taille à la pose, lecteur au Maj + clic droit et cadre en volume](docs/media-frame-fixes-beta297.md).
Retrait du repère rouge et du contour de sélection du bloc invisible.
Le redimensionnement reste accessible par Taille / Size dans le lecteur.
[Livraison vérifiée](docs/release-beta297.md) : serveur Beta, site et même
instance Prism à jour, sauvegardes et réglages conservés.
## beta.296 — écrans partagés disponibles pour essai
[Cadres de redstone, taille libre et menu Dream Displays](docs/media-beta296.md).
Un seul cadre pour poser une ancre, agrandissement gratuit, vidéo commune
et acoustique personnelle. Le module Media est inclus dans Sanctuary ; Dream
Displays rejoint packwiz côté client et serveur.
[Livraison complète vérifiée](docs/release-beta296.md) : serveur Beta, site et
même instance Prism synchronisés ; 18 tests serveur et parcours à deux clients
Vulkan réussis. Sauvegardes et réglages conservés.
## Étude — écrans et séances partagées
[Cadrage des cadres de redstone et du streaming collectif](docs/media-displays-study.md) :
ancre avec menu de taille, mur complet, image à 16 pixels par bloc
et lecteur commun accessible à 16 blocs. Comparaison Dream Displays, extension,
fork et moteurs alternatifs, avec limites de synchronisation live et d'acoustique.
Étude sur branche dédiée, sans implémentation ni modification du pack.
[Prototype à deux vrais clients Vulkan](docs/media-playback-prototype.md) :
lecture VOD et live HLS contrôlé, traces d'images GPU et audio, avec correction
de la collision de couleur Hello World. Le live dérive après reconnexion et
le son vidéo ne traverse pas Sound Physics. Outils de développement isolés,
aucun cadre Sanctuary ni ajout au pack.
[Correction expérimentale de synchronisation et d'audio](docs/media-sync-audio-prototype.md) :
horloge commune, reprise VOD au bon point de décodage, live HLS daté et sortie
audio Minecraft. Réglage personnel « Acoustique des vidéos » pour retirer Sound
Physics du flux. Extension isolée sur `codex/media-sync-audio`, avant les cadres.
[Ancre et cadre ajusté à tout l’écran](docs/media-anchor-prototype.md) : un seul
cadre consommé, dimensions libres sans surcoût, **menu natif Dream Displays**
conservé pour les flux. Extension expérimentale sur `codex/media-anchor`.
## beta.295 — Serveur Sanctuary dans la liste multijoueur
[Serveur préenregistré et logo du pack](docs/default-server-beta295.md) :
ajout initial de **Sanctuary Beta** sans écraser les favoris personnels,
avec icône 64 × 64 également distribuée au serveur. Intègre la simplification
de `/sanctuary property`. Build, 18 tests serveur et parcours Vulkan FR/EN
réussis. [Livraison complète effectuée](docs/release-beta295.md) : serveur,
téléchargement Web et instance Prism historique en beta.295.
## beta.294 — Une seule commande de propriété (intégrée à beta.295)
[La commande de propriété garde uniquement son nom anglais](docs/property-command-beta294.md) :
`/sanctuary property`, avec `claim`, `protect` et `duel`. Les alias `propriete`
et `propriété` sont retirés. Build, **18 tests serveur ciblés** et assemblage
du pack réussis lors de la préparation locale. Cette version n’a pas été
publiée séparément ; son contenu est livré avec beta.295.
## beta.293 — mise à jour complète
[Livraison complète publiée](docs/release-beta293.md) : Happy Creepers de la
branche dédiée, baleines fantômes, logo packwiz et quatre mods facultatifs.
Serveur Beta, téléchargement Web et même instance Prism synchronisés en
**beta.293**, sauvegardes et réglages conservés. Build et 79 tests serveur
réussis ; assertions Vulkan réussies, blocage de fermeture de l'outil de test
consigné. Réseau vocal contrôlé, essai audible à deux joueurs encore ouvert.
## beta.292 — voix et mods facultatifs (préparation locale)
[Simple Voice Chat, Bobby, Lithium et Entity Culling rejoignent le pack](docs/optional-mods-beta292.md).
Les quatre restent décochables côté client ; Lithium et la voix rejoignent
aussi le profil serveur. Logo packwiz conservé, 46 tests serveur ciblés et
parcours Vulkan avec et sans Sodium réussis. Préparation locale, sans publication ni
modification de l'instance personnelle. Dozei Stream et Only Fun restent en tickets.
## beta.291 — logo Sanctuary dans packwiz (préparation locale)
[Le bandeau fourni s'affiche pendant les téléchargements packwiz](docs/packwiz-logo-beta291.md),
dans l'instance Prism préparée. L'installateur embarque le logo et conserve
le moteur packwiz officiel. Les [tickets des prochaines intégrations](docs/integrations-mods-next.md)
couvrent Simple Voice Chat, Bobby facultatif, Lithium, Entity Culling,
Dozei Stream et Only Fun ; ces mods ne sont pas ajoutés dans cette version.
Fenêtre FR/EN, contrôles d'archive et deux synchronisations isolées réussis.
Construction ciblée avec 13 tests serveur réussie ; un test hérité du quota
de baleines reste en échec, détaillé dans le contrat. Aucune publication.
## beta.290 — baleine fantôme volante (branche locale)
[Import direct de la baleine 26.2](docs/flying-whale-beta290.md), avec son IA,
son rendu nuageux animé et son œuf personnalisé à partir de `egg.png` de
Minecraft. Deux baleines chargées au maximum pour le serveur, œuf refusé
sans consommation si les places sont prises. Construction, 19 tests serveur
et parcours Vulkan avec Sodium réussis. Préparée localement, sans publication
ni mise à jour d’installation.
## beta.289 — mise à jour complète
[Livraison des zombies et de la lumière portée](docs/release-beta289.md), avec
JEI intégré au même JAR pour le client et le serveur. Le téléchargement du
site conserve l’instance Prism prête à suivre le canal stable.
**Publiée** : serveur Beta, téléchargement Web et instance Prism personnelle
synchronisés en beta.289, avec sauvegardes et réglages conservés.
[Procédure de développement et de publication](docs/updates.md).
Construction client/serveur, **31 tests serveur** et parcours des zombies et
familiers sous **Vulkan avec Sodium** réussis pour cette livraison.
## beta.288 — correction des lumières portées intégrée
[Le correctif des Dynamic Lights rejoint le pack courant](docs/dynamic-hand-light-beta288.md).
Les torches et lanternes tenues en main éclairent le terrain avec Sodium,
avec ou sans PBR. Les zombies et les neuf tenues de beta.287 sont conservés.
Build, **19 tests serveur** et trois parcours **Vulkan** réussis : éclairage
avec/sans Sodium, puis zombies et familiers avec Sodium.
[Pack local beta.288](build/Sanctuary-beta.288.mrpack).
## beta.287 — tenues de zombies et postures
[Neuf tenues aléatoires et Hunter accroupi](docs/zombie-appearances-beta287.md)
pour le zombie classique et les six infectés. Les PNG fournis par le créateur
sont choisis aléatoirement par individu et gardés au rechargement, y compris
pour les familiers. Tous gardent les bras classiques en avant ; le Hunter
conserve sa marche accroupie.
Les familiers infectés conservent leur modèle adulte miniature à taille variable.
Build, **77 régressions, 19 tests Smoker et 16 tests Hunter** en sessions
séparées, ainsi que le parcours **Vulkan**, réussis. Neuf tenues par type,
bébé classique, 21 combinaisons de familiers, rééquipement stable et marche/bond
du Hunter vérifiés. [Pack local beta.287](build/Sanctuary-beta.287.mrpack).
## beta.286 — Hunter et bond offensif
[Sixième infecté](docs/hunter-beta286.md) : préparation accroupie, bond physique
vers le joueur et frappe unique au contact. Sa trajectoire reste fixe après
le départ : une esquive, un mur ou un plafond peuvent faire rater l’attaque.
T-shirt bleu et pantalon anthracite, œuf créatif et familier adulte miniature
à taille variable, avec son propre bond offensif sur G.
Build, **16 tests Hunter, 19 tests Smoker et 77 régressions**, en sessions séparées,
ainsi que le parcours **Vulkan FR/EN GUI 2/3/4**, réussis. Contact contre un vrai
joueur, esquive au clavier, atterrissage et trois tailles vérifiés.
[Pack local beta.286](build/Sanctuary-beta.286.mrpack).
## beta.285 — Smoker et lasso
[Cinquième infecté](docs/smoker-beta285.md) : un lasso physique qui peut rater.
Il doit toucher sa cible avant de la ramener vers le Smoker à la vitesse des
tyroliennes. Les obstacles sur le corps arrêtent le trajet ; blesser la source
ou couper le crochet libère la victime. Tenue gris clair et vert olive, œuf
créatif et familier adulte miniature à taille variable, avec son propre lasso.
Build, **19 tests Smoker et 77 régressions** en sessions séparées, ainsi que
le parcours **Vulkan FR/EN GUI 2/3/4**, réussis. Esquive au clavier, touche
réelle, traction imposée du joueur et arrivée vérifiées.
[Pack local beta.285](build/Sanctuary-beta.285.mrpack).
## beta.284 — Boomer et bile
[Quatrième infecté](docs/boomer-beta284.md) : gerbe de bile en cône,
diversion temporaire des zombies déjà présents et éclaboussure à la mort,
sans destruction du terrain. Tenue violette, pantalon sable, œuf créatif et
familier adulte miniature à taille variable, avec une gerbe qui affaiblit
les ennemis et une éclaboussure G qui garde le familier vivant.
Build, **68 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4**
réussis, avec G, recrutement sauvage, mort et trois tailles vérifiés.
[Pack local beta.284](build/Sanctuary-beta.284.mrpack).
## beta.283 — Spitter et flaque d’acide
[Troisième zombie spécial](docs/spitter-beta283.md) : le crachat dépose une
zone verte persistante au sol, comme une potion persistante. Les dégâts cessent
en sortant ; aucun poison ne suit la victime. Tenue orange, pantalon bleu
ardoise, œuf créatif et familier adulte miniature à taille variable.
Build, **54 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4**
réussis, avec G, dégâts dans la zone, sortie et trois tailles vérifiés.
[Pack local beta.283](build/Sanctuary-beta.283.mrpack).
## beta.282 — Chargeur
[Deuxième zombie spécial](docs/charger-beta282.md) : préparation visible, charge
en ligne droite, choc et récupération. Tenue verte, pantalon anthracite, œuf
créatif et familier adulte miniature à taille variable, avec sa propre charge.
Build, **45 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis,
avec appui réel sur G, choc et recharge vérifiés.
[Pack local beta.282](build/Sanctuary-beta.282.mrpack).
## beta.281 — Infectés adultes en miniature
[Les infectés abandonnent la forme bébé](docs/infected-adults-beta281.md).
Le familier reprend les proportions adultes en miniature, avec son trait de
taille variable conservé. La règle est commune aux futures variantes d'infectés.
Build, **34 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis,
avec trois tailles réelles de miniature vérifiées.
[Pack local beta.281](build/Sanctuary-beta.281.mrpack).
## beta.280 — Premier infecté
[Un nouveau zombie et son familier](docs/infected-beta280.md) : modèle vanilla,
t-shirt rouge, pantalon brun, 10 PV et vitesse légèrement supérieure au zombie.
Œuf créatif `sanctuary:infected_spawn_egg`, apparitions peu fréquentes dans les
habitats de zombies de l'Overworld et familier bébé avec son profil de combat.
Texture vanilla recolorée pixel par pixel, sans déplacement UV. Build,
**33 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.280](build/Sanctuary-beta.280.mrpack).
## beta.279 — Carte des îles et grand dézoom
[Vue d'ensemble de l'archipel et relevés prolongés](docs/map-islands-zoom-beta279.md).
La carte dézoome jusqu'à l'échelle du monde avec des niveaux de détail adaptés,
et reçoit les nouveaux chunks lointains en gardant son centre fixe. Capacité
portée de 16 384 à **131 072 chunks par couche et habitant**, sans effacer les
relevés existants. Les propriétés et Demeure retrouvent leurs détails en zoomant.
Build, **20 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.279](build/Sanctuary-beta.279.mrpack).
## beta.278 — Disputer une propriété dans Battle
[Duel consenti pour un claim déjà revendiqué](docs/claim-battle-beta278.md).
Clic droit sur la propriété → Disputer via Battle. Le challenger propose et
le propriétaire accepte explicitement le chunk mis en jeu ; les deux confirment
ensuite Prêt dans Battle. Le vainqueur reçoit ce seul claim avec sa protection
restante. Refus, annulation avant lancement ou combat sans vainqueur ne changent
pas le propriétaire. Résultat et transfert disposent d’un journal de reprise.
Build, **40 tests serveur ciblés**, **26 contrôles du journal** et parcours
**Vulkan FR/EN GUI 2/3/4** réussis. [Pack local beta.278](build/Sanctuary-beta.278.mrpack).
## beta.277 — Habiter avant de revendiquer
[Claims reliés aux influences Demeure](docs/claim-demeure-beta277.md).
Une simple traversée ne suffit plus. Sur un terrain libre, l’habitant le plus
influent peut revendiquer ; à égalité, la première trace d’habitation départage.
Un autre habitant peut donc prendre la priorité avant le claim en dépassant
l’influence du premier. Les propriétés acquises restent attribuées, avec les
mêmes prix et protections. Le clic droit indique la condition ou le nom prioritaire.
Build, **34 tests serveur ciblés**, contrôles Demeure et parcours **Vulkan
FR/EN GUI 2/3/4** réussis. [Pack local beta.277](build/Sanctuary-beta.277.mrpack).
## beta.276 — Contours des propriétés et protection à huit saphirs
[Contours CTM aux couleurs des propriétaires](docs/claim-contours-beta276.md),
visibles aussi sans protection. Les chunks voisins d’un même joueur se raccordent ;
les chunks protégés ajoutent un fond coloré. **8 saphirs par chunk pour trois jours
de serveur en marche**, avec conservation des durées déjà achetées.
Build, **30 tests serveur ciblés**, **63 vérifications du registre** et parcours
**Vulkan FR/EN GUI 2/3/4** réussis. [Pack local beta.276](build/Sanctuary-beta.276.mrpack).
## beta.275 — Habitant et Pause autour de la carte
[Habitant en trois colonnes et Pause centrée sur l’Atlas](docs/menu-atlas-beta275.md).
Statistiques transparentes à gauche, personnage au centre, biographie à droite ;
Factions et Familier restent seuls en haut. Le temps joué utilise jours, heures,
minutes et secondes. Le message d’arrivée Propriété et l’activité de la fiche
sont retirés. Les propriétés exigent la Carte débloquée et active côté serveur.
Après déblocage, Aventure et Communauté forment deux colonnes au-dessus de la
carte ; Partie et ses options restent dessous, Gazette à gauche et Tableau à droite.
Build, **30 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.275](build/Sanctuary-beta.275.mrpack).
## beta.274 — Calques continus et propriétés conservées
[Demeure et les protections utilisent des couleurs par pixel sans cadres de chunks](docs/demeure-overlay-beta274.md).
Les protections voisines de même propriétaire se raccordent, avec une légende
couleur / personnage ; les boucliers et pointillés sont retirés. Le bouton
Propriétés conserve le masquage. L’aide de Demeure décrit l’habitation et son
influence. La fiche Habitant et les claims actuels restent accessibles.
[La refonte des règles, de l’habitation préalable, des duels et du tarif est mise en attente](docs/property-demeure-refonte.md).
Build, **29 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.274](build/Sanctuary-beta.274.mrpack).
## beta.273 — Couleurs et protection des claims
[Les claims portent la couleur de leur propriétaire sur la carte](docs/claim-map-beta273.md),
même hors ligne. Bordure pleine et bouclier pour les chunks protégés ; pointillés
pour les autres. Affichage dès l’ouverture, actualisation après achat et état
au survol, dans la carte proche, l’Atlas et son aperçu de Pause. Le bouton
**Propriétés : oui/non** permet de les masquer et de les réafficher.
Build, **26 tests serveur ciblés** et parcours **Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.273](build/Sanctuary-beta.273.mrpack).
## beta.272 — Claims sur la carte
[Clic droit sur le terrain pour revendiquer un chunk](docs/chunk-claims-beta272.md).
Les cinq premiers sont gratuits, puis 100, 200, 300 points d’XP, etc.
Chaque chunk peut être protégé pour **64 saphirs et sept jours de serveur en
marche** : minage ×2 pour son propriétaire, ×0,5 pour les autres. L’arrêt du
serveur suspend la durée ; le claim reste acquis après expiration.
Migration volontaire des anciens volumes, avec remboursement des extensions.
Build, **25 tests serveur ciblés**, **58 vérifications du registre** et parcours
**Vulkan FR/EN GUI 2/3/4** réussis. [Pack local beta.272](build/Sanctuary-beta.272.mrpack).
## beta.271 — Habitant, statistiques et activité
[Fiche en deux colonnes et deux rangées](docs/inhabitant-menu-beta271.md).
Propriété, Factions et Familier forment une barre en haut. Le personnage
respire en haut à gauche, avec son activité jusqu’en bas et Historique dessous.
La biographie et les statistiques occupent la droite. Le familier et ses
réglages restent dans sa page dédiée. Combats revient dans Communauté ;
Story quitte Pause. Build, **15 tests serveur ciblés** et parcours **Vulkan
FR/EN GUI 2/3/4** réussis. [Pack local beta.271](build/Sanctuary-beta.271.mrpack).
## beta.270 — Propriété personnelle et fiche Habitant
[Première propriété gratuite après Hello World](docs/property-beta270.md) :
volume initial de 17 × 17 × 17 blocs, emplacement choisi dans le monde principal,
quatre agrandissements en points d’XP et protection des actions directes des
autres joueurs. Accès par **Habitant → Propriété** ou `/sanctuary property`.
Faction et Battle rejoignent Habitant et libèrent leurs places dans Pause.
Explosions, pistons, fluides et autres dégâts environnementaux restent hors
protection dans ce premier lot. **41 GameTests serveur ciblés** et parcours
**Vulkan FR/EN GUI 2/3/4** réussis.
[Pack local beta.270](build/Sanctuary-beta.270.mrpack).
## beta.269 — Les réponses de Providence
[Six issues et leurs couleurs](docs/providence-verdicts-beta269.md) :
@@ -1014,9 +1599,8 @@ explicites, résultat commun, sans récompense économique dans ce prototype.
Le laboratoire utilise un nouveau monde ; aucune mise à jour de Prism ni du
canal public n'est effectuée par ce chantier.
[Dernière release : beta.166](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.166) ·
[Historique des publications beta.144–166](docs/publications-beta144-166.md).
Les releases sont distinctes du canal packwiz, qui reste inchangé lors de ce rattrapage.
Ce rattrapage historique des releases n’avait pas modifié le canal packwiz.
La [direction de travail du 25 septembre](docs/ecosysteme-communaute-economie.md)
pose les liens entre tableau, Gazette, statistiques en BDD, État, navets,
@@ -3480,7 +4064,7 @@ Depuis beta.090, la cible est **Minecraft 26.3 finale**, publiée le 15 septembr
| Fabric API | 0.160.5+26.3 |
| Fabric Loom | 1.17.20 |
| Gradle Wrapper | 9.5.1, distribution vérifiée par SHA-256 |
| Sanctuary / pack | beta.166 |
| Sanctuary / pack | beta.295 |
Java 25 et Python 3.11 ou plus récent sont nécessaires. Le script pack utilise
uniquement la bibliothèque standard et repère aussi une installation Python
@@ -3509,7 +4093,7 @@ décrits dans [Validation](docs/testing.md).
Résultats :
- `mods/sanctuary/build/libs/sanctuary-beta.166.jar` : mod à installer avec
- `mods/sanctuary/build/libs/sanctuary-beta.295.jar` : mod à installer avec
Fabric API sur la version Minecraft indiquée.
- `build/packwiz/` : pack de développement complet, avec le mod construit et
l'index vérifié. Voir [Installation packwiz](packwiz/README.md).
@@ -3557,13 +4141,17 @@ sauvegarde 26.2 : aucun outil de migration de ses chunks n'est livré ici.
| `.gitea/ISSUE_TEMPLATE/` | Modèles de tickets fonctionnalités et bugs |
| `.gitea/workflows/` | Vérification sur un runner Gitea compatible |
It's Alive !, Only Fun et Master Key restent des modules autonomes prévus par la
vision. Leurs sources 26.2 ne sont pas copiées dans ce socle. Fabric API est
requise ; Demeure appartient au code interne de Sanctuary. Depuis beta.257,
le port source de JEI pour 26.3 et Sound Physics sont des mods client séparés
et facultatifs, comme Sodium. Leurs sources ou procédures de reconstruction
et leurs attributions figurent dans `mods/demeure/`, `mods/jei/` et
`mods/sound-physics-remastered/`.
La [refonte d'It's Alive !](docs/itsalive-26-3.md) reprend les textures et
l'agriculture dans Sanctuary ; ses appareils et sa cuisine restent à porter. Only Fun
et Master Key restent prévus par la vision. Fabric API est
requise ; Demeure appartient au code interne de Sanctuary. Depuis beta.280,
le port source de JEI pour 26.3 est embarqué dans le JAR Sanctuary pour le
client et le serveur. Sound Physics et Sodium restent facultatifs côté client.
Depuis beta.293, Simple Voice Chat, Bobby, Lithium et Entity Culling sont
aussi facultatifs côté client ; la voix et Lithium font également partie du
profil serveur. Voir [les dépendances du pack](docs/optional-mods-beta292.md).
Les sources ou procédures de reconstruction et les attributions figurent
dans `mods/demeure/`, `mods/jei/` et `mods/sound-physics-remastered/`.
## Travailler par tickets
+364 -4
View File
@@ -1,5 +1,234 @@
# Provenance et crédits
## Poules rares beta.323
Le comportement et le rendu sont portés des classes `GemChickenEntity`,
`GemChickenVariant`, `GemChickenRenderer`, `ChickenMixin` et `ThrownEggMixin`
du module `itsalive` de Sanctuary 26.2, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, sous GPL-3.0-or-later.
Les six PNG de `assets/itsalive/textures/entity/gem_chicken/` sont copiés
intacts dans `assets/sanctuary/textures/entity/gem_chicken/`. Ce sont des
recolorations des textures de poule Minecraft 26.2, par le script historique
`itsalive/tools/generate_gem_chickens.sh` ; Mojang/Microsoft restent titulaires
des textures sources. La nouvelle variante or référence la texture native
tempérée résolue par Minecraft et applique une teinte au rendu sans copier
cette texture. L'icône `assets/sanctuary/textures/item/golden_egg.png` est
reprise sans modification du module `anotherworld` du même commit.
Voir [le contrat et les différences du port](docs/rare-chickens-beta323.md).
## Saucisson posé en tranches, beta.315 locale
Le bloc de saucisson, ses quatre longueurs et orientations sont développés
dans Sanctuary 26.3. Les modèles cubiques originaux reprennent les références
natives du modèle d’objet beta.313 : terre cuite rouge, laine blanche et bloc
de champignon rouge pour la coupe. Aucun PNG ni fichier audio Minecraft
n’est copié ; le son natif de mastication est référencé. Les modèles d’objets
cru/séché et leur affichage au séchoir sont conservés. Voir
[comportement et continuité](docs/sausage-slices-beta315.md).
## Fromage à partager et élevage du vin, beta.314 locale
Le nouveau bloc de fromage réutilise les règles du gâteau de Minecraft 26.3
par héritage, avec des modèles cubiques originaux Sanctuary pour ses sept
états et des références aux textures natives de terre cuite jaune et pierre
de l’End. Les icônes historiques de fromage et de vin sont conservées ; les
trois qualités ajoutées héritent du modèle d’objet du vin et distinguent
leurs noms, raretés et saturation. Aucun PNG, son ou source Minecraft n’est
copié. Le calcul des jours réels et les recettes d’élevage sont développés
dans Sanctuary. Voir [comportement et continuité](docs/cheese-wine-beta314.md).
## Séchoir et saucisson, beta.313 locale
Le séchoir, ses modèles cubiques, les deux états du saucisson, la préparation
à l’établi et le séchage sont développés dans Sanctuary 26.3. Ils réutilisent
les ingrédients du catalogue culinaire historique et des textures Minecraft
référencées : chêne écorcé, terre cuite rose/rouge, laine blanche et bloc de
champignon rouge. Aucun fichier de texture ni son Minecraft n’est copié.
Les événements sonores natifs d’ajout/retrait de cadre et de récupération
d’objet sont référencés sans nouveau fichier audio. Voir
[comportement, provenance et continuité](docs/drying-rack-beta313.md).
## Répétition au chaudron, beta.312 locale
Sanctuary mémorise la recette autorisée au bâton, enchaîne ses lots et conserve
les ingrédients réapprovisionnés pour leurs cycles complets. Le chaudron, ses
19 recettes et ses ressources restent issus du port de `26.2/itsalive`
(commit `26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later).
Aucune recette, texture ou piste audio n’est modifiée ; les sons natifs de
beta.311 restent utilisés une fois par événement. Voir
[comportement et continuité](docs/cauldron-repeat-beta312.md).
## Chaudron remué, beta.311 locale
Le chaudron et ses 19 recettes proviennent du port de `26.2/itsalive`
(commit `26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later).
Sanctuary remplace le délai d’échec par une préparation lancée au bâton,
conserve les récipients réels jusqu’au paiement final et précise la capture
dans l’ouverture. Les sons référencent les événements natifs de Minecraft
26.3, sans copie de fichier audio ni modification de texture. Voir
[fonctionnement et continuité](docs/cauldron-beta311.md).
## Piles de poêles, beta.310 locale
La poêle, sa texture et ses 26 recettes restent issues du port de
`26.2/itsalive` (commit `26f2c2a0061619df1f146f9081d6740c560a7497`,
GPL-3.0-or-later). Sanctuary ajoute une pose native par couches de quatre
pixels, une préparation commune et des réserves réelles pour payer chaque
portion. Les trois modèles supérieurs translatent la géométrie historique
avec ses UV conservés ; aucun PNG ne change. Voir
[fonctionnement et contrat de continuité](docs/pan-stacks-beta310.md).
## Sortie unique de cuisinière, beta.309 locale
La correction Sanctuary retire la case d'aperçu et l'alimentation de la grille
par entonnoir, tout en conservant l'extraction des plats et le cycle culinaire
porté de `26.2/itsalive` (GPL-3.0-or-later, même reçu beta.304).
L'interface utilise les panneaux et sprites vanilla existants, sans retouche
de PNG. Voir [comportement et continuité](docs/oven-single-output-beta309.md).
## Cycle de cuisinière et aperçu, beta.308 locale
La cuisinière et ses treize recettes restent issues du port de `26.2/itsalive`
(commit `26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later).
Sanctuary renforce l'annulation sur modification de grille, sépare l'aperçu
virtuel des plats cuits et conserve l'inventaire natif et ses compteurs.
L'interface réutilise les panneaux et sprites Minecraft de l'établi et du four ;
aucun PNG n'est retouché. Voir [cycle et continuité](docs/oven-beta308.md).
## Moulin manuel, beta.306 locale
Le moulin et ses neuf recettes proviennent du port culinaire de
`26.2/itsalive`, commit `26f2c2a0061619df1f146f9081d6740c560a7497`,
GPL-3.0-or-later. Sanctuary remplace le traitement au combustible par un poste
manuel inspiré du tailleur de pierre vanilla 26.3. L'interface réutilise le
panneau natif Minecraft et les deux sprites mécaniques historiques importés ;
aucun PNG n'est modifié. Les anciennes cases de stockage restent lisibles.
Voir [comportement et continuité](docs/mill-beta306.md).
La [recette adaptée en beta.307](docs/mill-recipe-beta307.md) remplace la
redstone historique par un bâton et utilise la catégorie native Divers.
## Écrasement direct des fruits, beta.305 locale
Le comportement de piétinement à huit hauteurs et son intégration aux pistons
sont développés dans Sanctuary 26.3. Ils utilisent les trois textures de blocs
et les trois recettes de transformation déjà importées de `26.2/itsalive`
(commit `26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later).
Aucun PNG n'est retouché ; les modèles partiels réutilisent les mêmes textures.
La presse beta.304 devient une compatibilité de lecture d'inventaire inactive.
Voir [comportements, continuité et vérifications](docs/crushing-beta305.md).
## Appareils culinaires, beta.304 locale
Les six appareils, leurs 36 sources Java, leurs modèles et recettes adaptent
`26.2/itsalive` au commit `26f2c2a0061619df1f146f9081d6740c560a7497`,
GPL-3.0-or-later. Le [reçu source](docs/kitchen-beta304-sources.json) conserve
les empreintes historiques. Les recettes d'équipement adaptées sont dans
`scripts/data/kitchen-crafting.json` ; celles des procédés restent dans le
reçu de cuisine beta.303. Le port conserve les PNG déjà importés, adapte
explicitement les API Minecraft 26.3 et ajoute les catégories JEI, les retours
de récipients et le suivi exact de l'eau vanilla. La fermentation instantanée
de l'étape beta.303 est remplacée par le tonneau et ses délais historiques.
Voir [comportements, limites et vérifications](docs/kitchen-beta304.md).
## Cuisine, beta.303 locale
Les 92 recettes alimentaires, noms FR/EN et profils alimentaires adaptent
`26.2/itsalive` au commit `26f2c2a0061619df1f146f9081d6740c560a7497`,
GPL-3.0-or-later. Le reçu source `scripts/data/cuisine.json` conserve les
recettes originales et leurs SHA-256. Les mécanismes sont adaptés à la table,
au four et au fumoir de Minecraft 26.3 ; les transformations de fermentation
deviennent des fabrications manuelles immédiates. Les appareils historiques
ne sont pas portés dans ce lot. Les modèles de préparations réutilisent les
sprites importés, avec une teinte native, sans modifier les PNG. Voir
[le contrat, les adaptations et contrôles](docs/cuisine-beta303.md).
## Vanille 16 × 16, beta.302 locale
Les quatre sprites grimpants de beta.301 sont repris avec l'outil intégré
imagegen pour leur lecture en 16 × 16 pixels. L'atlas de production contient
quatre cellules de cette taille ; les PNG de jeu sont exportés à cette
résolution exacte, sans interpolation. Les sources, prompt et empreintes
restent dans `ressources-pack/sources/vanilla-beta301/`. Les 343 PNG de l'import
historique beta.299 restent intacts. Voir [le correctif](docs/vanilla-16px-beta302.md).
## Vanille grimpante, beta.301 locale
La maturité et la récolte adaptent le `VanillaVineBlock` de Sanctuary 26.2
(`26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later). L'attachement
à plusieurs faces, la croissance ascendante et les modèles plats sont adaptés
pour Sanctuary 26.3. Les quatre PNG historiques restent intacts. Quatre
nouveaux sprites intégrant feuilles, fleurs et gousses sont créés avec l'outil
imagegen, à partir de la liane Minecraft comme référence de structure et de
style et des anciens PNG comme références de vanille. Un seul plan est rendu
par face ; aucune texture native n'est copiée dans le pack. L'atlas final,
les prompts et la préparation des sprites sont conservés dans
`ressources-pack/sources/vanilla-beta301/`.
Voir [le contrat et les contrôles](docs/vanilla-beta301.md).
## Agriculture d'It's Alive ! pour 26.3, beta.300 locale
Les classes `fr.koka.sanctuary.agriculture` adaptent le code agricole et les
registres du module `26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later. Leur portée
exclut créatures, Canaplia et appareils culinaires. Les définitions des deux
arbres plantés adaptent les paramètres `oak` et `acacia` de Minecraft 26.3
finale ; les butins utilisent les règles natives de cette version.
Les textures du [reçu beta.299](docs/itsalive-textures-beta299.json) sont
conservées sans retouche. Voir le [contrat et les vérifications](docs/agriculture-beta300.md).
## Textures cuisine et agriculture d'It's Alive !, beta.299 locale
Le premier lot de la refonte reprend 343 PNG du module `itsalive` du projet
Sanctuary 26.2 (GPL-3.0-or-later), commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, sous
`itsalive/src/main/resources/assets/itsalive/textures/`. Les 38 images du dossier
`food` fournies par le créateur le 28 octobre 2026 remplacent leurs homologues
dans la nouvelle copie ; elles sont conservées octet pour octet. Les 305 autres
PNG restent strictement identiques aux sources historiques. Les textures de
créatures et les œufs ne font pas partie de cet import.
Le [reçu par fichier](docs/itsalive-textures-beta299.json) conserve origine,
empreintes anciennes/nouvelles et dimensions. Le
[ticket de portage](docs/itsalive-26-3.md) distingue la présence des textures
des mécaniques encore à développer. Aucun nouveau code 26.2 ni modèle tiers
n'est inclus par ce lot ; les notices des portages antérieurs restent valables.
## Mods facultatifs beta.292
Les binaires officiels de [Simple Voice Chat 2.6.24+26.3](https://modrinth.com/plugin/simple-voice-chat/version/OLnMVWXy)
(Max Henkel, All Rights Reserved), [Bobby 5.2.16+mc26.3](https://modrinth.com/mod/bobby/version/J7YnfCss)
(johni0702, LGPL-3.0-or-later), [Lithium 0.26.2+mc26.3](https://modrinth.com/mod/lithium/version/xS0Q8LSi)
(CaffeineMC et contributeurs, LGPL-3.0-only) et
[Entity Culling 1.11.3 pour 26.3](https://modrinth.com/mod/entityculling/version/X1g3VhTx)
(tr7zw et contributeurs, tr7zw Protective License) sont téléchargés séparément
par packwiz, sans modification ni imbrication dans Sanctuary. Leurs notices,
licences et bibliothèques imbriquées restent attachées aux JAR originaux.
Leurs métadonnées et SHA-512 sont dans `packwiz/mods/` ;
[choix de versions et vérifications](docs/optional-mods-beta292.md).
## Installateur packwiz Sanctuary beta.291
Le bandeau `launcher/packwiz/sanctuary.png` est le fichier `minecraft.png`
fourni par le créateur le 26 octobre 2026, conservé sans modification.
`InstallWindow.java` adapte la fenêtre de packwiz-installer v0.5.14 de
comp500, sous MIT ; licence et source sont joints au JAR généré. Toutes les
autres classes et les notices des dépendances de l'installateur officiel
restent identiques. Sources, hashes et périmètre dans
[le contrat du logo packwiz](docs/packwiz-logo-beta291.md).
## Tenues des zombies beta.287
Les neuf PNG `zombie.png`, `zombie2.png` à `zombie9.png` sont fournis par le
créateur le 26 octobre 2026. Ils sont copiés sans modification sous
`assets/sanctuary/textures/entity/zombies/zombie1.png` à `zombie9.png`.
Le [reçu des sources et dérivés](docs/zombie-skins-beta287.json) conserve
leurs SHA-256. `scripts/prepare_zombie_skins.py` produit aussi neuf adaptations
UV pour le modèle bébé natif de Minecraft 26.3 par rééchantillonnage déterministe
des faces ; aucun générateur d’image n’intervient. La géométrie et les couches
d’armure restent issues de Minecraft. Les notices historiques des anciennes
recolorations ci-dessous décrivent les livraisons précédentes.
Depuis beta.256, le pack client inclut [Sodium 0.9.2+mc26.3](https://modrinth.com/mod/sodium/version/bAZQdGpg),
de JellySquid et des contributeurs CaffeineMC, sous Polyform-Shield-1.0.0.
Le JAR officiel est une dépendance séparée téléchargée par packwiz ; il n’est
@@ -106,15 +335,52 @@ L’icône d’objet correspondante provient de `../26.2/sanctuary`
restent la propriété de leurs auteurs et ne sont pas placées sous la licence
du code Sanctuary. Il ne s’agit pas d’une cape officielle accordée au compte.
Les familiers utilisent les modèles et textures résolus par Minecraft installé ;
aucune copie des textures de mobs ni aucun ancien pouvoir n’est embarqué.
Les familiers vanilla utilisent les modèles et textures résolus par Minecraft
installé. L'exception du premier infecté est décrite ci-dessous.
## Infecté beta.280
Le modèle, les animations, l'armure et les sons sont ceux du zombie installé
avec Minecraft 26.3. Aucun modèle ou son de Left 4 Dead n'est inclus ; cette
série reprend seulement l'idée de rôles différents pour des zombies.
La texture `assets/sanctuary/textures/entity/infected.png` est une recoloration
déterministe du zombie **Minecraft 26.3**, réalisée par
`scripts/generate_infected_texture.py` à partir du JAR installé. Seules les
couleurs du t-shirt et du pantalon changent ; coordonnées UV, peau, visage,
chaussures et transparence restent identiques. Empreinte SHA-256 du PNG natif :
`1b88eea9b63889c2c3399773f887af375defc3aad0e7a375adc84249da54cbbd`.
Aucune texture produite par ImageGen n'est livrée.
L'icône `textures/item/infected_spawn_egg.png` est reprise intacte de Sanctuary
26.2, commit `26f2c2a0061619df1f146f9081d6740c560a7497`, module `itsalive`.
Elle provenait d'une recoloration de l'œuf Minecraft par
`itsalive/tools/generate_infected_textures.sh`. Ces ressources dérivées ne sont
pas couvertes par la licence GPL du code ; les droits sur les ressources
Minecraft restent à Mojang/Microsoft.
## Chargeur beta.282
`assets/sanctuary/textures/entity/charger.png` utilise le même PNG natif du
zombie Minecraft 26.3 et les mêmes masques UV que l'Infecté. La sélection
`--variant charger` de `scripts/generate_infected_texture.py` produit un
t-shirt vert et un pantalon anthracite, avec peau, visage, chaussures et alpha
conservés pixel pour pixel. Aucun dessin génératif ni modèle de Left 4 Dead.
SHA-256 : `cf2344d870753ed621b9fd7c3fd7dfe0b3dc35294620e798f113b71abd27fbda`.
L'icône `textures/item/charger_spawn_egg.png` est reprise intacte du module
`itsalive` de Sanctuary 26.2, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, générée à partir de l'œuf Minecraft.
Les droits sur les ressources Minecraft restent à Mojang/Microsoft.
## JEI beta.024
Just Enough Items, mezz, MIT : fork source de la branche 26.2, commit
`aae2dfcfb82e6b5bce787ba72bb2eda7339b274f`, adapté à Minecraft 26.3-pre-2.
Depuis beta.257, le fork Minecraft 26.3 `30.32.0-sanctuary.4` est un JAR client
séparé et facultatif, avec la licence d’origine et [la provenance du portage](mods/jei/PROVENANCE.md).
Depuis beta.280, le fork Minecraft 26.3 `30.32.0-sanctuary.4` est à nouveau
embarqué dans le JAR Sanctuary, avec la licence d’origine et
[la provenance du portage](mods/jei/PROVENANCE.md). Sa distribution séparée
facultative concernait les beta.257–278.
Les patches et la reconstruction sont fournis ; les téléchargements restent ignorés.
Baked Substring Index 0.1.0 (MIT, James Mitchell) et Suffix Tree 1.1.0
(Apache-2.0, Alessandro Bahgat Shehata) sont inclus avec leurs licences.
@@ -212,3 +478,97 @@ leurs aperçus publics de haute qualité ; la cigale du soir utilise la
conversion MP3 publique de Commons. Aucun enregistrement d’Animal Crossing
n’est inclus. L’identification biologique du grillon reste non précisée ;
la courtilière européenne sert d’analogue sonore.
## Spitter beta.283
`assets/sanctuary/textures/entity/spitter.png` est une recoloration déterministe
du zombie Minecraft 26.3 via `scripts/generate_infected_texture.py --variant spitter`.
Seuls le t-shirt orange et le pantalon bleu ardoise changent. Peau, visage,
chaussures, alpha et UV restent identiques au PNG natif décrit ci-dessus.
SHA-256 : `92f6a8f7ad09a817fc74bfc2728a5f75d34a838dcc91a2ddee336c31803c0592`.
Aucun modèle, son ou dessin génératif de Left 4 Dead n'est inclus.
L'icône `textures/item/spitter_spawn_egg.png` est reprise intacte du module
`itsalive` de Sanctuary 26.2, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, dérivée de l'œuf Minecraft.
Les droits sur les ressources Minecraft restent à Mojang/Microsoft.
## Boomer beta.284
`assets/sanctuary/textures/entity/boomer.png` est une recoloration déterministe
du zombie Minecraft 26.3 par `scripts/generate_infected_texture.py --variant boomer`.
T-shirt violet et pantalon sable : 570 pixels de vêtements changent, avec
visage, peau, chaussures, UV et transparence conservés. SHA-256 :
`2cbc0a87435c8f12fbbd77bd3d7fc23c9843e9ae22493dbfb6ffe14ea492c230`.
Le même script recolore en violet la silhouette et les ombres de l'icône
`spitter_spawn_egg.png` historique, décrite ci-dessus, pour produire
`textures/item/boomer_spawn_egg.png`. SHA-256 :
`dd11449f7072db2faf753e5d258acfe8e5d2c50116e076d9b799345ed5f62ffa`.
Les droits sur ces ressources dérivées restent à Mojang/Microsoft. Aucun
modèle, son ou bitmap de Left 4 Dead, ni texture générative, n'est livré.
## Smoker beta.285
`assets/sanctuary/textures/entity/smoker.png` est une recoloration déterministe
du zombie Minecraft 26.3 par `scripts/generate_infected_texture.py --variant smoker`.
T-shirt gris clair et pantalon vert olive : 570 pixels de vêtements modifiés ;
visage, peau, chaussures, UV et alpha conservés. SHA-256 :
`80b7b34c915466d2c022f2222bd5bedf5b5b6c39ab447a97dcae7edf66ba4d17`.
Le même script dérive `textures/item/smoker_spawn_egg.png` de la silhouette et
des ombres de l'icône historique `spitter_spawn_egg.png`, avec la teinte du
t-shirt. SHA-256 :
`e73b7d1e08ef0f35bfc7bac3e81795b166b56d9a5267045bcef64ae311c256c6`.
La tête du lasso utilise l'objet laisse natif et son câble le rendu natif des
laisses tendues déjà employé par les tyroliennes. Aucun modèle, son ou bitmap
de Left 4 Dead ni texture générative n'est inclus. Les droits sur les ressources
Minecraft dérivées restent à Mojang/Microsoft.
## Hunter beta.286
`assets/sanctuary/textures/entity/hunter.png` est une recoloration déterministe
du zombie Minecraft 26.3 par `scripts/generate_infected_texture.py --variant hunter`.
T-shirt bleu et pantalon anthracite : 570 pixels de vêtements modifiés ; tête,
peau, chaussures, UV et alpha conservés. SHA-256 :
`1057efc7947105684a24fe165e83581b66fccc877687433cc00ed80231c2c970`.
Le même script dérive `textures/item/hunter_spawn_egg.png` de la silhouette et
des ombres de l'icône historique `spitter_spawn_egg.png`, avec la teinte du
t-shirt. SHA-256 :
`294bbd145e09707f2006d51e9190b538b50148c44c13f3ecaf563e316f03384d`.
Les sons et le modèle sont natifs à Minecraft. Aucun bitmap ou son de Left 4
Dead ni texture générative n'est inclus. Les droits sur les ressources
Minecraft dérivées restent à Mojang/Microsoft.
## Baleine fantôme volante beta.290
Le modèle, son animation, le rendu, l’IA et le spawner proviennent du module
`itsalive` de Sanctuary 26.2, commit
`94644a28f05b8010f06ec1181fe6c74a50ad80d6`, sous la licence du projet
GPL-3.0-or-later. Cette source est elle-même le port de la baleine du JAR
historique Real Ghost ; aucune archive 26.2 n’est redistribuée.
`textures/entity/flying_whale/flying_whale.png` est repris octet pour octet.
SHA-256 : `0828ba1b9443f31cdb0ce9c22393a8702a72b9e59c2a0c02f3dd6dedadd33fb8`.
L’icône `textures/item/flying_whale_spawn_egg.png` est une recoloration
déterministe directe de `assets/minecraft/textures/item/egg.png` de Minecraft
26.3, produite par `scripts/generate_whale_egg.py` ; silhouette, alpha et
ombrage natifs conservés. Source SHA-256 :
`3bfccf5fcfe66933d591e944f6b08456c8083f5c3898b924da52bfebc41e6322`.
Résultat SHA-256 :
`d476a3fedba3af3e463d6461b81cf6ca8702fe10ceb3934f426390d59da63f7e`.
Les sons et particules sont natifs à Minecraft, référencés sans copie ; les
droits sur les ressources Minecraft dérivées restent à Mojang/Microsoft.
## Happy creepers
`assets/sanctuary/textures/entity/creeper/happy.png` est repris sans modification
du module `itsalive` de Sanctuary 26.2, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, chemin
`itsalive/src/main/resources/assets/itsalive/textures/entity/creeper/happy.png`.
SHA-256 : `40e22bf0610cfc7ae8ca910b1e6bdce0c759ccbf8714df7566ebe5538cac24f0`.
Il s'agit du visage souriant historique sur le modèle natif du creeper. Les
droits sur les ressources Minecraft dérivées restent à Mojang/Microsoft.
Aucune autre variante de texture ni ressource Mobopia n'est importée.
+48 -1
View File
@@ -14,6 +14,39 @@ allprojects {
tasks.named('build') { dependsOn(':sanctuary:build', ':jei:build', ':sanctuary-test:build') }
tasks.named('check') { dependsOn(':sanctuary:check', ':jei:check', ':sanctuary-test:check', 'verifyPack') }
tasks.named('check') { dependsOn(':sanctuary-media:check') }
tasks.named('build') { dependsOn(':sanctuary-media:build') }
tasks.register('verifyServerUpdater', Exec) {
group = 'verification'
commandLine('python3', 'scripts/test_server_runtime.py')
}
tasks.named('check') { dependsOn('verifyServerUpdater') }
tasks.register('verifyWebDistribution', Exec) {
group = 'verification'
commandLine('python3', 'scripts/test_publish_web_pack.py')
}
tasks.named('check') { dependsOn('verifyWebDistribution') }
tasks.register('verifyOptionalMods', Exec) {
group = 'verification'
commandLine('python3', 'scripts/verify_optional_mods.py')
}
tasks.named('check') { dependsOn('verifyOptionalMods') }
tasks.register('assemblePackwizInstaller', Exec) {
group = 'distribution'
description = 'Build and verify the Sanctuary-branded packwiz window.'
commandLine('python3', 'scripts/packwiz_installer.py')
}
tasks.register('verifyPackwizInstaller', Exec) {
group = 'verification'
dependsOn('assemblePackwizInstaller')
commandLine('python3', 'scripts/test_packwiz_installer.py')
}
tasks.named('check') { dependsOn('verifyPackwizInstaller') }
tasks.register('verifyPack', Exec) {
group = 'verification'
@@ -24,10 +57,17 @@ tasks.register('verifyPack', Exec) {
tasks.register('assemblePack', Exec) {
group = 'distribution'
description = 'Assemble a local packwiz pack including the built Sanctuary mod.'
dependsOn(':sanctuary:build', ':jei:build', 'verifyPack', 'assembleResourcePack', 'assembleResourceTemplate')
dependsOn(':sanctuary:build', ':jei:build', 'verifyPack', 'verifyOptionalMods', 'assembleResourcePack', 'assembleResourceTemplate', 'assemblePackwizInstaller')
commandLine('python3', 'scripts/pack.py', 'assemble')
}
tasks.register('assembleServerPack', Exec) {
group = 'distribution'
description = 'Build the Linux server kit and verify its packwiz profile.'
dependsOn('assemblePack')
commandLine('python3', 'scripts/server_pack.py')
}
tasks.register('verifyResourcePack', Exec) {
group = 'verification'
description = 'Verify the versioned Sanctuary texture sources and their release hashes.'
@@ -35,6 +75,13 @@ tasks.register('verifyResourcePack', Exec) {
}
tasks.named('check') { dependsOn('verifyResourcePack') }
tasks.register('verifyItsAliveTextures', Exec) {
group = 'verification'
description = 'Verify the first agriculture and cooking texture import and its source hashes.'
commandLine('python3', 'scripts/verify_itsalive_textures.py')
}
tasks.named('check') { dependsOn('verifyItsAliveTextures') }
tasks.register('assembleResourcePack', Zip) {
group = 'distribution'
description = 'Export the same textures as the built-in resource pack for standalone use.'
+181
View File
@@ -0,0 +1,181 @@
# IA-02 — Cultures, arbres fruitiers et caféier en 26.3
Préparation **locale** du 28 octobre 2026, `beta.300`, sur la même branche
`codex/itsalive-26-3`. Socle : import graphique beta.299, commit `d78d39cd`.
Minecraft 26.3, Fabric Loader 0.19.5, Fabric API 0.160.5+26.3 et Java 25
restent inchangés. Aucun push, tag, publication, serveur, site ou Prism modifié.
## Contenu jouable
Le créatif utilise exclusivement les onglets vanilla existants :
| Onglet | Ajouts |
| --- | --- |
| **Naturel / Natural Blocks** | 23 semences, propagules et pousses, plus les deux feuillages fruitiers |
| **Nourriture et boissons / Food & Drinks** | 26 récoltes et ingrédients, plus la gousse d'ail |
Ces **45 objets distincts** comprennent sept récoltes replantables ou grains
présents dans les deux catégories selon leur usage. Aucun onglet ou page
créative supplémentaire n'est enregistré.
Tous portent des identifiants `sanctuary:*` et des noms FR/EN. Les blocs et
objets sont ceux de Sanctuary ; aucun deuxième JAR It's Alive n'est nécessaire.
Les **20 cultures** sont : fraise, tomate, ananas, maïs, concombre, poivron,
aubergine, laitue, oignon, ail, chou, raisin, riz, soja, haricot, pois chiche,
piment, basilic, menthe et coriandre. Elles ont huit âges, croissent par les
ticks aléatoires et acceptent la poudre d'os. La croissance garde les règles
vanilla de lumière et de sol ; aucun verrou climatique nouveau n'est ajouté.
Les modèles suivent la silhouette des plantes : **15 cultures en croix**
(fraise, ananas, poivron, aubergine, laitue, oignon, ail, chou, raisin, soja,
pois chiche, piment, basilic, menthe et coriandre). Le riz, le maïs, la tomate,
le concombre et le haricot gardent les plans de culture existants, avec les
parties hautes pour les quatre derniers. La croix comprend deux plans
diagonaux au lieu des quatre plans formant un cadre. Son pied est abaissé
d'un pixel, comme le modèle de culture vanilla, pour toucher la terre
labourée. Ce choix s'applique aux huit âges, sans retoucher les PNG.
- Les semences se plantent sur la terre labourée. L'oignon, l'ail, le riz,
le soja, les haricots et les pois chiches sont directement replantables.
- Le **riz** se plante exclusivement dans une vraie source d'eau au-dessus
de boue. L'eau courante et la plantation à sec sont refusées sans consommer
de riz. Le plant contient sa source ; le casser restitue l'eau.
- Fraise, tomate, concombre, poivron, aubergine, raisin, piment, basilic,
menthe et coriandre se récoltent au clic droit à maturité. Ils donnent
une à quatre unités selon la plante et reviennent à l'âge 3.
- Le **haricot** donne des haricots verts aux âges 5–6 et des haricots secs
à l'âge 7, puis revient à l'âge 3. Les autres cultures se récoltent par casse.
- Tomate, maïs, concombre et haricot occupent **deux blocs dès l'âge 4**.
La partie haute suit l'âge du pied ; son clic transmet la récolte ou la
poudre d'os au pied. La casse ne produit qu'un seul butin. Un plafond bloque
le passage au stade haut et la poudre d'os n'est pas consommée en vain.
- Manger un **ananas** rend exactement une couronne en survie, pour replanter.
Les fruits, légumes et herbes comestibles conservent leurs valeurs 26.2.
Les grains secs et ingrédients de transformation ne deviennent pas tous
des aliments crus par cet import.
Le **caféier** se plante avec un grain vert sur un sol admis par les buissons
vanilla. Il croît sur quatre âges, donne des cerises aux âges 2–3 et revient
à l'âge 1 après récolte. Il n'a ni épines, ni ralentissement du buisson à baies.
Les cerises donnent deux grains ; le fumoir torréfie les grains verts.
Les boissons et les appareils culinaires restent dans les tickets suivants.
Le **citronnier** et l'**olivier** poussent depuis leurs propres pousses :
forme de chêne pour le premier, forme d'acacia pour le second, avec bois
vanilla. Les feuilles fruitières sont créées directement par les arbres,
sans scanner ou convertir les feuilles d'un arbre voisin. Une feuille sur
douze environ porte un fruit à la croissance ; les fruits reviennent ensuite
rarement par tick aléatoire, comme dans l'intention historique. Le clic droit
récolte un fruit sans arracher les feuilles ; cisailles et Toucher de soie
récupèrent les feuilles, sinon elles peuvent donner une pousse.
Les recettes natives de récupération des semences et de torréfaction sont
disponibles pour la fabrication manuelle. Le compostage utilise le composant
`minecraft:compostable` et les probabilités natives 26.3, au lieu de l'ancienne
table statique Java. Les tags de cultures, maintien de terre labourée,
feuilles, pousses et nourriture des poules sont additifs.
## Accès pour les essais
Créer un **nouveau monde de développement** en créatif, prendre les semences
dans **Naturel** et les récoltes dans **Nourriture et boissons**. Sur un monde de test où les
commandes sont autorisées :
```mcfunction
/give @s sanctuary:tomato_seeds 16
/give @s sanctuary:rice 16
/give @s sanctuary:coffee_beans 16
/give @s sanctuary:lemon_sapling 4
/give @s sanctuary:olive_sapling 4
```
Les infobulles FR/EN expliquent la plantation du riz et du caféier.
Le bloc d'ananas sauvage est porté pour le futur peuplement, sans apparition
naturelle activée dans ce lot.
## Génération et sauvegardes
Les deux nouvelles définitions `sanctuary:lemon_tree` et
`sanctuary:olive_tree` servent aux **pousses plantées**, avec leurs fournisseurs
de feuillage `sanctuary:lemon_foliage` et `sanctuary:olive_foliage`. Leurs formes
reprennent les paramètres exacts des arbres `oak` et `acacia` de Minecraft
26.3 finale, adaptés au feuillage Sanctuary. Ce premier contrat de pousses
fruitières est **IA-02 / beta.300** ; graine de validation : **300**.
Aucune nouvelle feature n'est ajoutée aux biomes ou aux étapes de décoration.
L'apparition naturelle et la découverte des premières semences en survie
restent un lot séparé. Aucun ancien chunk n'est repeuplé ou régénéré. Le client
de validation utilise un monde plat Sanctuary Test neuf, jamais une sauvegarde
personnelle. Les 30 nouveaux blocs utilisent les états natifs de Minecraft :
âge, partie haute, distance au tronc, persistance, eau et fructification.
Aucun format de sauvegarde existant n'est réécrit ; aucun monde 26.2 n'est migré.
La **vanille grimpante** reste dans IA-03. Le chaudron, les plats ratés,
le séchoir/saucisson, la poêle et la cuisinière restent dans IA-04 à IA-08.
Leurs textures déjà importées ne signifient pas que leurs comportements
sont activés par ce lot.
## Sources et reproductibilité
Le port adapte les classes agricoles de `26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later, en lecture seule.
Les registres sont séparés des monstres, de Canaplia et des appareils culinaires.
Les changements d'API 26.3 sont vérifiés dans le JAR exact de Minecraft utilisé
par Loom : végétation, prédiction d'inventaire, compostage, butin, arbres et
fournisseurs d'états. Aucun mod agricole tiers n'est ajouté.
`scripts/data/agriculture.json` décrit le catalogue et les formes des arbres.
`scripts/agriculture_resources.py` produit modèles, objets, états de blocs,
butins, recettes, tags et définitions des arbres dans le répertoire de build,
par `generateAgricultureResources`. Les 343 PNG et leurs empreintes beta.299
restent inchangés ; les 38 fichiers du créateur gardent la priorité.
## Validation
Le parcours graphique utilise **Vulkan / Apple M1 / Sodium 0.9.2+mc26.3**,
un monde de développement neuf de graine **300** et un client de heap 4 Gio :
- plantation en survie par les vrais paquets client/serveur, consommation
d'une semence, poudre d'os et casse de la partie haute ;
- **313 états de blocs** avec géométrie et textures réellement chargées,
**45 modèles d'objets** avec leurs sprites fournis ;
- vérification des deux plans croisés de l'oignon et de l'ail et des quatre
plans conservés pour le maïs et le riz ;
- onglets vanilla Naturel et Nourriture et boissons : présence effective des
ajouts, absence de nouvel onglet, captures **FR/EN et GUI 2/3/4** ;
- croissance des deux arbres et fermeture/réouverture réelle du monde :
**173 états agricoles** conservés, dont les âges et la fructification.
La construction finale `check build assemblePack` réussit en **3 min 6 s**,
159 tâches, avec **34 GameTests serveur requis réussis** : 17 scénarios
agricoles et 17 régressions des recettes, de la progression et de la
connaissance alimentaire. Le parcours client final réussit en **53 s**.
Le JAR contient les modèles croisés attendus pour les huit âges des 15
cultures et les classes agricoles identiques aux classes vérifiées. Les
343 textures correspondent au reçu beta.299. Les JAR des profils packwiz
client et serveur sont strictement identiques au binaire contrôlé ; le
template personnel contient les mêmes PNG. Version et index des packs vérifiés.
SHA-256 de `sanctuary-beta.300.jar` :
`d432015abbb52154af8ec2a2b9e31a73374133e6909b954b0fc54a15397661d7`.
Reçu local complémentaire : `build/agriculture300-validation.json`.
Commandes de validation :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryAgriculture300ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=agriculture300 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Les journaux restent ignorés dans `build/agriculture300-*.log` et les captures
dans `mods/sanctuary/build/run/clientGameTest/screenshots/`. Aucun essai
OpenGL n'est lancé ou revendiqué. Les autres moteurs graphiques, un serveur
multijoueur distant et une partie de survie depuis zéro sans commandes ne
sont pas validés par ce lot ; la découverte naturelle des semences est différée.
+140
View File
@@ -0,0 +1,140 @@
# APT-297 — prix des aptitudes selon leur portée
Demande du créateur du 31 octobre 2026. Branche `codex/aptitude-prices`.
Préparation locale **beta.297**, isolée depuis le commit beta.293
`74dc1265`. Les travaux locaux beta.294–296 restent dans le dépôt initial. Le Catalogue des recettes devient un achat à 30 niveaux.
## Grille de prix
Les prix sont des **niveaux d’XP**, dépensés une seule fois. Les gestes et
petites aides restent accessibles tôt ; les outils de connaissance et de
fabrication avancée demandent davantage de progression.
| Aptitude | Niveaux | Intention |
| --- | ---: | --- |
| Noms des créatures | 2 | Petite aide d’identification |
| Se reposer | 4 | Geste de survie simple |
| Zoom | 5 | Aide d’observation ponctuelle |
| Savoir alimentaire | 6 | Connaissance générale des aliments |
| Nage | 8 | Déplacement utile à l’exploration |
| Rangement | 10 | Confort permanent d’inventaire |
| Grande carte | 12 | Lecture et exploration du territoire |
| Étude des familiers | 15 | Déchiffrage de l’ensemble des familiers |
| Lien actif | 20 | Accès aux pouvoirs de travail des familiers |
| Forgerie | 20 | Enclumes et table de forge |
| Alchimie | 25 | Accès personnel aux alambics |
| Enchantement | 30 | Amélioration avancée de l’équipement |
| Catalogue des recettes | 30 | Consultation complète des découvertes et recettes |
S’asseoir et s’allonger restent gratuits. Les six compétences, leurs paliers,
la fabrication manuelle, les découvertes et les conditions des postes natifs
conservent leurs règles. Acheter l’aptitude d’un métier ne paie pas les coûts
vanilla de ses opérations. Le même tarif alimente l’interface FR/EN et le
contrôle d’achat côté serveur.
L’achat du Catalogue synchronise immédiatement l’XP et l’écran de progression,
comme les autres aptitudes. En solo, la pause traitait bien l’achat mais
retardait auparavant le compteur d’XP natif jusqu’à la reprise du jeu.
## Contrat de transition
Aucun identifiant `sanctuary:*`, format de sauvegarde de joueur, attachement
ou protocole de paquet n’est remplacé. Aucun monde personnel n’est ouvert.
Les reçus historiques à **4 niveaux** de Catalogue, Savoir alimentaire et
Étude des familiers restent valides, avec leur prix, date et découvertes.
Les nouveaux reçus portent respectivement 30, 6 et 15 niveaux, dans le même
schéma 1. Les autres montants restent refusés. Les autres achats conservent
leur historique ou leur booléen acquis. Aucun supplément, remboursement ou
rachat n’est demandé aux anciens propriétaires ; mort et New Game+ gardent
les acquisitions.
Les configurations serveur adoptent les nouveaux prix au prochain chargement :
- `progression.json`, schéma **5 → 6** : seules les valeurs historiques
exactement égales à 4 de `namesCost`, `atlasCost`, `sortingCost` et
`swimmingCost` deviennent 2, 12, 10 et 8. Les autres valeurs personnalisées,
les prix des compétences et les réglages restent conservés. Les anciens
schémas passent par leurs transitions existantes puis celle-ci.
- `companion-powers.json`, schéma **1 → 2** : `activeCost` à 4 devient 20.
Les autres tarifs, espèces et réglages sont conservés. Le marqueur `.v2`
historique garde sa responsabilité sur les anciens délais des familiers ;
la transition de prix fonctionne aussi lorsqu’il existe déjà.
- Une configuration déjà au nouveau schéma n’est pas réécrite. Il reste
possible d’y configurer explicitement un prix à 4. Une ancienne valeur
personnalisée égale à 4 est indiscernable du défaut historique et suit la
transition ci-dessus ; la redéfinir après transition si nécessaire.
- Une configuration invalide reste refusée sans réécriture.
Client et serveur doivent être mis à jour ensemble. Une ancienne version ne
sait pas lire les nouveaux schémas de configuration ni les nouveaux montants
des trois reçus : un retour arrière exige une sauvegarde préalable des
configurations et données de joueurs, sans modifier les nouveaux reçus à la
main.
## Vérification
Commandes de référence :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=aptitudes236,forgerie238,progression,movement,sorting,recipes,foodknowledge,companions,familiar,starter,refonte \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryAptitudes236ClientTests=true -PsanctuaryClientGraphicsBackend=vulkan
```
Les tests ciblent les paiements exacts des treize aptitudes, le refus à un
niveau du tarif et le refus du rachat même avec assez d’XP ; ils couvrent
également les reçus historiques, le rechargement natif, la mort, le New Game+,
les transitions de configuration et les menus des métiers.
**103 tests serveur requis réussis**, puis de nouveau 103/103 après le
correctif de synchronisation d’XP. Le dernier `check build assemblePack`
réussit en **1 min 17 s**. Les **109 contrôles purs** ont été exécutés au cours
des passages précédents : le premier a été interrompu lors du rattachement
du dossier de travail, après 56 contrôles terminés. La reprise puis le dernier
build excluent uniquement les contrôles purs déjà réussis, sans retirer les
tests serveur. Les commandes exactes et listes sont conservées dans
`build/aptitude-prices-beta297-resumed-checks.json` et
`build/aptitude-prices-beta297-final-checks.json`. Les contrôles de version,
d’index, de textures et de distribution restent actifs.
Journaux : `build/aptitude-prices-beta297-check-build-pack.log`,
`build/aptitude-prices-beta297-check-build-pack-final.log` et
`build/aptitude-prices-beta297-final-build-pack.log`.
Parcours client final réussi en **51 s**, Minecraft 26.3, **Vulkan / MoltenVK
1.4.2 sur Apple M1**, marqueur `APTITUDE_PRICES297_PASS` dans
`build/aptitude-prices-beta297-client-vulkan-verified.log` :
- Les trois achats des métiers depuis leurs widgets dépensent 75 niveaux
au total ; leurs libellés correspondent aux prix contrôlés côté serveur.
- Catalogue affiche 30, reste inaccessible à 29, puis s’achète à 30 ; l’XP
affichée devient immédiatement zéro pendant la pause solo.
- FR/EN, GUI 2/3/4 : treize aptitudes, achats permanents, douze paires de
désactivation/réactivation gratuites de Carte et Noms, conservation des
preuves et de l’XP, défilement, redimensionnement et retour à Pause.
- Les assertions du menu Pause reprennent le contrôle beta.275 actuel,
remplaçant l’attente historique beta.233 de six entrées. **25 captures**
dans `build/forgerie238-screenshots/` ; inspection visuelle du prix Catalogue,
des métiers FR GUI 4 et de Survie EN GUI 3.
## Artefacts locaux
Versions du mod et du pack alignées sur **beta.297**. L’export
[`Sanctuary-beta.297.mrpack`](../build/Sanctuary-beta.297.mrpack) est vérifié :
16 762 112 octets, intégrité ZIP, dépendances Minecraft 26.3 / Fabric Loader
0.19.5, un seul JAR Sanctuary identique au build final, sans classe de test,
monde ou module de laboratoire. Reçu
`build/aptitude-prices-beta297-artifact.json`.
- SHA-256 JAR : `5e18d3de7b56b9682f17025f57788426c349a981c796b7dc505582417bf6dbf7`.
- SHA-256 MRpack : `ca0acfe1b4b5c90c4a61d792666aa0d0a686dce96af370c7c5e9ea6422cc0113`.
Les essais utilisent uniquement les sauvegardes de développement. Windows
et multijoueur distant ne sont pas testés ; le rythme de cette grille reste
à apprécier sur des séances de jeu longues.
Cette préparation n’inclut ni publication, ni avancée du canal packwiz, ni
synchronisation de Prism ou du serveur Beta.
+61
View File
@@ -1,5 +1,60 @@
# Backlog Sanctuary
## IA-01 à IA-10 — Refonte cuisine et agriculture d'It's Alive !
**IA-10, préparation locale beta.315 :** [saucisson séché posable et mangeable
en quatre tranches](sausage-slices-beta315.md), huit points de nourriture au
total, quatre orientations et sauvegarde native. Même branche locale,
sans publication.
**IA-09, préparation locale beta.314 :** [fromage en sept parts posées et quatre
qualités de vin, après 3 minutes de fermentation puis 1/3/7 jours réels
au tonneau](cheese-wine-beta314.md). Le vieillissement continue jeu fermé.
Même branche locale, sans publication.
**IA-06, préparation locale beta.313 :** [saucisson préparé puis séché cinq
minutes sur quatre crochets indépendants, protection de la pluie et sauvegarde](drying-rack-beta313.md).
Même branche locale, sans publication.
**CUI-305, préparation locale beta.305 :** [écrasement direct des fruits](crushing-beta305.md).
La presse est retirée des recettes, du créatif et de JEI. Huit paliers à piétiner,
neuf portions par bloc, écrasement au piston et course complète de 27 blocs
pour le super piston. Les autres appareils restent en place.
**IA-04/05/07/08, préparation locale beta.304 :** [six appareils culinaires et
80 procédés physiques](kitchen-beta304.md). Chaudron depuis l'eau vanilla,
poêle native avec contenu visible, plats ratés, cuisinière 3 × 3, fermentation
temporisée, moulin et pressoir à piston. À cette étape, les six appareils étaient portés ;
la refonte de pose/orientation de la poêle, le séchoir et les nouveaux plats
restaient ouverts. Même branche locale, sans publication.
**IA-05, préparation locale beta.303 :** [92 recettes alimentaires historiques,
ingrédients et plats jouables](cuisine-beta303.md), avec table et four/fumoir.
La suite beta.304 remplace la fermentation instantanée et porte les appareils
et les plats ratés. Même branche locale, sans publication.
**Premier lot graphique importé en beta.299 locale**, branche
`codex/itsalive-26-3`, à la demande du 28 octobre 2026 :
343 textures, dont les 38 fichiers `food/` prioritaires, avec reçu de provenance
et vérification des empreintes. Aucun bloc, objet ou système agricole ajouté
au registre par ce lot. [Périmètre, catalogue et tickets](itsalive-26-3.md) :
cultures/arbres/caféier, vanille grimpante, chaudron, plats ratés et recettes,
saucisson au séchoir, poêle et cuisinière four + table de fabrication.
Suite par incréments locaux ; aucune publication ou mise à jour d'installation.
**IA-02, préparation locale beta.300 :** [20 cultures, deux arbres fruitiers
et caféier jouables](agriculture-beta300.md), 45 objets créatifs, modèles,
butins et recettes natifs 26.3. Apparition naturelle, vanille grimpante et
cuisine restent dans les prochains lots. Même branche `codex/itsalive-26-3`.
**IA-03, préparation locale beta.301 :** [vanille attachée aux bûches et
croissance vers le haut](vanilla-beta301.md), sans propagation descendante,
avec gousses et pose à plusieurs faces. Les appareils culinaires et le
peuplement naturel restent à traiter. Même branche, sans publication.
**Correction locale beta.302 :** [les quatre textures de vanille sont
reprises en 16 × 16 pixels](vanilla-16px-beta302.md), sur le même plan unique.
## HELLO-264 — Menu central et sol commun — livré localement
Sur `codex/hello-world-menu`, socle beta.263. Colonne centrale de 182 pixels,
@@ -1958,6 +2013,12 @@ et le client graphique avec connexion réelle passent. Voir
## Réserve de thèmes futurs
Le cadrage du 26 octobre 2026 détaille les
[tickets d'intégration du pack et des modules personnels](integrations-mods-next.md) :
Simple Voice Chat, Bobby facultatif, Lithium, Entity Culling, Dozei Stream
et Only Fun. Les quatre intégrations du pack sont préparées localement dans
[beta.292](optional-mods-beta292.md) ; les deux modules personnels restent à cadrer.
Ces thèmes servent à retrouver la vision, pas à demander leur implémentation immédiate. On en extrait un ticket seulement lorsqu'il devient utile au prochain incrément jouable.
| Thème | Contenus à découper plus tard |
+120
View File
@@ -0,0 +1,120 @@
# DIST-WEB — téléchargement direct d'une instance Prism prête
Branche `codex/beta-download`, serveur dédié CT 350 sur `gpu`. Cette livraison
conserve les binaires immuables beta.280 et ne modifie ni monde ni format de
sauvegarde. L'Alpha reste hors cible.
## Résultat pour le joueur
Le bouton **Télécharger** de [Sanctuary Web](https://sanctuary-minecraft.net)
donne directement le fichier **Sanctuary-Beta.zip** :
```text
https://sanctuary-minecraft.net/downloads/sanctuary-prism.zip
```
Le joueur importe ce ZIP dans Prism (**Ajouter une instance → Importer depuis
un ZIP**), puis lance **Sanctuary Beta**. Packwiz télécharge le pack complet au
premier lancement et suit le même canal aux lancements suivants. La commande
avant lancement et le bootstrap sont déjà inclus ; aucune configuration manuelle
ou téléchargement séparé d'outil n'est demandé.
Le format ZIP d'instance Prism conserve ces réglages, contrairement à un MRpack
standard. Le MRpack beta.280 reste accessible par son ancienne adresse pour
compatibilité des liens, sans devenir un deuxième bouton du site. Le parcours
manuel de configuration et son lien dans le pied de page sont retirés.
L'archive contient uniquement `instance.cfg`, `mmc-pack.json`, l'icône,
`minecraft/packwiz-installer-bootstrap.jar` et, à partir de la préparation
beta.291, `minecraft/packwiz-installer.jar` avec le
[logo Sanctuary embarqué](packwiz-logo-beta291.md). Elle démarre avec zéro mod
local. L'installateur est vérifié par SHA-256 et conservé par
`--bootstrap-no-update` ; la mise à jour automatique des mods reste active.
L'instance est nommée **Sanctuary Beta**, avec `ManagedPack=false`,
`OverrideCommands=true`, la sélection automatique de Java et le canal stable :
```text
https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml
```
Le nom du bouton et le téléchargement direct sont conservés. Le pied de page et
le survol indiquent la version réellement publiée. Les réponses de téléchargement
utilisent `Cache-Control: no-store` pour garder la même adresse à chaque livraison.
## Publication demandée via Codex
Aucune tâche périodique ne décide de publier une version. À la demande du créateur :
1. Vérifier et publier les nouveaux binaires immuables, puis le canal packwiz
selon [le protocole de distribution](packwiz.md).
2. Générer l'instance prête avec `python3 scripts/pack.py prism <url-du-canal>`.
Joindre `build/Sanctuary-Prism-beta.xxx.zip` à la release, avec le MRpack et
le kit serveur. L'export Prism est reproductible et conserve ses commandes.
3. Mettre à jour la CT dédiée selon [le contrat serveur](server-pack.md), en
conservant sauvegardes, réglages et secrets, puis vérifier son redémarrage.
4. Publier le téléchargement Web après contrôle de cette CT et des deux archives :
```sh
python3 scripts/publish_web_pack.py \
--web-ct 320 --server-ct 350 --version beta.280 \
--mrpack-url https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.280/Sanctuary-beta.280.mrpack \
--prism-url https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.280/Sanctuary-Prism-beta.280.zip \
--pack-url https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml
```
Cette dernière commande s'exécute sur `gpu`, où `pct` est disponible. `--dry-run`
vérifie sans publier. Le script contrôle les index, les versions, les hashes des
dépendances et le JAR Sanctuary de la CT, du canal et du MRpack. Il refuse une
archive Prism sans commande active, visant un autre canal ou une autre plateforme,
avec un bootstrap non vérifié ou des fichiers étrangers.
Les fichiers Web restent dans
`/var/www/sanctuary/storage/app/distribution/releases/beta.xxx/prism/`.
Chaque publication est immuable. Sous verrou, `current` bascule atomiquement après
écriture complète. Les anciennes versions restent disponibles pour une reprise.
Le script ne redémarre aucun serveur et ne change pas le canal lui-même.
## Vérifications
Huit tests Python couvrent l'alignement CT/canal/MRpack, le refus d'un serveur
arrêté ou divergent, le contrat d'import Prism prêt, les fichiers interdits et la
publication atomique avec conservation de la précédente en cas de conflit.
Ils font partie de `./gradlew check`.
Les quatre tests de téléchargement et les trois tests des métriques Laravel
passent, ainsi que Pint : le bouton sert un ZIP anonyme directement, le nom est
`Sanctuary-Beta.zip`, les publications incomplètes restent indisponibles, et le
changement de version ne demande pas de reconstruire le cache de configuration.
Le MRpack reste téléchargeable par son ancien lien.
Les tests natifs utilisent une extraction de l'archive prête dans un chemin
contenant des espaces, avec les variables de sa propre commande avant lancement.
Ils exécutent packwiz sans interface ; aucun Minecraft ni monde personnel n'est
ouvert. Les fichiers témoins de réglages, favoris et sauvegardes sont comparés
avant et après synchronisation. Les journaux sont conservés sous
`build/prism-ready-validation*/`, hors de Git.
`./gradlew check build assemblePack -PsanctuaryFocusedTests=recipes,progression
-PsanctuaryAtlasOnly=true` réussit. L'archive prête mesure **92 417 octets**, SHA-256
`30dd37f3a6e1d79f8b443f6312918258276c85d5b6a5e7fbdc9c3fea7562dbf2`.
Une première tentative native reçoit des HTTP 502 de Gitea ; une nouvelle
extraction entièrement vide réussit ensuite ses deux lancements de synchronisation.
Le reçu est `build/prism-ready-validation-retry/validation.json`.
L'archive est ajoutée à la release beta.280 sans changer son tag ni ses artefacts
existants. La CT Web publie ensuite le ZIP et le MRpack vérifiés dans la même
bascule atomique. Le code Web est livré au commit
`46d784ecbb8ba3d0f20199b85bcf486831ba3750` ; les changements préexistants sont
conservés et les empreintes des comptes et permissions restent identiques.
Sauvegarde privée :
`/root/sanctuary-beta-maintenance/web-prism-ready-20261025-1792943502/`.
Le parcours navigateur **accueil → Télécharger → Sanctuary-Beta.zip reçu** est
vérifié à 1280 × 900 et 390 × 844 : HTTP 200 direct, pas de changement de page,
nom et SHA-256 identiques à l'archive testée, aucune erreur d'application ni
débordement horizontal. Le lien de guide manuel est absent. Le MRpack historique
répond toujours HTTP 200. Le navigateur utilisé est Playwright, le plugin
Browser étant absent ; reçu et captures sous `/tmp/sanctuary-prism-ready-*`.
Reçus opérationnels ignorés : `build/prism-ready-publication.json`,
`build/prism-ready-web-publication.json`, `build/prism-ready-web-deployment.log`
et `build/prism-ready-build.log`.
+85
View File
@@ -0,0 +1,85 @@
# ZOMBIES-284 — Boomer et bile
Branche `codex/boomer`, sur le socle local beta.283 conservé. État : implémenté et vérifié localement en beta.284.
## Contrat
Quatrième infecté : modèle adulte du zombie vanilla 26.3, t-shirt violet et
pantalon sable recolorés pixel par pixel, visage/peau/UV/alpha conservés.
Identifiants `sanctuary:boomer` et `sanctuary:boomer_spawn_egg`.
Aucun bébé, y compris via œuf ou chargement ; pas de conversion en noyé.
- Sauvage : 10 PV, vitesse 0,20, mêlée 2, poursuite 32 blocs. À courte distance,
prépare une gerbe pendant 20 ticks, puis vomit dans un cône de 5 blocs,
orienté au début de la préparation. Recharge de 120 ticks. La bile révèle
pendant 6 secondes et affaiblit pendant 3 secondes ; elle ne crée pas d'acide.
- Une cible enduite attire jusqu'à six zombies déjà présents à 12 blocs, avec
ligne de vue et chunks chargés, pendant six secondes au maximum. Pas de
nouvelles créatures, de chargement distant ou d'horde générée. La diversion
expire proprement et conserve la cible précédente si elle est encore valide.
Retirer la révélation arrête aussi la diversion ; maximum 64 zombies détournés
simultanément par serveur. Les projections touchent au plus 12 victimes.
- À sa mort, éclaboussure unique de 3 blocs, 2 dégâts et bile, sans destruction
de blocs ni feu. Une suppression administrative n'active pas l'éclaboussure.
Les infectés de la famille et les joueurs créatifs/spectateurs sont protégés.
Les murs et la différence de hauteur bloquent les projections.
- Œuf créatif et apparition rare, poids 4 et groupe d'un dans les habitats
de zombies de l'Overworld.
- Familier rare, adulte miniature à taille variable persistante, 14 PV et
vitesse 0,25. Gerbe automatique en cône et G d'éclaboussure à 3 blocs :
dégâts, faiblesse et révélation passent par les règles communes des familiers,
avec protection du propriétaire/alliés/duels. Le familier reste vivant et
ne détourne pas de monstres contre des tiers.
- Recharge du Boomer conservée au chargement ; préparation interrompue annulée.
Les diversions sont transitoires ; aucun format existant ne change.
## Vérification
- Suite serveur ciblée : **68 tests réussis**, dont **14 nouveaux**. Fixtures
plates explicites, graine de test `0`, aucun monde personnel ouvert.
- Couverture Boomer : œuf/profil/spawn, règle adulte, préparation et vraie gerbe,
esquive latérale, mur et étage, recharge après interruption et sur le tick
exact du tir, sauvegarde/rechargement, mort native unique, suppression sans
éclaboussure, famille protégée, six zombies maximum sans nouvelle entité,
navigation/attaque native et restauration de la cible précédente après délai,
absence de chargement distant, G et cône du familier avec protections communes,
recharge partagée et tailles 120/500/1000/1500/3000/6000 conservant l'individu.
- Parcours client natif **Vulkan / MoltenVK 1.4.2 / Apple M1**, Minecraft 26.3,
Java 25, Loader 0.19.5, monde de test neuf de graine `284` : réussi avec arrêt
normal du client. Appui réel sur G, dégâts/faiblesse/révélation, recharge et
survie du familier ; gerbe sauvage, recrutement d'un zombie existant et
éclaboussure après vrai dégât mortel. Trois tailles réelles 500/1000/1500,
renderer adulte, œuf, infobulles et écran FR/EN aux échelles GUI 2/3/4 vérifiés.
- La première vérification générale a rencontré le test préexistant
`Companion019GameTests.creatureProfilesActuallyMove` (déplacement aérien).
Les contrôles Boomer passaient ; la suite de 68 a ensuite repassé avec ce
test inchangé. Journal conservé dans
`build/boomer284-check-build-pack-attempt1.log`.
- `./gradlew check build assemblePack` réussi en **2 min 40 s**, avec
`-PsanctuaryFocusedTests=boomer284,spitter283,charger282,infected280,familiar260,companions`
et `-PsanctuaryAtlasOnly=true`. La suite complète ciblée repasse ses 68 tests.
- PNG du Boomer comparé en RGBA à la recoloration attendue du zombie natif
26.3 épinglé : **331 pixels de t-shirt et 239 de pantalon** modifiés,
tête, peau, chaussures, alpha et coordonnées UV conservés. Les textures des
trois infectés précédents restent identiques. L'œuf est une recoloration
violette de la silhouette et des ombres de l'icône historique, sans changement
d'alpha ; aucun outil de génération d'images utilisé.
- JAR et export MRpack : ZIP intègres, version beta.284 et dépendances
Minecraft 26.3 / Loader 0.19.5 contrôlées. Classes, œuf, texture, profil,
loot, traductions et tags Boomer présents ; classes de tests exclues.
Le JAR exporté est identique au JAR compilé. Pack beta.283 précédent conservé
octet pour octet.
[Pack local beta.284](../build/Sanctuary-beta.284.mrpack), **16 650 758 octets**.
SHA-256 : `4a27ce2b184c8797f0ed7891c6dc62d1db372e2fdabb4fd5de98389df16f25a3`.
[Reçu et empreintes](../build/boomer284-validation.json).
![Adulte et familier miniature sous Vulkan](../build/boomer284-screenshots/0002_boomer284-miniature-1000.png)
La livraison reste locale : aucun tag/release, canal packwiz, serveur personnel
ou instance Prism modifié. Les œufs restent créatifs ; leur acquisition en
survie et les autres infectés demandent leurs propres tickets. Aucune génération
de terrain ni sauvegarde personnelle modifiée.
+56
View File
@@ -0,0 +1,56 @@
{
"version": "beta.311",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.311.jar",
"sha256": "3fa69ebc452ad2bbc3e7d6992305e9349d2f34f04f666a3688453fbd2fe74409",
"previous_verified_sha256": "4a2278d987b031b343a6d66694da50db0aeb408bb77785ce8c02ae0ed9174b26",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/culinary/block/CookingCauldronBlock.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/CookingCauldronBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/CookingCauldronHud.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [],
"removed_jar_entries": [],
"generated_json_unchanged": {
"cuisine": 432,
"kitchen": 195,
"agriculture": 376
},
"culinary_compiled_classes_verified": 61,
"cauldron_recipes_unchanged": 19,
"manual_start": "stick",
"failed_dish_from_cauldron": false,
"milk_bucket_paid_at_completion": true,
"unchanged_native_inventory_indices": [
0,
1,
2,
3,
4,
5,
6
],
"preparation_storage_marker": 311,
"unchanged_pngs": 1108,
"server_required": 89,
"cauldron_scenarios": 13,
"client_vulkan": {
"log": "build/cauldron311-client.log",
"screenshots": "build/cauldron311-screenshots",
"screenshot_count": 11,
"world_seed": 311,
"sodium": "0.9.2+mc26.3",
"audio_engine_listener": true
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"build_log": "build/cauldron311-build.log"
}
+130
View File
@@ -0,0 +1,130 @@
# CUI-311 / IA-04 — chaudron préparé puis remué
Suite locale beta.312 : [la recette se répète après son premier geste et
reste mémorisée après la collecte des plats](cauldron-repeat-beta312.md).
Le comportement à lot unique décrit ci-dessous est celui de beta.311.
Choix du créateur le 29 octobre 2026 : préparer les ingrédients, puis **remuer
avec un bâton** pour lancer la cuisson. Les mélanges incomplets ne deviennent
plus des plats ratés. Le lait reste un ingrédient non payé jusqu'à la fin ;
le seau vide est éjecté à la préparation terminée. Des sons Minecraft discrets
accompagnent les gestes et la cuisson. Même branche `codex/itsalive-26-3`,
préparation locale **beta.311**, sans publication ou installation.
## Contrat de continuité avant modification
L'identifiant `sanctuary:cooking_cauldron`, les six cases d'ingrédients 0–5,
la sortie 6 et `WaterUnits` restent inchangés. Les objets natifs gardent leurs
composants et tailles maximales ; les récipients non empilables sont stockés
séparément. Une vue agrégée sert uniquement à reconnaître la recette et ses
quantités, sans déplacer les objets stockés.
Le champ `AssemblyComplete` devient l'autorisation donnée par le geste de
remuer. `CauldronPreparationVersion=311` distingue ce sens de l'ancien départ
automatique. À la lecture d'une sauvegarde antérieure sans ce marqueur, seuls
l'autorisation et l'avancement de cuisson non payé sont remis à zéro ; les
six cases, la sortie déjà terminée et l'eau sont conservées. La préparation
attend alors un nouveau geste. Les anciennes dates restent lisibles mais ne
créent plus de délai d'échec. Une sauvegarde beta.311 conserve une cuisson
explicitement lancée, qui reprend sur ses ticks restants avec de la chaleur.
Changer un ingrédient ou l'eau annule la cuisson non payée et demande de
remuer à nouveau. Une cuisson produit un lot de la recette choisie ; elle ne
relance pas automatiquement une recette depuis les restes. Le bâton n'est
pas consommé. Le chaudron ordinaire vide ou rempli d'eau devient la variante
culinaire seulement lorsqu'un véritable ingrédient tombe dans son ouverture.
Les annulations rendent le lait plein, la casse rend les objets encore
stockés et la collecte finale restaure le chaudron vanilla avec son eau exacte.
Revenir à beta.310 exige d'abord de récupérer les préparations non terminées :
l'ancien code reprend son départ automatique. Aucun monde personnel n'est
modifié ; les validations utilisent des fixtures et mondes neufs ignorés.
## Gestes et recettes
Jeter le premier ingrédient dans l'ouverture d'un chaudron vanilla vide ou
rempli d'eau. Ajouter les autres ingrédients par clic, jet dans l'ouverture
ou entonnoir. Un objet posé à côté ou sur l'extérieur du rebord n'est pas
capturé. La recette reste modifiable sans compte à rebours d'échec.
Un clic avec un bâton démarre une recette complète, avec une source de
chaleur dessous. Le bâton reste entier. Un mélange incomplet, un chaudron
froid ou une préparation déjà en cours donnent une indication FR/EN, sans
consommer d'ingrédient. Une modification annule l'avancement, sans paiement,
et demande un nouveau geste. La perte de chaleur suspend simplement les ticks
restants d'une recette déjà lancée.
Les **19 recettes historiques** et leurs durées restent inchangées. Les lots
regroupent les ingrédients identiques à la reconnaissance, tout en conservant
les vrais seaux non empilables dans les six cases natives. Trois seaux de lait
produisent six crèmes et rendent trois seaux, après la durée entière. Une
préparation ne poursuit pas une autre recette depuis ses restes. La sortie
et les ingrédients peuvent se récupérer, et l'eau restante retrouve son
niveau vanilla exact lorsque la variante culinaire se vide.
Les sons sont envoyés côté serveur, une fois par événement : ajout (volume
0,18 ; 0,35 pour le lait, limité à un son tous les quatre ticks), geste (0,30),
mijotage (0,12 tous les 60 ticks réellement cuits), fin (0,35), service (0,25).
Événements Minecraft : `entity.generic.splash`, `item.bucket.empty`,
`item.bottle.empty`, `block.bubble_column.bubble_pop`,
`block.brewing_stand.brew`, `entity.item.pickup`. Aucun fichier audio n'est
importé. Un chaudron froid ou non lancé ne joue pas le son de mijotage.
## Vérifications
Treize cas serveur natifs couvrent le jet de lait dans un chaudron vide,
le vrai geste au bâton, l'absence d'échec et de paiement prématuré, les
**19 recettes complètes**, les lots de seaux séparés, l'absence de recette
suivante automatique, les changements de préparation/eau, le manque de chaleur,
la pause, la sauvegarde et l'ancien avancement désarmé, les objets hors du
bol, les récipients jamais réabsorbés, la casse et l'entonnoir natif.
Les vérifications culinaires historiques ont été adaptées au geste manuel ;
les fixtures successives éliminent leurs anciens objets avant de préparer
la recette suivante, pour ne pas introduire d'ingrédients parasites.
Le parcours client réussi sous **Vulkan / Apple M1**, avec
**Sodium 0.9.2+mc26.3**, dure **1 min 15 s** sur un monde plat neuf de graine
**311**. Il couvre une vraie touche Q de jet de lait, la capture par les ticks
natifs, **650 ticks d'attente sans recette ni échec**, les HUD FR/EN aux
échelles 2, 3 et 4, les vrais paquets de geste et de service, la cuisson réelle,
le seau éjecté après le paiement, la fermeture/réouverture du monde et un
mélange invalide qui conserve le lait. Les 19 recettes sont visibles dans JEI.
Le jet Q est replacé au-dessus de l'ouverture par la fixture ; la chute,
la capture et la suite n'utilisent aucun raccourci de cuisson.
Un écouteur du moteur audio client a observé `item.bucket.empty`,
`item.bottle.empty`, deux `block.bubble_column.bubble_pop`,
`block.brewing_stand.brew` et `entity.item.pickup`. Ce contrôle vérifie l'envoi
et la réception des événements ; les volumes restent réglables dans la
catégorie native Blocs. Onze captures sont archivées dans
`build/cauldron311-screenshots/`, avec les journaux ignorés
`build/cauldron311-client.log` et `build/cauldron311-build.log`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCauldron311ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=cauldron311 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` a réussi en **2 min 52 s**, avec **89 tests serveur
obligatoires**. L’audit strict à beta.310 ne trouve aucun fichier ajouté ou
retiré du JAR : seuls les trois fichiers de classes du chaudron, les cinq
libellés FR/EN, la version et les crédits changent. Les 19 recettes, les
432 JSON de cuisine, 195 d’appareils et 376 d’agriculture ainsi que les
**1 108 PNG** restent identiques. Les classes compilées sont comparées au
JAR et les copies client/serveur sont identiques. Le modèle de pack de
ressources ne change que ses deux fichiers de langue et les crédits.
[Reçu de vérification](cauldron-beta311-verification.json). JAR local :
`mods/sanctuary/build/libs/sanctuary-beta.311.jar`
SHA-256 :
`3fa69ebc452ad2bbc3e7d6992305e9349d2f34f04f666a3688453fbd2fe74409`
Aucun push, tag, publication, avancement du canal packwiz, installation
Prism ou déploiement sur un serveur personnel n’a été effectué.
@@ -0,0 +1,67 @@
{
"version": "beta.312",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.312.jar",
"sha256": "90349a998970030ec0bfd880b307b9162e76fd0f460d70f1c9ac8ad2c115c8bd",
"previous_verified_sha256": "3fa69ebc452ad2bbc3e7d6992305e9349d2f34f04f666a3688453fbd2fe74409",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/culinary/block/CookingCauldronBlock.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/AbstractTimedCulinaryBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/CookingCauldronBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/CookingCauldronHud.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [],
"removed_jar_entries": [],
"generated_json_unchanged": {
"cuisine": 432,
"kitchen": 195,
"agriculture": 376
},
"culinary_compiled_classes_verified": 61,
"cauldron_recipes_unchanged": 19,
"manual_start": "stick",
"failed_dish_from_cauldron": false,
"milk_bucket_paid_at_completion": true,
"unchanged_native_inventory_indices": [
0,
1,
2,
3,
4,
5,
6
],
"preparation_storage_marker": 311,
"optional_storage_fields": [
"CauldronRepeatRecipe",
"CauldronCycleBatches"
],
"unchanged_pngs": 1108,
"server_required": 100,
"cauldron_scenarios": 11,
"repeat_recipe": true,
"cycle_quantity_fixed": true,
"completed_client_batches": 4,
"client_paid_milk_buckets": 5,
"client_returned_buckets": 5,
"client_total_cream": 10,
"client_vulkan": {
"log": "build/cauldron312-client.log",
"screenshots": "build/cauldron312-screenshots",
"screenshot_count": 10,
"world_seed": 312,
"sodium": "0.9.2+mc26.3",
"audio_engine_listener": true
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"build_log": "build/cauldron312-build.log"
}
+129
View File
@@ -0,0 +1,129 @@
# CUI-312 / IA-04 — répéter une recette dans le même chaudron
Demande du créateur du 29 octobre 2026 : refaire la même recette plusieurs
fois sans recommencer toute la préparation. Après le premier geste au bâton,
le chaudron garde la recette choisie et peut reprendre ses lots avec les mêmes
ingrédients, y compris après avoir servi les plats. Préparation locale
**beta.312**, même branche `codex/itsalive-26-3`, sans publication ni installation.
## Contrat de continuité avant modification
Les identifiants, les six entrées 0–5, la sortie 6, l'eau, les composants
natifs et les quantités maximales restent inchangés. La cuisson garde ses
lots historiques et ne paie les ingrédients et récipients qu'en fin de lot.
Le champ optionnel `CauldronCycleBatches` conserve la quantité fixée au début
du lot non payé. Les ajouts en cours de cuisson restent pour le lot suivant ;
ils ne terminent pas leur cuisson sur le dernier tick d’un lot déjà lancé.
Une ancienne cuisson sans ce champ garde sa quantité disponible à la reprise.
Le champ optionnel `CauldronRepeatRecipe` enregistre l'identifiant exact de la
recette autorisée au bâton. `AssemblyComplete` garde l'autorisation manuelle,
y compris en attente d'ingrédients ou de place. Le marqueur de préparation
manuelle **311** reste valide ; il ne désigne pas la version du mod.
Une ancienne préparation beta.311 lancée sans ce nouveau champ retrouve sa
recette au premier tick chargé. Une préparation ancienne non lancée ne
s'autorise pas toute seule. Les sauvegardes antérieures au démarrage manuel
restent désarmées, avec ingrédients, eau et sortie conservés. Une recette
mémorisée disparue du datapack arrête l'autorisation sans perte d'objets.
Une sauvegarde beta.312 garde la recette exacte, les ticks non payés et les
objets ; le rechargement ne termine pas de cuisson hors ligne.
Ajouter un ingrédient de la recette mémorisée ou remettre son eau alimente
la même série sans annuler le travail en cours. Retirer un ingrédient,
diminuer l'eau ou ajouter un ingrédient d'une autre recette annule le travail
non payé et demande un nouveau geste. Servir la sortie laisse la série en
place ; le chaudron attend la même recette et ne transforme pas ses restes
en un autre produit. Une sortie pleine ou la perte de chaleur suspendent la
série ; récupérer les plats ou remettre de la chaleur permet de reprendre.
Maj-clic à main vide arrête explicitement la série en conservant les objets.
Un chaudron vide retrouve alors sa variante vanilla et son eau exacte.
Le retour à beta.311 conserve les sept cases et les plats, mais perd la
répétition : récupérer les préparations en cours avant un tel retour.
Aucun monde personnel n'est ouvert ou modifié par cette préparation locale.
## Utilisation
1. Préparer les ingrédients et remuer une première fois avec un bâton.
2. Ajouter les mêmes ingrédients quand nécessaire, par clic, jet dans
l'ouverture ou entonnoir. Les quantités ajoutées pendant un lot attendent
le lot suivant, avec toute sa durée de cuisson.
3. Prendre les plats à main vide laisse la série en place, même si un lot
suivant est déjà en train de cuire. Une sortie pleine conserve ses objets
et attend leur collecte ; un manque d'ingrédients attend le réassort.
4. Maj-clic à main vide arrête la série. Les objets restent récupérables et
le chaudron vide retrouve sa variante vanilla. Un nouveau plat différent
demande de préparer ses ingrédients et de remuer à nouveau.
Les quantités historiques par lot sont conservées : plusieurs recettes
complètes déjà présentes au début d'un lot peuvent cuire ensemble. Un apport
pendant ce lot n'augmente pas rétroactivement sa quantité. Un lot paie toujours
ses vrais ingrédients en fin de cuisson, avec ses récipients. Les sons de fin
restent limités à un par lot terminé, même lorsqu'une ancienne sortie est
encore stockée. Les 19 recettes et leurs durées restent inchangées.
Le HUD FR/EN montre les plats stockés avec l'état de la série : cuisson,
ingrédients manquants, chaleur manquante ou sortie pleine.
## Vérifications locales
Onze nouveaux cas serveur vérifient : lots qui s'accumulent, service natif en
cours de cuisson, réapprovisionnement compatible sans annulation, ingrédients
nouveaux conservés pour leur cycle entier, changement de préparation,
sortie pleine puis reprise, recette exacte conservée malgré l'eau restante,
réassort d'eau et pause sans chaleur, entonnoir natif, sauvegarde d'un lot avec
sa quantité fixée et un autre lot en attente, reprise beta.311 autorisée,
recette supprimée sans remplacement implicite et arrêt explicite.
Le parcours client **Vulkan / Apple M1**, avec **Sodium 0.9.2+mc26.3**, a
réussi en **1 min 58 s**, monde plat neuf de graine **312** :
- une vraie touche Q pour jeter le premier lait, puis un seul coup de bâton ;
- des ajouts natifs pendant le premier lot, avec leur propre lot suivant ;
- quatre lots réels donnant **dix crèmes pour cinq seaux de lait**, avec
**cinq seaux vides** rendus et un seul son de fin par lot ;
- ajout d'un lait alors que la sortie contient encore les plats précédents ;
- service natif de six crèmes pendant la cuisson suivante, sans annulation ;
- sauvegarde/réouverture conservant recette, lot non payé et plats servis,
puis reprise avec la chaleur remise, sans nouveau geste ;
- HUD FR/EN aux échelles 2, 3 et 4, avec contrôle de largeur et captures ;
- vrai Maj-clic à main vide pour arrêter, puis collecte des quatre crèmes
restantes et retour au chaudron vanilla.
La fixture replace le jet Q au-dessus de l'ouverture et retire la chaleur
avant la fermeture du monde pour observer le lot non payé au rechargement.
Les ingrédients, chutes, paiements, ticks de cuisson, interactions et quatre
sons de fin sont réels. Dix captures sont archivées dans
`build/cauldron312-screenshots/` ; les journaux de contrôle restent ignorés.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCauldron312ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=cauldron312 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` a réussi en **2 min 51 s**, avec **100 tests serveur
obligatoires**. L’audit strict à beta.311 ne trouve aucun fichier ajouté ou
retiré du JAR : seuls les quatre fichiers de classes prévus (chaudron, HUD et
point de sélection de recette partagé), les quatre libellés FR/EN, la version
et les crédits changent. Les 19 recettes, les 432 JSON de cuisine, 195
d’appareils et 376 d’agriculture, ainsi que les **1 108 PNG**, sont identiques.
Les classes culinaires compilées sont comparées au JAR ; les copies
client/serveur sont identiques. Le modèle de pack de ressources ne change
que ses deux fichiers de langue et les crédits.
[Reçu de vérification](cauldron-repeat-beta312-verification.json). JAR local :
`mods/sanctuary/build/libs/sanctuary-beta.312.jar`
SHA-256 :
`90349a998970030ec0bfd880b307b9162e76fd0f460d70f1c9ac8ad2c115c8bd`
Aucun push, tag, publication, canal packwiz public, installation Prism ou
serveur personnel n’a été modifié.
+112
View File
@@ -0,0 +1,112 @@
# ZOMBIES-282 — Chargeur
Branche `codex/charger`, sur le socle local beta.281 conservé. État : livré et vérifié localement.
## Contrat
- `sanctuary:charger`, œuf `sanctuary:charger_spawn_egg`, noms FR/EN. Modèle
zombie adulte uniquement, tenue verte et pantalon anthracite ; texture native
26.3 recolorée par script, visage, peau, chaussures et UV conservés.
- Attributs de base : 10 PV, vitesse 0,27, mêlée 3, poursuite 36 blocs.
Charge depuis 4 à 15 blocs avec ligne de vue et sol sous les pieds :
préparation visible de 22 ticks, direction figée au départ, course de
24 ticks au maximum, choc de 4 dégâts avec recul, récupération de 48 ticks,
puis recharge de 100 ticks. Mêlée suspendue pendant ces trois phases.
- La collision est celle du déplacement réel : pas de frappe à distance ou
à travers un mur. Un joueur peut esquiver en sortant de la trajectoire.
Obstacles, cible invalide ou bord d'une zone chargée terminent la charge.
Aucune destruction de bloc, aucune téléportation ou génération forcée.
- Spawn peu fréquent dans les habitats de zombies de l'Overworld, poids 4,
un seul individu. Soleil, statut mort-vivant et absence de conversion en
noyé comme l'Infecté. Les autres variantes restent à réaliser.
- Familier adulte miniature, taille persistante variable, profil rare dédié :
16 PV, vitesse 0,28, mêlée ; technique G de charge droite jusqu'à 8 blocs,
préparation 22 ticks, récupération 24 ticks, recharge 12 secondes, dégâts 4.
Variante apprise : ruée droite courte de 5 blocs. Droits, alliés, limites de
dégâts et de contrôle restent ceux des familiers existants. Une charge
déclenchée consomme sa recharge même si elle manque sa cible.
- Œuf disponible en créatif ; pas de nouvelle acquisition en survie.
## Référence et sauvegardes
Référence en lecture seule : `../26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, variante `CHARGER` et
`tickCharger`. Les phases de l'ancien comportement servent de référence ; le
contrôle des coups repose ici sur la trajectoire réellement parcourue.
Le nouveau type a sa propre persistance native. Pour la charge, seule la recharge est sauvée ;
une phase interrompue reprend au repos avec une recharge à la relecture.
Les identifiants, formats, individus, œufs et textures déjà livrés restent
stables. Aucun monde personnel ouvert ; aucun chunk ou terrain réécrit.
## Validation
Les essais serveur ciblés ont validé les phases du mob avec déplacement natif,
le choc et son recul, la récupération sans double mêlée, l'esquive latérale,
un mur ajouté après le départ, la persistance d'une charge interrompue, le
profil et l'œuf, les dégâts du familier, sa trajectoire et sa recharge sur
échec. Deux contrôles couvrent aussi une téléportation interrompant la course
et les commandes d'une monture pendant la préparation. La sonde du corridor
complet vérifie les chunks avant toute collision ; elle ne les charge pas.
La construction finale **`check build assemblePack` passe en 2 min 59 s**,
avec les **45 cas ciblés**, dont onze nouveaux pour le Chargeur, et les contrôles
purs du dépôt. Log : `build/charger282-check-build-pack.log`.
Le parcours client **Vulkan / MoltenVK 1.4.2 / Apple M1** passe en **1 min 03 s** :
vrai appui sur G, déplacement et choc du familier, recharge et récupération,
phases préparation/course/choc d'un Chargeur sauvage, géométrie adulte,
tailles 500/1 000/1 500 ‰, rareté, infobulles et menus **FR/EN GUI 2/3/4**.
Douze captures sont conservées sous `build/charger282-screenshots/` ; vues de
la miniature ordinaire, de la préparation et du menu FR GUI 2 inspectées.
Log : `build/charger282-client-vulkan.log`, marqueur `CHARGER282_CLIENT_PASS`.
La comparaison des PNG confirme **570 pixels de vêtements recolorés**, avec
558 pixels de peau/visage et tous les alpha intacts. La texture de l'Infecté
rouge conserve exactement son empreinte beta.281. Génération reproductible :
```sh
python3 scripts/generate_infected_texture.py /chemin/minecraft-26.3-client.jar --variant charger
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=charger282,infected280,familiar260,companions \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCharger282ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Un contrôle historique de déplacement du dragon a échoué sur un passage
intermédiaire, puis passé sans changement sur le suivant ; sa stabilité n'est
pas démontrée par ce ticket. Un premier parcours client a passé ses étapes
avant une erreur fastutil dans `ChunkMap` à la fermeture du serveur de test.
La fixture nettoie désormais ses acteurs et attend leur retrait ; le parcours
final se termine normalement.
## Essai local
```mcfunction
/give @s sanctuary:charger_spawn_egg
/summon sanctuary:charger
```
L'œuf équipé invoque le familier miniature. G lance la charge ; les ordres et
la sélection d'aptitudes suivent les contrôles habituels. Pendant une charge
montée, préparation et récupération comprises, le pilote ne peut pas détourner
la trajectoire avec les commandes de déplacement. Les autres profils utilisant
`CHARGE` gardent leur comportement ; seul l'effet de profil `straight` utilise
ce nouveau contrôleur.
La fréquence des rencontres naturelles en partie longue et le comportement
sur toutes les formes de relief ne sont pas mesurés. Aucun monde personnel,
serveur, canal packwiz ou instance Prism modifié.
## Artefacts locaux
- Mod : `mods/sanctuary/build/libs/sanctuary-beta.282.jar`.
- Pack : `build/Sanctuary-beta.282.mrpack`.
- Captures : `build/charger282-screenshots/`.
- Reçu : `build/charger282-validation.json`.
JAR et MRpack vérifiés : version exacte, intégrité ZIP, Minecraft 26.3, Fabric
Loader 0.19.5, un seul JAR Sanctuary identique au build, profils et contrôleurs
de charge présents, deux textures identiques aux sources et fixtures exclues.
+113
View File
@@ -0,0 +1,113 @@
{
"version": "beta.314",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.314.jar",
"sha256": "82a2a6d8d4e2ad9d0aab754037995609722bbebac28db89a6e641c851ccb3ceb",
"previous_verified_sha256": "54ea931d2f54eec8dac2d03e5ad1df8fd5b389db235a536bdd98d90a531fbe55",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"data/sanctuary/recipe/ferment_vinegar.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/Cuisine.class",
"fr/koka/sanctuary/cuisine/KitchenAppliances.class",
"fr/koka/sanctuary/cuisine/KitchenClient$1.class",
"fr/koka/sanctuary/cuisine/KitchenClient.class",
"fr/koka/sanctuary/cuisine/KitchenJei$Category.class",
"fr/koka/sanctuary/cuisine/KitchenJei.class",
"fr/koka/sanctuary/cuisine/culinary/block/FermentationBarrelBlock.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/FermentationBarrelBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/FermentationBarrelHud.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [
"assets/sanctuary/blockstates/cheese.json",
"assets/sanctuary/items/grand_cru_wine.json",
"assets/sanctuary/items/reserve_wine.json",
"assets/sanctuary/items/table_wine.json",
"assets/sanctuary/models/block/cheese.json",
"assets/sanctuary/models/block/cheese_slice_1.json",
"assets/sanctuary/models/block/cheese_slice_2.json",
"assets/sanctuary/models/block/cheese_slice_3.json",
"assets/sanctuary/models/block/cheese_slice_4.json",
"assets/sanctuary/models/block/cheese_slice_5.json",
"assets/sanctuary/models/block/cheese_slice_6.json",
"assets/sanctuary/models/item/grand_cru_wine.json",
"assets/sanctuary/models/item/reserve_wine.json",
"assets/sanctuary/models/item/table_wine.json",
"data/sanctuary/loot_table/blocks/cheese.json",
"data/sanctuary/recipe/age_grand_cru_wine.json",
"data/sanctuary/recipe/age_reserve_wine.json",
"data/sanctuary/recipe/age_table_wine.json",
"data/sanctuary/sanctuary_recipe_collections/wine_maturation.json",
"data/sanctuary/tags/item/wines.json",
"fr/koka/sanctuary/cuisine/culinary/block/CheeseBlock.class",
"fr/koka/sanctuary/cuisine/recipe/WineMaturationRecipe$1.class",
"fr/koka/sanctuary/cuisine/recipe/WineMaturationRecipe.class"
],
"removed_jar_entries": [],
"generated_json": {
"cuisine": 432,
"kitchen": 228,
"agriculture": 376
},
"additive_cheese_wine_json": 20,
"culinary_source_classes": 52,
"culinary_compiled_classes_verified": 72,
"cheese_slices": 7,
"cheese_top_rind_yellow": true,
"cheese_eaten_cut_holes_only": true,
"young_wine_game_ticks": 3600,
"wine_age_clock": "server UTC epoch milliseconds, including server shutdown",
"wine_quality_threshold_real_days": [
1,
3,
7
],
"wine_quality_ids": [
"sanctuary:wine",
"sanctuary:table_wine",
"sanctuary:reserve_wine",
"sanctuary:grand_cru_wine"
],
"old_pngs_unchanged": 1108,
"new_pngs": 0,
"server_required": 126,
"cheese_wine_scenarios": 14,
"client_vulkan": {
"log": "build/cheese-wine314-client.log",
"screenshots": "build/cheese-wine314-screenshots",
"screenshot_count": 15,
"world_seed": 314,
"sodium": "0.9.2+mc26.3",
"native_paid_fermentation": true,
"native_paid_cheese_placement": true,
"native_seven_slices": true,
"actual_disk_partial_cheese_and_wine_reopen": true,
"native_grand_cru_collection_and_drinking": true,
"fixture_simulates_fermentation_and_real_age": true
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"template_added_entries": [
"assets/sanctuary/blockstates/cheese.json",
"assets/sanctuary/items/grand_cru_wine.json",
"assets/sanctuary/items/reserve_wine.json",
"assets/sanctuary/items/table_wine.json",
"assets/sanctuary/models/block/cheese.json",
"assets/sanctuary/models/block/cheese_slice_1.json",
"assets/sanctuary/models/block/cheese_slice_2.json",
"assets/sanctuary/models/block/cheese_slice_3.json",
"assets/sanctuary/models/block/cheese_slice_4.json",
"assets/sanctuary/models/block/cheese_slice_5.json",
"assets/sanctuary/models/block/cheese_slice_6.json",
"assets/sanctuary/models/item/grand_cru_wine.json",
"assets/sanctuary/models/item/reserve_wine.json",
"assets/sanctuary/models/item/table_wine.json"
],
"build_log": "build/cheese-wine314-build.log"
}
+131
View File
@@ -0,0 +1,131 @@
# IA-09 — fromage à partager et quatre qualités de vin — beta.314 locale
Demande du créateur : poser le fromage comme un gâteau, en manger les parts,
et distinguer quatre qualités de vin. Choix confirmé le 29 octobre 2026 :
vin jeune après les trois minutes de fermentation existantes, puis vin de table
après un jour réel, réserve après trois jours et grand cru après sept jours.
Un jour réel vaut 24 heures ; le serveur arrêté compte dans ce vieillissement.
Même branche `codex/itsalive-26-3`, sans publication ni installation.
## Contrat de continuité avant modification
L'objet `sanctuary:cheese`, ses recettes et son icône conservent leur identifiant.
Il devient un BlockItem du nouveau bloc `sanctuary:cheese`, avec la propriété
native de gâteau `bites=0..6`. Les objets des inventaires existants deviennent
posables sans conversion. Le fromage posé n'a pas de block entity. Les mondes
et la génération ne sont pas modifiés. Comme le gâteau, casser une meule ne
rend pas une meule neuve et perdre son support la détruit. Aucune part mangée
ne peut être récupérée par le minage. Les gâteaux et bougies vanilla restent
inchangés ; une bougie ne transforme pas le fromage en gâteau.
Le tonneau garde son identifiant, ses cinq cases, ses entrées, sa sortie et
les champs historiques de fermentation. Vin jeune, bière, fromage, vinaigre
et les autres procédés gardent leurs durées de fermentation en temps de jeu.
Les nouveaux objets sont `sanctuary:table_wine`, `sanctuary:reserve_wine` et
`sanctuary:grand_cru_wine` ; `sanctuary:wine` reste le vin jeune.
Seule une bouteille terminée qui reste dans la sortie du tonneau vieillit.
L'horodatage UTC côté serveur commence à sa transformation effective en vin
jeune. De nouveaux champs optionnels de version 1 mémorisent cet instant ;
un ancien vin déjà en sortie commence son vieillissement lors du premier
tick sous beta.314, sans âge inventé. Une fermentation ancienne en cours
continue avec ses champs historiques, puis commence son vieillissement.
Retirer le produit libère la sortie et efface uniquement son horodatage.
Le vin dans un inventaire garde la qualité obtenue, sans vieillissement caché.
Le vieillissement se calcule avec l'heure réelle du serveur, même après une
fermeture ou un déchargement. Dormir ou modifier l'heure Minecraft ne l'accélère
pas. Un recul de l'horloge ne dégrade jamais un vin déjà amélioré. La qualité
est matérialisée par l'objet lui-même, ce qui empêche les lots de qualités
différentes de fusionner. La collecte et la casse rendent seulement ce produit.
Un entonnoir actif récupère le jeune vin dès qu'il est prêt ; pour le laisser
vieillir, verrouiller cet entonnoir avec de la redstone ou le retirer.
Avant un éventuel retour à beta.313, consommer les nouvelles bouteilles ou les
transformer en vinaigre et manger les meules posées ; les identifiants ajoutés
n'existent pas dans l'ancienne version.
Aucun monde personnel n'est ouvert ou migré pour les essais.
## Aspect du fromage
Ajustement demandé pendant cette préparation : le dessus et la croûte extérieure
restent jaunes. Dès la première part, seule la face de coupe expose la texture
claire à trous, auparavant visible sur le dessus. La forme continue de diminuer
sur les sept états natifs du gâteau. Les icônes historiques de fromage et de vin
restent intactes ; les trois vins ajoutés reprennent le modèle de la bouteille
avec des noms, raretés et saturation croissants. Les quatre vins restent
compatibles avec la recette de vinaigre.
## Vérifications locales
Quatorze cas serveur natifs couvrent :
- paiement de la pose depuis l'objet historique, sept vraies prises de parts,
forme qui diminue, faim pleine, absence de conversion par bougie, casse et
perte de support sans restitution d'une meule neuve ;
- recette de moût toujours prête à 3 600 ticks, origine UTC créée seulement
lors de la production effective du vin jeune ;
- frontière à une milliseconde près pour 1, 3 et 7 jours, une bouteille unique,
qualité maximale stable, rechargement NBT, rattrapage d'un arrêt et recul de
l'horloge sans déclassement ;
- ancien vin sans date initialisé sans âge inventé, temps Minecraft indépendant,
retrait puis nouveau lot sans âge hérité, casse avec la bouteille réellement
obtenue, quatre qualités buvables et utilisables pour le vinaigre ;
- trois recettes en secondes réelles, découverte depuis le moût et extraction
par un vrai entonnoir qui libère correctement l'horodatage.
Le parcours graphique **Vulkan / Apple M1 / Sodium 0.9.2+mc26.3** utilise un
monde plat neuf de graine **314**. Il vérifie les vrais paquets de dépôt de
crème et sel, l'obtention du fromage, sa pose payée puis les sept prises de
parts nourrissantes. Une fermeture/réouverture du monde conserve la meule avec
trois parts déjà mangées et le vin de table avec son horodatage exact.
Les quatre prises restantes épuisent cette même meule après rechargement.
Les sept modèles vérifient leurs six faces : dessus et croûte jaunes,
face ouest de coupe trouée seulement après la première part. Une capture est
prise depuis cette face. Les cinq objets fromage/vins sont dans Nourriture et
boissons, avec des modèles valides et les libellés FR/EN aux échelles GUI 2/3/4.
Le HUD affiche les jours réels. Le grand cru issu du même moût se récupère et
se boit par les interactions natives, et trois étapes de garde sont synchronisées
dans leur catégorie JEI. Quinze captures sont conservées dans
`build/cheese-wine314-screenshots/` (ignoré).
Les tests **n'attendent pas réellement sept jours** et ne changent pas l'horloge
du poste : les cas serveur fournissent explicitement des instants de référence,
et la fixture graphique antidate seulement le champ UTC des bouteilles dans
son monde jetable. La fermentation initiale est rapprochée de son échéance
historique, puis se termine par les ticks natifs. Le retrait, la pose,
la sauvegarde/relecture, les sept parts et la consommation du vin restent réels.
Le parcours graphique final a réussi en **1 min 28 s**.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=cheesewine314,drying313,cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCheeseWine314ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=cheesewine314 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` a réussi en **3 min 24 s**, avec **126 tests serveur
obligatoires**. L'audit strict à beta.313 autorise seulement les deux nouvelles
classes de production, les 20 JSON ajoutés, la compatibilité vinaigre et les
modifications de catalogue d'objets, registre, interaction du tonneau,
horodatage, HUD, JEI, langues et crédits prévues pour ce ticket. Les
**1 108 PNG** historiques sont identiques et aucun PNG n'est ajouté.
Les 432 JSON de cuisine et 376 JSON d'agriculture restent identiques ; les
228 JSON d'appareils sont comparés aux générateurs. Les modèles de coupe
sont vérifiés sur les sept états. Les 52 classes sources culinaires et leurs
72 classes compilées sont contrôlées dans le JAR. Les copies de ce JAR dans
les assemblages client et serveur sont identiques. Le modèle du pack de
ressources contient les quatorze nouveaux JSON visuels.
[Reçu d'audit](cheese-wine-beta314-verification.json).
JAR local : `mods/sanctuary/build/libs/sanctuary-beta.314.jar`.
SHA-256 :
`82a2a6d8d4e2ad9d0aab754037995609722bbebac28db89a6e641c851ccb3ceb`
Aucun push, tag, publication, canal packwiz public, installation Prism ou
serveur personnel n'a été modifié.
+101
View File
@@ -0,0 +1,101 @@
# CLAIM-03 — Chunks et protection temporaire, beta.272
Branche `codex/inhabitant-property`. Contrat du 24 octobre 2026, avant changement des données.
Un claim est un chunk entier de 16 × 16 blocs du monde principal, sur toute
sa hauteur. L'admission Hello World donne accès au menu, sans terrain attribué.
Les cinq premiers chunks sont gratuits ; le sixième coûte 100 points d'XP,
le septième 200, puis +100 par chunk. Limite technique : 256 chunks par joueur,
10 000 par monde. Les chunks peuvent être séparés. Aucun abandon ni transfert
n'est proposé dans ce lot.
Chaque chunk peut recevoir sept jours de protection contre **64 saphirs**.
Le propriétaire mine alors à ×2 et les autres à ×0,5. Sans protection : ×1.
L'effet suit le bloc effectivement miné, même dans une sélection groupée.
La pose, l'utilisation, les explosions, fluides et autres mécanismes gardent
leurs règles normales. Le claim demeure après expiration. Le renouvellement
est manuel et ajoute sept jours à la durée restante, sans prélèvement automatique.
Le temps compte en millisecondes monotones de serveur démarré, y compris sans
propriétaire connecté. Il ne dépend ni du calendrier ni du nombre de ticks.
L'arrêt normal sauvegarde l'horloge ; la relance reprend sa valeur sans compter
l'arrêt. Sauvegarde toutes les 60 secondes et à chaque achat : un arrêt brutal
peut restituer au plus le temps depuis le dernier point de sauvegarde (environ
60 secondes, ou davantage si la boucle serveur est bloquée).
## Contrat de sauvegarde et migration
Nouveau registre séparé `<monde>/sanctuary/chunk-claims-v1.json`, schéma 1,
lié à la graine. Il contient l'horloge serveur, une révision, les chunks, les
transactions en attente et les UUID ayant volontairement quitté l'ancien modèle.
Écritures atomiques vérifiées ; format invalide conservé et mutations suspendues.
Un reçu persistant natif joueur `sanctuary:chunk_purchase_receipt_v1` relie le
débit XP/saphirs ou le remboursement à la validation du registre. Une transaction
réservée sans reçu sauvegardé est annulée ; un reçu durable la valide une seule fois.
L'ancien `properties-v1.json` reste dans son format exact. Ses volumes et leurs
droits restent actifs tant que le propriétaire ne confirme pas la migration.
La migration retire volontairement les droits de son volume et rembourse les
extensions : 100, 300, 600 ou 1 000 XP selon le palier. Aucun chunk n'est créé
à partir du volume : le joueur choisit ensuite ses chunks, dont cinq gratuits.
Les achats anciens en attente sont résolus avant cette migration. Un nouveau
chunk ne peut recouvrir l'emprise horizontale d'un volume ancien encore actif.
Aucun bloc, terrain, génération, seed ou sauvegarde personnelle n'est modifié.
Un **clic droit directement sur la carte** ouvre un petit panneau sur le chunk :
propriétaire, tarif, durée et bouton Revendiquer ou Protéger. Le prix apparaît
avant l'action ; le clic sur ce bouton réalise l'achat sans quitter la carte.
Échap ou un clic ailleurs ferme ce panneau. Aucun menu de grille séparé et aucun
mode à activer pour le clic droit de l'Atlas ordinaire.
Habitant → Propriété et `/sanctuary property` ouvrent cette carte directement.
Avant l'aptitude Atlas, elle montre uniquement le terrain déjà chargé et envoyé
au joueur, à huit chunks au plus, sans conserver un historique supplémentaire.
Les échantillons sont bornés à quatre tuiles par joueur et par tick, dans un
budget global de 2 ms, sans charger de chunks. L'Atlas complet garde ses
prérequis ; une fois débloqué, les tuiles découvertes peuvent aussi être choisies.
Le serveur contrôle la portée, la frontière, la réserve de départ de 32 blocs,
les fonds et la révision. La migration de l'ancien volume requiert une seconde
confirmation explicite dans le panneau, avec le remboursement indiqué.
## Validation
Les **58 vérifications indépendantes** du registre passent : cinq claims gratuits,
prix suivants, conflits, révision périmée, reprise avec ou sans reçu, horloge,
trente jours d’arrêt simulés, renouvellement, expiration, migration et refus de
JSON invalide ou d’une graine différente.
Le parcours client **Vulkan**, en **FR/EN GUI 2/3/4**, réussit en **54 s** :
admission réelle, carte proche avant aptitude Atlas, recentrages rapides,
clic sur un chunk voisin (9, 8 alors que le joueur est en 8, 8), premier claim,
débit d’un stack de saphirs, puis clic droit dans l’Atlas ordinaire, panneau
compact et Échap conservant la carte. Les huit captures finales sont dans
`build/claims272-screenshots/` ; les formats FR GUI 2/4 et EN GUI 4 ont été
inspectés. La fermeture ne reproduit plus l’exception de parcours des sessions
Blocodex : le flush parcourt désormais un instantané stable.
Les tests natifs ciblent les paiements XP et saphirs, les reçus sauvegardés dans
le joueur, les vrais `getDestroyProgress`, la frontière du chunk, la hauteur,
les interactions libres, la migration remboursée et les refus terrain inconnu / spawn.
Le lot couvre aussi les anciens volumes, le minage, les menus et l’overview.
`check build assemblePack` réussit : **25 tests natifs ciblés**, en 2 min 44 s
pour la commande complète. Le MRpack beta.272 est exporté et vérifié : ZIP,
Minecraft 26.3, Loader 0.19.5 et octets des deux JAR locaux identiques aux builds.
Les archives beta.270 et beta.271 gardent leurs hashes antérieurs.
La validation finale et le MRpack sont consignés dans
`build/claims272-validation.json`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=claims272,property270,mining,overview271,menus \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryClaims272ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Le multiplicateur s’applique à la progression native ; les blocs instantanés,
le Créatif et la granularité des ticks conservent leur fonctionnement Minecraft.
Abandon, transfert, partage de droits et protection contre les mécanismes
indirects restent hors de ce lot. Aucun serveur ou instance personnelle déployé.
+120
View File
@@ -0,0 +1,120 @@
# CLAIM-278 — Duel Battle consenti pour une propriété
Branche `codex/claim-battle-duels`, demande du 25 octobre 2026.
Le créateur confirme que cette étape vise les propriétés déjà revendiquées.
## Contrat du duel
Depuis le clic droit sur un claim, un autre habitant peut proposer de le disputer.
Le challenger doit avoir atteint le seuil d’habitation Demeure sur ce chunk ;
la priorité d’influence ne lui est pas nécessaire pour une proposition consentie.
Le propriétaire garde ses droits acquis, même sans preuve Demeure rétroactive.
Les deux joueurs doivent avoir Carte active et être disponibles pour Battle.
Le challenger valide une proposition explicite ; le propriétaire accepte ou
refuse celle-ci. Le chunk, les deux participants, le temps de protection restant
et les règles sont affichés. Une acceptation ne vaut que pour cette proposition.
Une modification du claim avant acceptation invalide la proposition.
L’acceptation crée un Battle privé à deux joueurs : joueurs seuls, rayon de
48 blocs autour du lieu annoncé par le challenger, cinq minutes, nourriture,
potions et perles autorisées, mise d’entrée nulle. Les deux joueurs doivent
être dans ce périmètre. Chacun valide ensuite Prêt dans Battle ; le challenger
lance la préparation native de dix secondes. Aucun troisième participant ne
peut rejoindre ce duel. Les morts, tombes, abandons et déconnexions pendant
le combat suivent les règles Battle existantes. Elles sont rappelées avant
l’accord. Pas de téléportation ni terrain créé automatiquement.
Le vainqueur devient propriétaire du seul chunk annoncé. Le défenseur gagnant
conserve son claim. L’échéance absolue de protection est conservée : aucun temps
n’est ajouté, retiré ou remboursé. Couleur, nom et multiplicateurs de minage
suivent le nouveau propriétaire. Aucun coût XP ou saphir supplémentaire n’est
prélevé pour transférer un claim déjà acheté.
Refus, annulation avant lancement, expiration d’invitation, égalité ou interruption
du serveur sans résultat enregistré : aucune mutation de propriété. Un abandon
ou une déconnexion après lancement vaut défaite selon Battle. Les autres claims
et les duels ordinaires restent indépendants.
## Contrat de persistance et reprise
Aucune modification des schémas de Demeure, des claims, des mises Arena ou des
reçus joueurs. Aucun monde personnel, chunk ou génération n’est modifié par les
essais. Le transfert met à jour uniquement le propriétaire d’un claim existant,
dans le schéma 1 de `sanctuary/chunk-claims-v1.json`, par écriture atomique.
Nouveau journal indépendant `sanctuary/claim-duels-v1.json`, schéma 1, lié à la
graine. Il enregistre les deux accords sur le chunk et son état initial avant
la création du Battle, puis le vainqueur avant toute mutation de propriétaire.
Le résultat est appliqué par comparaison de l’état attendu, puis clôturé. Une
reprise après interruption entre l’écriture du résultat et sa clôture applique
ce transfert une seule fois. Les accords sans résultat durable sont annulés
au redémarrage ; les mises Battle suivent leur propre journal de remboursement.
Les mutations du claim sont bloquées pendant un accord actif ou un résultat à
régler. Les limites de propriété sont vérifiées avant accord ; les participants
inscrits à Battle ne peuvent acheter d’autres claims pendant celui-ci. Les
fichiers invalides ou modifiés extérieurement sont conservés et les nouveaux
duels sont refusés. Une erreur avant écriture durable du vainqueur ne transfère
pas la propriété ; une erreur après cette écriture garde le résultat à reprendre.
Terminer les duels et solder le journal avant retour à une version antérieure.
## Vérification
`check build assemblePack` réussit en **2 min 55 s**, avec **40 tests serveur
ciblés**. Les six nouveaux scénarios vérifient l’absence de transfert ou de
combat sans le deuxième accord, les refus du challenger et des tiers tentant
d’accepter à la place du propriétaire, le refus du propriétaire, la relecture
de la proposition la plus récente, les validations Prêt natives, la mort réelle
résolvant Battle et transférant le chunk exact, la conservation de son échéance,
l’abandon après lancement, l’annulation avant lancement, l’égalité native au
délai écoulé et l’invalidation d’un enjeu modifié ou expiré. Une arène publique
ordinaire accepte toujours un troisième inscrit ; y gagner ne donne aucun claim.
Les **26 vérifications pures** du journal couvrent le consentement durable,
les identités et chunks réservés, le refus d’un gagnant tiers, le redémarrage
sans résultat, le résultat enregistré avant transfert, la reprise après mutation
avant clôture, l’idempotence, la victoire du défenseur, les conflits de propriétaire
ou de protection, la limite de 256 claims, la graine, les nombres JSON stricts
et les fichiers corrompus ou modifiés extérieurement. Les **63 contrôles du
registre de claims**, Demeure et les scénarios historiques ciblés passent aussi.
Le parcours **Vulkan FR/EN GUI 2/3/4** réussit en **53 s**, avec **18 captures**.
Il ouvre le dossier depuis le clic droit de l’Atlas, lit les conséquences et
les boutons d’acceptation/refus dans les deux langues aux trois tailles, refuse
par le vrai paquet client, puis accepte une nouvelle proposition. L’enjeu est
présent dans Battle avant Prêt. Une victoire native du propriétaire conserve
son terrain. Après le délai de sortie de combat existant, le client devient
challenger d’une autre propriété ; son propriétaire accepte indépendamment,
les deux valident Prêt et le client lance réellement Battle. La mort native du
défenseur transfère le claim et son échéance exacte. La carte déjà ouverte
reçoit le nouveau propriétaire/couleur et raccorde le CTM au claim voisin sans
réouverture. Captures : `build/claims278-screenshots/` ; inspections des écrans
FR GUI 4 d’accord, FR GUI 2 de Battle et de la carte après transfert.
La réouverture d’un dossier n’est pas limitée par le délai anti-double-action :
les lectures peuvent changer immédiatement de proposition, tandis que les
mutations restent temporisées. Le panneau d’accord dispose d’un fond lisible
et son compteur n’oblige pas à revenir en haut du défilement chaque seconde.
Les combattants de ce parcours sont à l’air libre dans un monde plat ignoré.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=claims278,claims277,menu275,claims273,claims272,property270,mining,overview271,menus,map,demeure \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryClaims278ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
MRpack beta.278 exporté et vérifié : intégrité ZIP, Minecraft 26.3, Loader 0.19.5,
versions/libellés, nouveaux contrôleurs présents et deux JAR identiques aux
builds locaux. Les huit archives beta.270 à beta.277 gardent leurs empreintes.
Reçu : `build/claims278-validation.json`. Aucun déploiement de serveur, monde
personnel ou instance Prism, ni publication de canal.
Le lot porte sur un seul chunk déjà revendiqué et un Battle entre joueurs.
Les familiers/modes mixtes, ensembles de claims, transferts sans combat ou
attributions de terrains encore libres ne sont pas ajoutés. Les reprises sont
éprouvées aux étapes du journal, sans simulation d’une panne physique du disque.
+80
View File
@@ -0,0 +1,80 @@
# CLAIM-276 — Contours CTM et protection à huit saphirs
Branche `codex/inhabitant-property`, demande du 25 octobre 2026.
## Résultat demandé
Toutes les propriétés doivent apparaître sur l’Atlas et son aperçu de Pause.
Les claims d’un même propriétaire forment un contour continu, sans traits
internes entre chunks adjacents. Une propriété sans protection garde uniquement
son contour ; un chunk protégé ajoute un fond à la couleur du propriétaire.
La protection coûte désormais **8 saphirs par chunk pour trois jours de serveur
en marche**. Un arrêt du serveur suspend toujours le compteur ; une déconnexion
ne le suspend pas. Les multiplicateurs de minage ×2 / ×0,5 restent identiques.
## Rendu et accès
- Contour d’un pixel de carte, directement dans les textures de terrain et de
calque, avec les mêmes coordonnées et le même échantillonnage que la carte.
- Raccords par propriétaire sur les quatre côtés et les angles rentrants ;
la protection d’un voisin ne crée pas de frontière intérieure de propriété.
- Fond uniquement sur les chunks encore protégés. À expiration, le contour
reste visible et la propriété demeure attribuée.
- Toute arrivée, suppression ou modification de claim recalcule aussi ses
voisins, y compris les diagonales. Les achats actualisent la carte ouverte.
- Couleur persistante du personnage, même hors ligne ; légende compacte pour
tous les propriétaires visibles, survol et masquage conservés.
- Aucun pixel de brouillard ou de vide n’est coloré. Seules les métadonnées des
tuiles effectivement transmises sont acceptées. L’aptitude Carte achetée et
active reste obligatoire pour ouvrir et gérer les propriétés.
- Demeure et la disposition Habitant / Pause de beta.275 sont conservés.
## Contrat de conservation
Le schéma 1 de `sanctuary/chunk-claims-v1.json` et les reçus natifs restent
identiques. Aucune réécriture automatique d’échéance, conversion de terrain,
remise à zéro, attribution depuis Demeure ou régénération n’est effectuée.
Les protections de sept jours déjà payées gardent leur échéance exacte.
Une transaction de sept jours préparée par beta.272–275 reste récupérable :
son reçu de paiement natif valide sa durée d’origine ; sans reçu, elle est
annulée comme avant, sans retirer la couverture antérieure. Le lecteur accepte
les deux périodes préparées, trois et sept jours ; les nouvelles réservations
créées par beta.276 utilisent uniquement trois jours. Chaque renouvellement
ajoute trois jours à l’échéance en cours si elle est encore active, sinon au
temps serveur courant, contre huit saphirs. Aucun remboursement rétroactif
n’est appliqué aux achats antérieurs.
## Vérification
`check build assemblePack` réussit en **2 min 38 s**, avec **30 tests serveur
ciblés** et **63 vérifications du registre**. Les achats natifs refusent sept
saphirs sans mutation, consomment exactement huit saphirs répartis sur plusieurs
piles, couvrent un seul chunk pour trois jours et ajoutent exactement trois
jours lors d’un renouvellement. La reprise avec/sans reçu d’une ancienne période
de sept jours et le renouvellement de cette couverture après redémarrage sont
vérifiés. Les protections et multiplicateurs restent applicables sans Carte.
Le parcours **Vulkan FR/EN GUI 2/3/4** réussit en **50 s**, avec **19 captures**.
Il achète réellement Carte et une protection, contrôle les pixels du contour et
du fond, le raccord en L et carré, les frontières entre propriétaires, le nom et
la couleur du propriétaire hors ligne, l’arrivée d’un voisin sans réouverture,
l’expiration dans le modèle, les paquets périmés et la borne du monde, le
masquage/réaffichage et les pixels de l’aperçu de Pause. Les libellés montrent
huit saphirs et trois jours. Captures dans `build/claims276-screenshots/` ;
inspection des vues carte FR GUI 2, contexte FR GUI 4 / EN GUI 2 et Pause GUI 4.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=menu275,claims273,claims272,property270,mining,overview271,menus,map,demeure \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryClaims276ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
MRpack beta.276 exporté et vérifié : intégrité ZIP, Minecraft 26.3, Loader 0.19.5,
versions et libellés FR/EN, deux JAR embarqués identiques aux builds locaux.
Les six archives beta.270 à beta.275 gardent leurs empreintes. Reçu :
`build/claims276-validation.json`. Aucun déploiement personnel ni publication
de canal n’est effectué.
+98
View File
@@ -0,0 +1,98 @@
# CLAIM-277 — Habitation et influence avant revendication
Branche `codex/claims-demeure`, demande du 25 octobre 2026.
Le créateur confirme le seuil existant de Demeure et précise qu’un autre joueur
peut revendiquer le terrain s’il prend plus d’influence avant le premier claim.
## Règles
Une simple visite ne permet plus de revendiquer un chunk. Demeure doit y
reconnaître un habitant : influence totale d’au moins 0,8, dont au moins 20 %
pour un joueur, selon les seuils déjà utilisés par sa lecture du territoire.
Aucun compteur de minutes, nuits ou délai supplémentaire n’est introduit.
Sur un chunk libre, l’habitant avec le plus d’influence effective actuelle peut
revendiquer. À égalité (tolérance numérique 10⁻⁹ pour les arrondis), l’ordre
persisté des premières contributions acceptées départage les habitants.
Ainsi, le premier garde la priorité jusqu’à ce qu’un autre le dépasse. Les
contributions peuvent précéder l’achat de Carte. Une identité hors ligne peut
rester prioritaire ; les autres joueurs peuvent la dépasser par leur activité.
La décroissance native de Demeure continue de s’appliquer aux terrains libres.
Le clic droit sur la carte explique la condition manquante ou nomme l’habitant
prioritaire ; l’action est désactivée si la condition n’est pas remplie. Le
panneau d’un terrain libre s’actualise. Commande et paquets d’action vérifient
la même priorité côté serveur, au moment de l’achat, avant toute réservation
ou dépense. Aucun duel ou transfert automatique n’est ajouté.
Une fois revendiqué, le claim reste attribué malgré les variations d’influence.
Tous les claims antérieurs et leurs durées de protection sont conservés, sans
exiger de preuve rétroactive. Leur protection reste renouvelable même si Demeure
est indisponible. Cinq claims gratuits puis XP, huit saphirs pour trois jours de
serveur, contours CTM et accès par Carte achetée et active restent inchangés.
## Contrat de conservation
Aucun nouveau fichier ni changement de schéma. `data/demeure/footprints-v1.json`
et `sanctuary/chunk-claims-v1.json` restent identiques. L’ordre des premières
traces est déjà conservé par la liste des influences et son rechargement ; on
ne prétend pas reconstituer une date de franchissement du seuil absente des
anciennes données. La requête de priorité est une lecture des empreintes,
indépendante de leur tri visuel par influence et de l’UUID des joueurs.
Demeure conserve la responsabilité des traces, des budgets, des seuils, de la
décroissance et de leur persistance. Sanctuary applique ses conditions de
revendication. Les empreintes sont sauvegardées atomiquement avant de réserver
ou débiter un nouveau claim. Une lecture ou écriture refusée empêche cet achat
sans effacer le fichier ; les propriétés déjà acquises restent valables.
Un paquet de lecture `sanctuary:claim_residency_v1` fournit l’état et le nom/couleur
prioritaire pour le seul chunk sélectionné et accessible. Les anciens codecs
et identifiants restent inchangés. Aucun état d’habitation n’est transmis pour
un terrain inaccessible ou avant Carte. Aucun monde personnel ni génération
n’est modifié par les essais.
## Vérification
`check build assemblePack` réussit en **2 min 52 s**, avec **34 tests serveur
ciblés**. Les quatre nouveaux tests couvrent les activités natives nécessaires,
le refus d’un passage ou d’un achat sans habitation, cinq claims gratuits puis
le coût du sixième, l’égalité et le dépassement avant revendication, l’acquisition
par le nouvel habitant prioritaire, l’absence de transfert après achat et le
renouvellement sans domination Demeure. Les propriétés anciennes sans preuve
rétroactive restent protégées ; le paquet de lecture est testé, ainsi que le
refus de divulguer les habitants d’un chunk inaccessible ou avant Carte.
Les tests purs Demeure ajoutent **14 scénarios d’habitation, priorité et point
de sauvegarde**, dont l’ordre conservé après rechargement, indépendamment du tri
visuel et des UUID, la décroissance, les dimensions et l’intégrité du fichier
même quand le modèle en mémoire n’a pas changé. Les **63 vérifications du registre
de claims** et les scénarios historiques ciblés passent aussi. Les montages de
paiement et de migration préparent leurs traces d’habitation indépendamment des
tentatives de claim : un clic refusé ne crée aucune influence.
Le parcours **Vulkan FR/EN GUI 2/3/4** final réussit en **51 s**, avec **28 captures**.
Il passe par Hello World et l’achat de Carte, constate le bouton désactivé avant
habitation, le refus d’un simple passage, le changement de priorité quand Nora
prend plus d’influence et son retour au joueur lorsque celui-ci la dépasse.
Un autre spot libre est réellement revendiqué par Nora après dépassement.
Le nom/couleur prioritaire et le bouton désactivé sont vérifiés dans les deux
langues aux trois tailles ; les contextes d’achat et de protection, les contours
CTM, le masquage et l’aperçu de Pause restent valides. Captures dans
`build/claims277-screenshots/`, avec inspection des panneaux FR GUI 4 et EN.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=claims277,menu275,claims273,claims272,property270,mining,overview271,menus,map,demeure \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryClaims277ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
MRpack beta.277 exporté et vérifié : ZIP, Minecraft 26.3, Loader 0.19.5,
versions et libellés FR/EN, octets des deux JAR embarqués identiques aux builds
locaux. Les archives beta.270 à beta.276 restent identiques. Reçu :
`build/claims277-validation.json`. Aucune publication de canal ni synchronisation
d’installation personnelle n’est effectuée.
+71
View File
@@ -0,0 +1,71 @@
# CLAIM-04 — Couleurs et état des claims sur la carte, beta.273
Branche `codex/inhabitant-property`, demande du 24 octobre 2026.
Chaque chunk revendiqué porte la couleur persistante de son propriétaire,
choisie dans Hello World. Le nom et la couleur restent disponibles hors ligne.
Un claim protégé a une teinte plus présente, une bordure pleine et un bouclier ;
un claim sans protection a une teinte légère et une bordure en pointillés.
Le survol donne le propriétaire, l’état et la durée restante ; une légende
rappelle les deux styles. Le clic droit continue à ouvrir le panneau existant.
Un bouton **Propriétés : oui/non** masque ou réaffiche la teinte, les bordures,
les boucliers, la légende et les infobulles de claims. Le choix est partagé
avec l’aperçu de Pause et conservé tant que le client reste ouvert, y compris
après fermeture de la carte. Le clic droit et les protections restent actifs ;
les données continuent de se mettre à jour pour un réaffichage immédiat.
Ce choix de session n’ajoute aucun fichier ni format de sauvegarde.
Les apparences sont envoyées automatiquement avec les tuiles de la carte,
pour la vue proche comme pour l’Atlas. Aucun clic préalable n’est nécessaire.
Seules les tuiles déjà transmises au joueur reçoivent leurs claims ; aucun
terrain inconnu n’est révélé. Une acquisition ou un renouvellement actualise
la tuile affichée. L’expiration change le style depuis la durée serveur restante,
sans retirer la propriété. Les réponses d’une ancienne requête sont ignorées. Les achats diffusent aussi
une mise à jour ponctuelle des cellules déjà observées, indépendante d’un
rafraîchissement en cours ; aucune cellule inconnue n’est acceptée côté client.
Ce lot ajoute un paquet de présentation borné. Les identifiants existants,
registres, reçus, règles, prix, durées et formats de sauvegarde restent identiques
à beta.272. Aucune migration ni modification de terrain.
## Validation
Le parcours **Vulkan FR/EN, GUI 2/3/4**, passe en **62 s** sur un nouveau monde
plat de graine 273. Il conserve l’admission et les achats réels de beta.272,
puis compare quatre chunks contigus appartenant à deux propriétaires : chacun
a un chunk protégé et un chunk sans protection. L’un des propriétaires n’est pas
connecté. Les couleurs distinctes, le nom hors ligne, les deux styles, les
mises à jour après achat, les requêtes rapides, le clic droit, Échap et l’aperçu
de Pause sont vérifiés. Le masquage, sa conservation après fermeture, le clic
droit sous masquage et le réaffichage sont contrôlés, avec captures de la carte
et de l’aperçu de Pause sans propriétés. **19 captures** sont conservées dans
`build/claims273-screenshots/`, avec inspection FR GUI 2/4, EN GUI 4 et Pause.
Le cache est également vérifié avec une horloge contrôlée : expiration sans
perte de propriété, réponse périmée ignorée, mise à jour d’achat pendant un
rafraîchissement, cellule inconnue refusée et remplacement par une tuile vide.
Le test serveur ajouté couvre le nom et le RGB persistants d’un propriétaire
hors ligne, la durée et le codec du paquet, avec refus hors des cellules
transmises et au-delà de 64 cellules. Les registres conservent leurs 58
vérifications indépendantes de beta.272.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=claims273,claims272,property270,mining,overview271,menus \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryClaims273ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` réussit en **2 min 41 s**, avec **26 tests serveur
ciblés** et les 58 vérifications indépendantes du registre. Le MRpack beta.273
est exporté et vérifié : ZIP, Minecraft 26.3, Loader 0.19.5 et octets des deux
JAR locaux identiques aux builds. Les archives beta.270 à beta.272 restent
inchangées.
Le reçu final de build et de distribution est dans
`build/claims273-validation.json`. Aucun serveur, canal packwiz, monde ou
instance personnelle déployé. Aucun changement du comportement de protection.
+19
View File
@@ -0,0 +1,19 @@
{
"version": "beta.305",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.305.jar",
"sha256": "8c9b358c5c3caac3b9aa9a94230c7f6c6761d32f26002522bd8eba59c7f1cc2b",
"generated_json": {
"cuisine": 432,
"kitchen": 192,
"agriculture": 376
},
"culinary_classes": 44,
"server_required": 78,
"crushing_scenarios": 8,
"physical_recipes": 80,
"device_blueprints": 90,
"client_vulkan": {
"crushing": "build/crushing305-client.log",
"super_piston_regression": "build/crushing305-piston-client.log"
}
}
+149
View File
@@ -0,0 +1,149 @@
# CUI-305 — écraser les fruits sans presse
Demande du créateur du 28 octobre 2026, précisée pour le super piston et
confirmée : **huit paliers et neuf portions**. Préparation **beta.305** sur
`codex/itsalive-26-3`, après beta.304. Travail local, sans publication,
installation dans Prism ou déploiement serveur.
## Comportement retenu
La presse alimentaire quitte les recettes, les onglets créatifs et JEI.
Les blocs de tomates, raisins et olives s'écrasent directement dans le monde.
Leurs identifiants restent `sanctuary:tomato_block`, `grape_block` et `olive_block`.
Les textures fournies restent intactes.
Chaque bloc possède **huit hauteurs**, de 16 à 2 pixels. Un véritable saut
suivi d'un atterrissage retire un palier et fait apparaître les résidus en
objets dans le monde : pulpe de tomate, moût de raisin ou huile d'olive.
Les sept premiers sauts libèrent une portion chacun ; le huitième libère les
deux dernières et supprime le bloc. Le joueur descend sur la nouvelle surface.
Marcher, rester immobile et faire tomber un objet ne déclenchent rien.
La petite chute de deux pixels provoquée par l'écrasement n'est pas un
nouveau saut. Seuls les joueurs piétinent ces blocs.
Un **piston normal ou collant**, dans les six directions, écrase immédiatement
le bloc rencontré lors de sa sortie. Il libère uniquement le rendement restant.
Aucune presse, aucun réservoir ou récipient n'est requis : les portions sont
libres et peuvent être ramassées ou collectées par les moyens vanilla.
Aucune bouteille ou aucun bol n'est créé comme retour d'une portion libre.
Les portions déjà conditionnées de beta.304 gardent leurs composants de retour.
Le **super piston** conserve sa face 3 × 3, sa course de trois blocs et sa
capacité habituelle de déplacement. Une activation complète peut écraser les
**27 blocs** situés sur ses trois profondeurs, soit **243 portions** pour un
lot intact. Les neuf blocs rencontrés à chaque étape sont traités par le plan
commun du super piston ; un obstacle qui empêche une étape ne consomme aucun
fruit de cette étape. Les matériaux ordinaires conservent leurs règles.
Les blocs de fruits gardent leur gravité historique. Leur palier est porté par
l'état de bloc, y compris pendant une chute et après sauvegarde.
## Rendement, casse et recettes
Un bloc intact coûte neuf fruits et peut encore se décompacter en neuf fruits.
Après un ou plusieurs sauts, le casser rend **uniquement les fruits restants**,
sans redonner un bloc entier. Cela empêche de récupérer neuf fruits en plus
des résidus déjà obtenus. Par exemple :
| Situation | Déjà obtenu | Ce qui reste dans le bloc |
| --- | ---: | ---: |
| Bloc intact, 8 paliers | 0 | 9 |
| Après trois sauts, 5 paliers | 3 | 6 |
| Après six sauts, 2 paliers | 6 | 3 |
| Dernier palier | 7 | 2 |
Un piston appliqué à un bloc de deux paliers donne donc trois portions,
y compris après fermeture et réouverture du monde. La casse ordinaire utilise
les tables de butin natives 26.3 avec leurs conditions d'état et quantités ;
la destruction par piston remplace seulement ces butins par le produit écrasé.
Les trois identifiants de recettes `sanctuary:press_*` et le sérialiseur
`sanctuary:food_pressing` sont conservés pour les données et la progression.
Dans JEI, leur catégorie devient **Écrasement des fruits / Fruit Crushing**,
avec les deux gestes expliqués en FR/EN. Le total des recettes physiques reste
80 ; la recette de la presse disparaît, laissant dix fabrications d'équipement
et de stockage. Les recettes des autres appareils restent en place.
## Contrat de continuité locale
Aucun monde existant n'est modifié ou converti par ce lot. Un ancien état de
fruit sans propriété `layers` se charge comme un bloc plein de huit paliers.
Les nouveaux paliers utilisent le format natif des états de blocs ; les
identifiants et les recettes de compactage restent stables.
L'identifiant de presse introduit dans la préparation locale beta.304 reste
**inactif**, uniquement pour lire ses anciens inventaires : aucun traitement,
aucune recette, aucun catalogue créatif ou JEI. Un inventaire d'essai peut être
récupéré à main vide ou à la casse. Ses quatre anciennes cases utilisent le
même encodage natif. Il n'y a pas de conversion automatique en appareil ou en
fruits, ni de suppression silencieuse d'une sauvegarde. Aucun nouveau monde,
serveur ou chargement d'instance personnelle n'est engagé pour cette continuité.
## Implémentation et validation
`CrushableProduceBlock` gère la hauteur, les atterrissages et le rendement.
Le dernier palier de deux pixels nécessite de prendre le support réel du
joueur : le repère historique de chute de Minecraft regarde 0,2 bloc plus bas
et désigne sinon le sol sous le fruit. L'adaptation reste limitée aux
atterrissages des joueurs sur ces blocs.
Les pistons vanilla gardent leur résolution native des mouvements, avec la
réaction `POPPED` et un remplacement ciblé du butin lors de l'écrasement.
Le super piston utilise ce même rendement dans son plan commun déjà validé,
avant la création des têtes mobiles. Les 21 modèles de hauteur partielle sont
générés à partir des trois textures existantes, sans nouveaux PNG.
`check build assemblePack` passe en **2 min 20 s**, avec **78 tests serveur
requis réussis**, dont huit nouveaux scénarios pour l'écrasement. Ils couvrent
les trois fruits, les huit paliers, le rendement, la casse, la lecture d'anciens
états sans `layers`, les six directions du piston normal, la disparition de la
presse active, la course de 27 blocs du super piston et le refus atomique d'une
face bloquée. Le scénario vertical du super piston est isolé des autres tests
et compte aussi les résidus projetés en hauteur.
Le parcours **Vulkan avec Sodium 0.9.2** passe en **55 s** : huit vrais sauts
au clavier, neuf portions obtenues, disparition du dernier palier, 24 modèles
avec hauteur et collisions correspondantes, 27 blocs / 243 portions sur une
activation réelle du super piston. La presse est absente du créatif et des
ingrédients JEI, y compris du catalogue opérateur. La catégorie d'écrasement
et ses trois recettes s'affichent en FR/EN aux échelles GUI 2/3/4. Une
fermeture/réouverture réelle conserve les 24 états partiels ; le piston
récupère ensuite exactement les trois portions d'un bloc resté à deux paliers.
La régression **Piston087 sous Vulkan avec Sodium** passe en **1 min 8 s** :
six directions × deux variantes, charges ordinaires de 108/109 blocs, obstacles,
inventaires, adhérence, collisions, interruption, sérialisation, rechargement
de chunks et démontage. Son ancien appel de clé hors de portée est corrigé
dans la fixture de test, sans modifier les règles de portée du jeu.
Le JAR contient les **192 JSON d'appareils/écrasement**, 432 JSON culinaires et
376 JSON agricoles générés, identiques aux sources, les 44 classes culinaires
et les deux adaptations de pistons/atterrissages. La recette de presse est
absente de l'archive. Les 343 PNG importés restent identiques aux originaux,
dont les 38 fournis, et les 13 PNG de vanille sont toujours en 16 × 16.
Les copies packwiz client/serveur sont identiques au binaire contrôlé ; le
template conserve les mêmes textures culinaires, agricoles et de vanille.
SHA-256 de `sanctuary-beta.305.jar` :
```text
8c9b358c5c3caac3b9aa9a94230c7f6c6761d32f26002522bd8eba59c7f1cc2b
```
[Reçu de validation](crushing-beta305-verification.json). Journaux dans
`build/crushing305-*`, captures archivées dans
`build/crushing305-crushing-screenshots/`, monde client neuf de graine **305**.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=crushing305,kitchen304,cuisine303,vanilla301,agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCrushing305ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=crushing305 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Minecraft 26.3, Fabric API 0.160.5+26.3, Java 25. Les parcours graphiques
ciblent exclusivement Vulkan et leurs mondes sont neufs et ignorés par Git.
+241
View File
@@ -0,0 +1,241 @@
# IA-05 — Recettes de la 26.2 jouables, beta.303 locale
> Cette page décrit l'étape beta.303. [La préparation beta.304](kitchen-beta304.md)
> porte ensuite les six appareils : fermentation temporisée et pressage physique
> remplacent leurs adaptations manuelles. Les préparations crues restent valides.
Préparation du 28 octobre 2026 sur **la même branche `codex/itsalive-26-3`**,
à partir de beta.302 (`930719d7`). Minecraft 26.3, Java 25 et dépendances
inchangés. Aucun push, tag, publication, site, serveur ou Prism modifié.
Les essais utilisent seulement des mondes de développement neufs.
## Catalogue importé et accès
Les **92 recettes alimentaires de la 26.2** sont reprises : 12 fabrications
à froid, 19 préparations de chaudron, 26 de poêle, 13 de four, 10 recettes
de fermentation, 9 de moulin et 3 de presse. Les ingrédients intermédiaires
complètent les récoltes : farines, huile, pulpe, beurre, crème, fromage,+bouillon, sauces, tofu, riz cuit, nori, café moulu et vanille en poudre.
Le catalogue apporte **83 ingrédients et plats**, dont 70 comestibles, et
**46 préparations à cuire**, soit **129 objets**, tous dans l'onglet natif
**Nourriture et boissons**. Les semences gardent l'onglet Naturel ; aucune
nouvelle page créative n'est créée.
Les recettes utilisent la table de fabrication, le four et le fumoir
existants. Une salade se fabrique directement ; les plats chauds composés
passent par une préparation non comestible, puis une cuisson avec combustible.
Les préparations ont le dessin du plat, teinté, un nom distinct et une aide
FR/EN. Les recettes à un ingrédient sans récipient passent directement en
cuisson, notamment le maïs grillé et l'ananas grillé.
Le parcours utilise **196 recettes natives** : **180 recettes ajoutées**
(fabrications des préparations et variantes four/fumoir) et **16 recettes
vanilla réutilisées** pour les viandes, poissons et pommes de terre.
La découverte d'une récolte enseigne
la collection Cuisine au catalogue existant ; sa consultation conserve les
règles Sanctuary. La fabrication manuelle reste disponible sans cet achat.
JEI utilise les catégories natives de fabrication et de cuisson.
## Adaptations explicites
Ce lot porte le catalogue alimentaire sur les outils déjà jouables. Il
n'implémente pas les appareils historiques, leurs inventaires ou leurs gestes.
Les 10 transformations issues de la fermentation sont **des recettes manuelles
immédiates**, sans maturation en tonneau ni reprise du délai historique.
Le travail du chaudron, de la poêle, de la cuisinière et du séchoir reste
dans ses tickets ; aucun séchage ni mécanisme de plat raté n'est ajouté.
- Le pressage devient une fabrication avec **neuf fruits pour neuf portions**
d'huile, de pulpe ou de moût, conservant le bilan de l'ancien bloc pressé.
Les cinq recettes d'appareils et six recettes de compression/décompression
ne sont pas importées ; elles ne sont pas nécessaires à cette chaîne.
- Le moulin est adapté en fabrication manuelle. **Deux maïs donnent quatre
semoules**, pour conserver le rendement sans entrer en conflit avec la
récupération des grains depuis un maïs.
Deux fèves de cacao donnent quatre poudres, pour éviter le conflit avec
la teinture marron vanilla obtenue depuis une seule fève.
- L'ancien curry et le ragoût de pois chiches avaient les mêmes ingrédients
et se distinguaient par l'appareil. Le ragoût demande désormais une fiole
d'eau supplémentaire ; le curry garde ses ingrédients. La table donne un
résultat unique, sans dépendre de l'ordre de chargement des recettes.
- `minecraft:potion` signifie exclusivement **une fiole d'eau sans effet**.
Les potions de soin, poison, maladroites et eaux avec effets personnalisés
ne sont pas des ingrédients. La cuisson ne consomme jamais une bouteille
ou un seau : le récipient est récupéré dès la préparation à la table.
- La fabrication rend exactement les bouteilles d'eau/miel, les seaux de
lait et les couronnes d'ananas concernés. Les portions finies conservent
le modèle d'objet historique, sans ajout de bols ou bouteilles gratuits.
- Le tag historique manquant `herbs` est défini avec basilic, menthe et
coriandre. Les tags de baies, poissons, champignons et viandes cuites sont
repris. Les quantités finales et les profils alimentaires historiques
sont conservés, y compris les effets des plats et du café ; les boissons
utilisent l'animation native de boisson.
- Les huit cuissons simples déjà disponibles dans le jeu réutilisent leurs
recettes four/fumoir exactes de Minecraft 26.3, afin de conserver leurs
durées, combustible et expérience, sans ajouter de recettes concurrentes.
## Provenance et limites
`scripts/data/cuisine.json` conserve les 92 recettes sources et leurs
empreintes SHA-256, le catalogue alimentaire, les tags et les 11 exclusions.
Source historique en lecture seule : `26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later.
`scripts/cuisine_resources.py` produit les données, modèles et collection.
Les identifiants de destination utilisent `sanctuary:*` ; aucun ancien
identifiant agricole n'est renommé. Les 343 PNG importés, les images fournies
et les textures 16 × 16 de vanille sont conservés sans retouche.
`CulinaryCraftingRecipe` reste une recette sans forme native, avec contrôle
de l'eau et retours de récipients. Ses codecs 26.3 conservent les templates
sans matérialiser d'objets avant la liaison des composants du registre.
Les inventaires et sauvegardes utilisent les formats natifs ; aucune
migration, génération naturelle ou conversion d'appareil 26.2 n'est effectuée.
## Validation
`check build assemblePack` passe en **2 min 49 s**, avec **55 tests serveur
requis réussis**, dont neuf scénarios culinaires. Ils couvrent les 92 recettes
et leurs rendements, les chemins de production des 83 ingrédients/plats,
l'absence de résultats concurrents, l'eau et les potions refusées, les
récipients/couronnes, la fabrication en série, une vraie cuisson au fumoir,
les propriétés alimentaires, les effets du café et la découverte des recettes.
Le parcours **Vulkan avec Sodium 0.9.2** passe en **53 s** : paquets natifs
de fabrication d'une salade et d'une préparation de café, consommation exacte,
bouteille récupérée et cuisson par les ticks du fumoir. Les **196 étapes sont
présentes dans JEI** ; les ingrédients d'eau s'y affichent comme de l'eau.
Les 129 modèles d'objets, le seul onglet natif Nourriture et boissons, les
noms FR/EN et les échelles GUI 2/3/4 sont contrôlés. Un plat, une préparation
et un ingrédient gardent leurs quantités après fermeture/réouverture du monde.
La régression agricole Vulkan passe en **36 s** : 313 états de cultures,
48 objets, arbres/caféier, croix de l'oignon et de l'ail, onglets natifs FR/EN
GUI 2/3/4 et rechargement des 173 états agricoles. Les ajouts culinaires
n'empêchent pas l'accès aux récoltes dans le même onglet.
Les **445 ressources culinaires générées** et 376 JSON agricoles sont
vérifiés dans le JAR, avec les classes compilées et notices. Les 92 sources
de recette correspondent aux SHA-256 du reçu ; les 343 PNG importés restent
identiques, dont les 38 fournis. Les 13 textures de vanille sont toujours en
16 × 16. Les copies JAR packwiz client/serveur sont identiques au binaire
contrôlé ; le template contient les mêmes textures culinaires et notices.
SHA-256 de `sanctuary-beta.303.jar` :
```text
91809157a1f720192d5558682219840e6f70d13007a384973fa526ec4e9b2f66
```
Profils de vérification :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=cuisine303,vanilla301,agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryCuisine303ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=cuisine303 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Journaux et reçu dans `build/cuisine303-*`, captures et monde neuf de graine
**303** dans le dossier de tests client ignoré. Validation graphique Vulkan
exclusivement.
## Catalogue vérifiable
| Recette historique | Ingrédients à la table ou en cuisson directe | Résultat | Usage 26.3 |
| --- | --- | --- | --- |
| `cauldron_bean_chili` | Haricots secs + Sauce tomate + Piment | Chili de haricots | Préparation → four/fumoir |
| `cauldron_broth` | Fiole d'eau + Carotte + Pomme de terre | 2 × Bouillon | Préparation → four/fumoir |
| `cauldron_cabbage_soup` | Chou + Carotte + Bouillon | Soupe au chou | Préparation → four/fumoir |
| `cauldron_chicken_rice_soup` | Poulet cru + Bouillon + Riz | Soupe poulet-riz | Préparation → four/fumoir |
| `cauldron_chickpea_stew` | Pois chiches + Sauce tomate + Coriandre + Piment + Fiole d'eau | Ragoût de pois chiches | Préparation → four/fumoir |
| `cauldron_coffee` | Café moulu + Fiole d'eau | Café | Préparation → four/fumoir |
| `cauldron_cooked_rice` | Riz + Fiole d'eau | 2 × Riz cuit | Préparation → four/fumoir |
| `cauldron_corn_chowder` | Maïs + Crème + Pomme de terre | Soupe de maïs | Préparation → four/fumoir |
| `cauldron_cream` | Seau de lait | 2 × Crème | Préparation → four/fumoir |
| `cauldron_lemon_honey_tea` | Citron + Fiole d'eau + Fiole de miel | Infusion citron-miel | Préparation → four/fumoir |
| `cauldron_mint_tea` | Menthe + Fiole d'eau | Infusion de menthe | Préparation → four/fumoir |
| `cauldron_mushroom_veloute` | Champignons de cuisine + Bouillon + Crème | Velouté de champignons | Préparation → four/fumoir |
| `cauldron_potato_soup` | Pomme de terre + Crème + Oignon | Soupe de pommes de terre | Préparation → four/fumoir |
| `cauldron_pumpkin_veloute` | Citrouille + Crème + Sel | Velouté de citrouille | Préparation → four/fumoir |
| `cauldron_salt` | Fiole d'eau | 2 × Sel | Préparation → four/fumoir |
| `cauldron_soy_milk` | Graines de soja + Fiole d'eau | 2 × Lait de soja | Préparation → four/fumoir |
| `cauldron_tofu` | Lait de soja + Sel | 2 × Tofu | Préparation → four/fumoir |
| `cauldron_tomato_sauce` | Pulpe de tomate + Sel + Basilic | 2 × Sauce tomate | Préparation → four/fumoir |
| `cauldron_vegetable_soup` | Carotte + Bouillon + Oignon | Soupe de légumes | Préparation → four/fumoir |
| `cold_burger` | Pain + Bœuf cuit + Fromage + Laitue + Tomate | Burger | Table |
| `cold_cucumber_maki` | Riz cuit + Nori + Concombre | Maki concombre | Table |
| `cold_fruit_salad` | Ananas + Fraise + Raisin + Pomme | Salade de fruits | Table |
| `cold_green_salad` | Laitue + Concombre + Tomate | Salade verte | Table |
| `cold_hummus` | Pois chiches + Huile d'olive + Citron + Ail | Houmous | Table |
| `cold_kebab` | Pain + Mouton cuit + Oignon + Tomate | Kebab | Table |
| `cold_mediterranean_salad` | Laitue + Concombre + Tomate + Olives | Salade méditerranéenne | Table |
| `cold_sandwich` | Pain + Viandes cuites + Laitue + Tomate | Sandwich | Table |
| `cold_sushi` | Riz cuit + Nori + Poissons de cuisine | Sushi | Table |
| `cold_tofu_maki` | Riz cuit + Nori + Tofu | Maki tofu | Table |
| `cold_vegetarian_sandwich` | Pain + Fromage + Tomate + Laitue | Sandwich végétarien | Table |
| `ferment_beer` | Blé + Fiole d'eau + Levure | Bière | Table |
| `ferment_cheese` | Crème + Sel | Fromage | Table |
| `ferment_hot_sauce` | Pulpe de tomate + Piment + Vinaigre | Sauce piquante | Table |
| `ferment_kimchi` | Chou + Sel + Piment | Kimchi | Table |
| `ferment_pickles` | Concombre + Sel + Vinaigre | Cornichons | Table |
| `ferment_soy_sauce` | Graines de soja + Sel | Sauce soja | Table |
| `ferment_vinegar` | Vin | Vinaigre | Table |
| `ferment_wine` | Moût de raisin | Vin | Table |
| `ferment_yeast` | Blé + Sucre | 2 × Levure | Table |
| `ferment_yogurt` | Seau de lait + Sucre | Yaourt | Table |
| `mill_chickpeas` | Pois chiches | 2 × Farine de pois chiche | Table |
| `mill_cocoa_powder` | 2 × Fèves de cacao | 4 × Poudre de cacao | Table |
| `mill_cornmeal` | 2 × Maïs | 4 × Semoule de maïs | Table |
| `mill_cream` | Crème | Beurre | Table |
| `mill_dried_kelp` | Algue séchée | Nori | Table |
| `mill_ground_coffee` | Grains de café torréfiés | 2 × Café moulu | Table |
| `mill_rice` | Riz | 2 × Farine de riz | Table |
| `mill_vanilla_powder` | Gousse de vanille séchée | 2 × Poudre de vanille | Table |
| `mill_wheat` | Blé | 2 × Farine de blé | Table |
| `oven_apple_pie` | Pâte crue + Pomme + Sucre + Beurre | Tarte aux pommes | Préparation → four/fumoir |
| `oven_berry_pie` | Pâte crue + Baies de cuisine + Sucre + Beurre | Tarte aux baies | Préparation → four/fumoir |
| `oven_bread` | Pâte crue | Pain | Four/fumoir |
| `oven_carrot_cake` | Pâte crue + Carotte + Sucre + Œuf | Gâteau aux carottes | Préparation → four/fumoir |
| `oven_chickpea_flatbread` | Farine de pois chiche + Fiole d'eau + Huile d'olive | Galette de pois chiche | Préparation → four/fumoir |
| `oven_chocolate_cake` | Pâte crue + Poudre de cacao + Sucre + Œuf | Gâteau au chocolat | Préparation → four/fumoir |
| `oven_cornbread` | Semoule de maïs + Levure + Seau de lait | Pain de maïs | Préparation → four/fumoir |
| `oven_flatbread` | Farine de blé + Fiole d'eau + Sel | Pain plat | Préparation → four/fumoir |
| `oven_margherita_pizza` | Pâte crue + Sauce tomate + Fromage + Basilic | Pizza margherita | Préparation → four/fumoir |
| `oven_pumpkin_pie` | Pâte crue + Citrouille + Sucre + Œuf | Tarte à la citrouille | Préparation → four/fumoir |
| `oven_rice_bread` | Farine de riz + Levure + Fiole d'eau | Pain de riz | Préparation → four/fumoir |
| `oven_stuffed_pepper` | Poivron + Riz cuit + Sauce tomate + Fromage | Poivron farci | Préparation → four/fumoir |
| `oven_vanilla_cake` | Pâte crue + Œuf + Sucre + Poudre de vanille | Gâteau à la vanille | Préparation → four/fumoir |
| `pan_beef` | Bœuf cru | Bœuf cuit | Four/fumoir |
| `pan_beef_stir_fry` | Bœuf cru + Poivron + Oignon + Sauce soja | Bœuf sauté | Préparation → four/fumoir |
| `pan_chicken` | Poulet cru | cooked_chicken | Four/fumoir |
| `pan_chickpea_curry` | Pois chiches + Sauce tomate + Piment + Coriandre | Curry de pois chiches | Préparation → four/fumoir |
| `pan_cod` | Morue crue | cooked_cod | Four/fumoir |
| `pan_fish_meuniere` | Poissons de cuisine + Citron + Beurre | Poisson meunière | Préparation → four/fumoir |
| `pan_fried_cabbage` | Chou + Beurre + Oignon | Chou poêlé | Préparation → four/fumoir |
| `pan_fried_egg` | Œuf | Œuf au plat | Four/fumoir |
| `pan_fried_rice` | Riz cuit + Œuf + Graines de soja + Sauce soja | Riz sauté | Préparation → four/fumoir |
| `pan_garlic_green_beans` | Haricots verts + Ail + Beurre | Haricots verts sautés | Préparation → four/fumoir |
| `pan_grilled_corn` | Maïs | Maïs grillé | Four/fumoir |
| `pan_grilled_eggplant` | Aubergine + Huile d'olive | Aubergine grillée | Préparation → four/fumoir |
| `pan_grilled_pineapple` | Ananas | Ananas grillé | Four/fumoir |
| `pan_herb_omelette` | Œuf + Seau de lait + Herbes aromatiques | Omelette aux herbes | Préparation → four/fumoir |
| `pan_mushroom_saute` | Champignons de cuisine + Beurre + Ail | Poêlée de champignons | Préparation → four/fumoir |
| `pan_mutton` | Mouton cru | Mouton cuit | Four/fumoir |
| `pan_omelette` | Œuf + Seau de lait | Omelette | Préparation → four/fumoir |
| `pan_porkchop` | Porc cru | cooked_porkchop | Four/fumoir |
| `pan_potato` | Pomme de terre | baked_potato | Four/fumoir |
| `pan_rabbit` | Lapin cru | cooked_rabbit | Four/fumoir |
| `pan_ratatouille` | Aubergine + Tomate + Poivron + Oignon | Ratatouille | Préparation → four/fumoir |
| `pan_salmon` | Saumon cru | cooked_salmon | Four/fumoir |
| `pan_sauteed_potatoes` | Pomme de terre + Oignon + Beurre | Pommes de terre sautées | Préparation → four/fumoir |
| `pan_spiced_mutton` | Mouton cru + Oignon + Piment + Coriandre | Émincé de mouton épicé | Préparation → four/fumoir |
| `pan_tofu_stir_fry` | Tofu + Poivron + Graines de soja + Sauce soja | Wok de tofu | Préparation → four/fumoir |
| `pan_tomato_basil_chicken` | Poulet cru + Tomate + Basilic | Poulet tomate-basilic | Préparation → four/fumoir |
| `press_grape_block` | 9 × Raisin | 9 × Moût de raisin | Table |
| `press_olive_block` | 9 × Olives | 9 × Huile d'olive | Table |
| `press_tomato_block` | 9 × Tomate | 9 × Pulpe de tomate | Table |
| `raw_dough` | Farine de blé + Levure + Fiole d'eau | 2 × Pâte crue | Table |
+76
View File
@@ -0,0 +1,76 @@
# IA-12 — Cuisine directe, chaudron Minecraft et baratte
Préparation initiale **beta.319** du 30 octobre 2026, réunie au
[lot beta.320](integration-beta320.md) sur `codex/itsalive-26-3` avec la carte
et l’activité saisonnière, à la demande du créateur. Les sources sont destinées
au push Git après validation ; aucun déploiement n’est demandé par ce lot.
La dernière livraison publique reste beta.318.
## Résultat
Les **46 préparations artificielles** `raw_cauldron_*`, `raw_pan_*` et
`raw_oven_*` disparaissent du créatif, des fabrications accessibles et de JEI.
Les recettes découvertes enseignent les appareils et leurs vrais ingrédients.
Le riz cuit, les infusions, les légumes grillés et les plats ne nécessitent
plus d’objet intermédiaire nommé « Uncooked ».
La pâte crue et les saucissons crus restent de vraies préparations.
Les plats chauds se font directement à la poêle, au chaudron ou à la cuisinière.
Les recettes froides déjà cohérentes restent à l’établi.
Le seul chaudron proposé au joueur est le chaudron **Minecraft** : plus de
« Cooking Pot » distinct dans le créatif ou JEI. Un ancien exemplaire pose
désormais le chaudron Minecraft ; copie créative et casse de la variante
pleine donnent aussi le chaudron Minecraft. Ajouter les ingrédients et remuer
avec un bâton conserve le fonctionnement précédent, dont les lots répétés.
[La nouvelle baratte](wiki/alimentation/laitages.md) remplace la crème instantanée
et le beurre au moulin : repos du lait cinq minutes sans combustible, beurre
et crème fouettée en huit gestes, beurre aux herbes en quatre gestes. Elle
utilise des modèles cubiques et des textures vanilla, un HUD FR/EN et la page
JEI des transformations. Aucun nouvel onglet créatif ni menu d’appareil.
Le seau reste rempli pendant le repos et revient vide au paiement final.
Le fromage continue de fermenter dans son tonneau.
Les petites herbes et fougères donnent directement des **semences** selon leur
climat : graines, grains et légumineuses à planter, bouture de menthe, grain
de café. Les légumes et fruits récoltés ne tombent plus de l’herbe. Carottes,
pommes de terre, oignons, ail et couronnes d’ananas se récupèrent sur les plantes
sauvages ou se multiplient à partir des cultures existantes.
[Le guide et la planche](wiki/alimentation/README.md) décrivent ces chemins.
## Continuité
Tous les identifiants d’objets, blocs et entités existants restent enregistrés.
Les anciens objets de préparation restent cuisinables au four/fumoir avec
leurs types, identifiants de recettes et XP d’origine. Les recettes de fabrication
de ces objets sont conservées sous leur type historique, avec un tag vide
qui rend leur placement impossible. Les anciens libellés indiquent leur statut.
Les anciennes recettes de beurre sont désactivées, leurs entrées restent récupérables.
L’ancienne crème au chaudron reste une voie de compatibilité cachée pour les lots engagés.
La variante pleine `sanctuary:cooking_cauldron` conserve son entité et ses
données ; elle sert au contenu du chaudron ordinaire et ne constitue plus un
appareil à obtenir séparément. Aucun format de sauvegarde existant n’est modifié.
La baratte possède un nouvel identifiant `sanctuary:dairy_churn` et son propre
inventaire sauvegardé, ses quatre entrées manuelles et sa sortie unique.
Le champ de recette `manual_strokes` est optionnel ; les anciennes recettes
gardent zéro geste et leurs comportements actuels.
La modification des butins ne change ni les habitats, ni les placements, ni
la graine et la révision de génération IA-09/beta.316. Aucun chunk sauvegardé
n’est modifié, régénéré ou repeuplé. Les racines, bulbes et ananas qui ne sont
pas déjà cultivés doivent être trouvés sur une vraie plante sauvage.
## Vérification
Les tests serveur ciblent les recettes réelles, les récipients rendus une fois,
le repos sauvegardé, les gestes manuels, l’annulation, les mélanges refusés,
la sortie pleine, la casse et les six climats de semences. Les parcours client
ciblent Vulkan avec Sodium, les interactions natives, les modèles, le créatif,
JEI, les textes FR/EN aux échelles 2/3/4 et la réouverture des sauvegardes.
Le [lot beta.320](integration-beta320.md) est vérifié : **241 tests serveur**,
parcours regroupé **Vulkan/Sodium** et packs assemblés. Les 2 770 classes de
production distribuées sont identiques à celles de ce parcours.
[Reçu et empreintes](integration-beta320-verification.json).
+53
View File
@@ -0,0 +1,53 @@
# PACK-03 — Serveur Sanctuary préenregistré et icône
Ticket du **26 octobre 2026**, branche `codex/default-server`, version `beta.295`.
Le premier démarrage du client ajoute **Sanctuary Beta**, adresse publique
`beta.sanctuary-minecraft.net`, dans la liste multijoueur vanilla. Le mécanisme
est livré dans le JAR : il fonctionne après import du ZIP Prism du site,
installation MRpack et mise à jour d'une instance packwiz existante.
`servers.dat` reste un fichier personnel, jamais géré par packwiz. L'ajout
conserve l'ordre, les noms, réglages et champs inconnus des autres favoris.
Un favori Sanctuary existant est conservé sans doublon, y compris avec le nom
DNS en majuscules, un point final ou les ports 25565/25567. Une entrée cachée
issue de connexion directe devient visible sans être renommée. Avant la
première écriture, une copie exacte est conservée dans
`servers.dat.before-sanctuary-beta`. Un fichier illisible reste intact.
Le marqueur local `.sanctuary/default-server-beta` indique que l'ajout initial
est terminé : le joueur peut ensuite renommer, déplacer ou supprimer le favori.
Il n'est pas recréé à chaque lancement. Aucun téléchargement ni connexion de
jeu automatique n'est ajouté.
Le logo 160 × 160 du pack est redimensionné en PNG 64 × 64, sans nouvelle
illustration. Cette même image sert d'icône initiale du favori et de
`server-icon.png` dans le profil serveur packwiz. Le serveur annonce ainsi
l'icône aux clients lors du ping de la liste multijoueur. Le profil client ne
possède jamais `servers.dat` ; le profil serveur possède explicitement cette
icône. Les mondes et réglages de jeu ne changent pas.
La livraison commune intègre le ticket terminé
[CLAIM-03](property-command-beta294.md) : seule la commande anglaise
`/sanctuary property` et ses sous-commandes sont conservées. Les deux fichiers
de production, les deux fichiers de GameTests et le contrat sont repris
exactement depuis sa préparation locale beta.294, après ses 18 tests serveur
réussis, sans modifier son checkout de travail.
## Vérifications
- `defaultServerListSmoke` : 15 contrôles, dont lecture par `ServerData`
vanilla, icône 64 × 64, favoris existants, sauvegarde exacte, suppression,
absence de doublon et fichier corrompu suivi d'une réparation.
- Parcours client **Vulkan FR/EN**, GUI 3 en 1280 × 800 : réussi en 38 s,
hook réel de démarrage, liste vanilla, nom et icône, ping public 0/20.
Deux captures inspectées ; aucun monde ouvert. Journal et captures sous
`build/release295/` et `mods/sanctuary/build/run/clientGameTest/screenshots/`.
- `./gradlew check build assemblePack assembleServerPack` : réussi en
**3 min 22 s**, avec les contrôles purs et **18 tests serveur ciblés**
`property270,claims272,claims277,claims278`, `sanctuaryAtlasOnly=true`.
Les tests vérifient à nouveau la commande unifiée sur la base commune.
Journal : `build/release295/check-build.log`.
- **Publication effectuée** : Gitea, canal client/serveur, CT 350, téléchargement
Web et instance Prism historique en beta.295. [Reçu complet](release-beta295.md),
sauvegardes et limite de l’instance importée encore ouverte.
+75
View File
@@ -0,0 +1,75 @@
# MAP-CTM — Calque Demeure continu, beta.274
Branche `codex/inhabitant-property`. Demande du 24 octobre 2026, après beta.273.
La [refonte des propriétés](property-demeure-refonte.md) reste un cadrage en
attente ; la fiche Habitant est conservée. Le créateur a confirmé que les claims
actuels doivent rester accessibles.
Le calque Demeure garde sa texture de 1 024 × 1 024 pixels alignée sur celle du
terrain, mais retire les cadres de chunks. Deux cellules adjacentes ayant la
même couleur et la même influence se raccordent sans couture interne, y compris
aux coins. Il ne s’agit pas d’ajouter des textures CTM de blocs dans le monde.
La teinte est uniforme dans chaque cellule connue. Sa présence suit la **part
relative d’influence** déjà calculée par Demeure, avec un alpha de 16 + 96 × part / 100
(0 si la part est nulle). Ce pourcentage n’est pas un compteur de jours habités
ou une preuve d’ancienneté. Le terrain, le brouillard et le vide gardent leurs
pixels ; seuls les chunks modifiés sont repeints. Un changement de pourcentage
actualise maintenant la teinte même si la couleur du personnage reste identique.
## Protections, dans le même calque pixel
Une protection active prend une couleur uniforme (alpha 64/255) dans la même
texture que Demeure : plus de rectangles GUI par chunk, de cadres, de pointillés
ou de boucliers. Les cellules voisines de même propriétaire se rejoignent sans
trait intérieur. Un claim sans protection reste déclaré et accessible au clic
droit, sans aplat de protection. Si les deux affichages sont activés, la couleur
de protection est prioritaire sur l’influence Demeure.
La légende associe les couleurs aux personnages ayant une protection visible,
avec trois noms au maximum puis un compteur. Le bouton de masquage reste partagé
avec Pause. Le calque est invalidé par les achats, les données de Demeure, les
changements d’affichage et l’expiration ; les cellules expirées sont repeintes
une fois. L’aperçu de Pause compose la même teinte dans ses propres pixels de
terrain, en conservant le masque du vide et du brouillard. Aucun dessin de
bordure ne dépend de l’adjacence : le raccord résulte des pixels uniformes.
L’infobulle du bouton décrit la présence et l’influence d’habitation, sans
« aucun claim ni protection ». Les règles, scores et formats de Demeure,
les droits et données de propriété, la génération et les mondes personnels
ne sont pas modifiés par cette correction d’affichage.
## Vérification
`check build assemblePack` réussit en **2 min 50 s** : **29 tests serveur ciblés**
(claims, ancien modèle, minage, overview, menus, Atlas et Demeure). Les contrôles
indépendants du registre restent réussis. Les deux parcours **Vulkan FR/EN,
GUI 2/3/4** passent : **58 s / 19 captures** pour les propriétés et **29 s /
8 captures** pour Demeure.
Les tests de pixels vérifient les bords, coins et corps identiques sur des
cellules adjacentes, la teinte seule des protections actives, les propriétaires
hors ligne, le changement de pourcentage sans changement de couleur, le vide,
le brouillard et le retrait d’une empreinte. Le masquage, le réaffichage,
l’expiration, le clic droit, la composition dans Pause et l’accès Habitant sont
couverts. Captures dans `build/map274-screenshots/` et
`build/demeure274-screenshots/` ; inspections FR GUI 4, EN GUI 3, Pause et Habitant.
Le MRpack beta.274 est exporté et vérifié : ZIP, Minecraft 26.3, Loader 0.19.5
et octets des deux JAR locaux identiques aux builds. Les archives beta.270 à
beta.273 gardent leur empreinte. Reçu : `build/map274-validation.json`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=claims273,claims272,property270,mining,overview271,menus,map,demeure \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryMap274ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
# Pour le second parcours, remplacer sanctuaryMap274ClientTests par sanctuaryDemeure274ClientTests.
```
Export local uniquement. La proposition de claim issue de l’habitation, le
premier occupant, les duels, l’accord de partage et un tarif moins élevé restent
à définir dans le cadrage de reprise ; aucun n’est annoncé comme implémenté.
@@ -0,0 +1,49 @@
{
"version": "beta.318",
"date": "2026-10-30",
"branch": "codex/itsalive-26-3",
"base_commit": "7ef4d51a",
"local_only": true,
"published_or_installed": false,
"new_results": 18,
"new_items_including_preparation": 19,
"new_recipes": 19,
"active_drying_recipes": 16,
"active_oven_recipes": 17,
"active_cauldron_recipes": 24,
"active_milling_recipes": 10,
"generated_json_verified": 1268,
"unchanged_original_pngs": 1108,
"jar_sha256": "5b8d6fff72c3128ceac085a9d71b493bbda13a0dbbe42ffdd3e8dc2fda3a632b",
"client_server_staged_jar_sha256_match": true,
"template_zip_sha256": "a5b6199779c818e5134d6b9eef10f257dc4412f1bcd0dc53589121eff793ada3",
"server": {
"command": "./gradlew check build assemblePack -PsanctuaryFocusedTests=driedcuisine318,drying317,drying313,foraging316,agriculture300,vanilla301,sausage315,cheesewine314,cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge -PsanctuaryAtlasOnly=true",
"required_tests_passed": 189,
"duration": "2m 48s",
"log": "build/dried-cuisine318-check-build-pack.log"
},
"client": {
"command": "./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true -PsanctuaryDriedCuisine318ClientTests=true -PsanctuarySodiumClientTests=true -PsanctuaryFocusedTests=driedcuisine318,drying317 -PsanctuaryQuickTests=true -PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 -PsanctuaryClientNoVsync=true",
"backend": "Vulkan / Apple M1",
"sodium": true,
"duration": "1m 10s",
"result": "pass",
"models": 19,
"screenshots": 16,
"screenshots_directory": "build/dried-cuisine318-screenshots",
"log": "build/dried-cuisine318-client.log",
"spicy_visual_pulses_and_unchanged_health_verified": true,
"only_graphical_drying_fixture_accelerates_after_actual_save": true,
"final_low_impact_change": "Raw spicy sausage tooltip points to the drying rack; compiled with the full final build."
},
"spicy_effect": {
"visual_packet": "ClientboundHurtAnimationPacket",
"pulses": 2,
"delay_ticks": 8,
"damage_event_sent": false,
"health_absorption_velocity_and_server_hurt_state_unchanged": true,
"saved_state_added": false
},
"graphics_limit": "Existing sprites with native tint and reused cuboid sausage geometry."
}
+121
View File
@@ -0,0 +1,121 @@
# IA-11 — Les 18 nouvelles recettes aux produits séchés
Préparation locale **beta.318**, 30 octobre 2026, branche `codex/itsalive-26-3`,
socle `7ef4d51a` / beta.317. Demande : rendre jouables les dix-huit combinaisons
du guide, puis ajouter de petits coups sans dégâts lorsqu'on mange épicé.
Aucune publication, installation Prism, mise à jour de site ou de serveur.
## Résultat jouable
[Liste complète : ingrédients, appareils, quantités et durées](wiki/alimentation/sechoir.md) ·
[Fiche autonome HTML](wiki/alimentation/sechoir.html).
- Cuisinière : pain aux raisins, brioche vanillée aux raisins, biscuits aux fruits
secs et pain aux tomates et basilic. Cuisson de 12 à 16 secondes, ingrédients
payés en fin de cycle, combustible et sortie unique habituels. Quatre biscuits
par lot ; un pain ou une brioche pour les autres préparations.
- Établi : les deux sandwichs, salade de pois chiches aux tomates séchées,
tomates marinées, mélange de fruits secs, dessert ananas-vanille et
assaisonnement aux herbes. Un résultat par lot, ou deux portions d'assaisonnement.
- Chaudron : riz au saumon séché, ragoût du voyageur, soupe de poisson séché,
haricots à la viande séchée et infusion pomme-menthe. Une dose d'eau par portion,
chaleur et geste au bâton ; cuisson de 11 à 18 secondes. Le réassort et la recette
mémorisée gardent le fonctionnement existant. Ajouter le bol, ou une fiole vide
pour l'infusion, avec les ingrédients. Le récipient revient une fois à la consommation.
- Moulin manuel : un piment séché donne deux portions de poudre, sans combustible.
La poudre remplace aussi le piment dans les anciennes recettes. L'assaisonnement
aux herbes fonctionne dans l'omelette existante.
- Saucisson pimenté : à l'établi, une préparation de saucisson, un piment séché
ou une poudre de piment et une coriandre séchée donnent une préparation pimentée.
Elle sèche cinq minutes puis se pose pour manger quatre tranches de deux points
de nourriture chacune. Les modèles montrent la coupe et la longueur restante.
Cela ajoute **18 résultats, 19 objets en comptant la préparation de saucisson,
et 19 transformations** : le saucisson possède deux étapes. Le séchoir passe de
15 à **16 recettes**. Aucun nouvel onglet créatif ; tout rejoint Nourriture et boissons.
Libellés FR/EN, recettes natives synchronisées dans JEI et découverte par les
ingrédients séchés ou les préparations correspondantes.
Les bols et fioles sont des composants natifs `USE_REMAINDER`, après paiement
effectif de leur récipient d'origine. L'infusion consomme aussi une fiole de miel :
sa bouteille est éjectée à la cuisson, tandis que la fiole de service revient
quand on boit. L'eau peut venir de la réserve du chaudron ou d'une vraie fiole
d'eau ; les potions à effets sont refusées. L'ananas séché ne rend aucune seconde
couronne et les nouveaux plats ne créent aucune semence.
## Réaction épicée
Après la consommation effective d'un aliment du tag `sanctuary:spicy_foods`,
un paquet natif `ClientboundHurtAnimationPacket` et un petit son de coup reçu
produisent la réaction ; un second coup suit huit ticks plus tard, soit 0,4 seconde.
Une nouvelle bouchée remplace l'attente précédente, sans empiler une file sans limite.
Le piment cru et les anciens chilis, ragoût de pois chiches, curry, mouton épicé
et kimchi sont concernés, ainsi que les nouveaux haricots à la viande séchée et
le saucisson pimenté posé. Les ingrédients non comestibles, dont la sauce piquante,
ne déclenchent aucune consommation artificielle. Les plats doux ne réagissent pas.
Il n'y a aucun appel de dégâts, aucune modification de santé, absorption, armure,
invulnérabilité ou vitesse. Aucun événement de dégâts n'est envoyé. La réaction
reste transitoire, ne crée ni effet de statut ni donnée de sauvegarde, et s'arrête
à la mort, à la déconnexion ou à l'arrêt du serveur. Une tranche refusée parce
que le joueur est rassasié ne déclenche pas la réaction.
## Compatibilité et graphismes
Ajouts uniquement pour les objets, bloc de saucisson pimenté et recettes. Les
identifiants existants et le stockage des appareils, dont `DryingVersion=1`,
restent inchangés. Aucun changement de génération, aucun monde personnel ouvert,
aucune conversion de sauvegarde. Les anciennes préparations et le séchage nature
gardent leurs recettes et leurs durées.
Les nouvelles recettes réutilisent les types natifs de fabrication culinaire,
cuisson, moulin et séchoir déjà synchronisés. Le catalogue historique 26.2
n'est pas modifié. Le nouveau catalogue `scripts/data/dried-cuisine.json` contient
les valeurs alimentaires, quantités, récipients, durées et sources des icônes.
Les propositions du catalogue précédent sont marquées comme implémentées en beta.318.
Les icônes utilisent des sprites existants avec des teintes natives. Le saucisson
pimenté réutilise les géométries cubiques du saucisson avec une teinte orange,
y compris les seize orientations et découpes. Les PNG d'origine restent intacts ;
il ne s'agit pas de dix-neuf nouvelles textures peintes sur mesure.
## Vérification
`./gradlew check build assemblePack` a réussi en **2 min 48 s**. Les **189 tests
serveur natifs** passent : dix nouveaux cas couvrent les dix-huit résultats et
leurs dix-neuf transformations, les fabrications payées, toutes les échéances
complètes, la cuisson répétée, les bols/fioles, la découverte, le saucisson
sauvegardé puis partagé et les paquets épicés sans dégâts. Les régressions couvrent
les 24 recettes du chaudron, les autres appareils, l'agriculture, les récoltes,
la vanille, les recettes et la progression.
Le parcours **Vulkan / Apple M1 avec Sodium** a réussi en **1 min 10 s** :
les dix-neuf modèles et leurs noms FR/EN, nom du bloc placé, onglet Nourriture et
boissons, menus aux échelles 2/3/4, vrais paquets de fabrication d'un sandwich,
cuisson du pain aux raisins, riz au saumon au chaudron après remuage, mouture de
quatre piments en huit poudres puis paiement d'une poudre pour le saucisson,
accrochage et récupération, sauvegarde réelle, quatre tranches, deux animations
épicées par tranche avec santé inchangée, retour d'un bol et recettes JEI.
Seuls les derniers ticks du séchage graphique sont rapprochés de leur échéance,
après la sauvegarde ; les 6 000 ticks complets passent côté serveur. Seize
captures sont conservées dans `build/dried-cuisine318-screenshots/`.
L'infobulle finale de la préparation pimentée indique le séchoir et ses 300 secondes,
puis est compilée avec le build complet. Les contrôles du JAR confirment
**1 268 ressources JSON**, les **19 recettes ajoutées** sans suppression d'ancien
identifiant et **1 108 PNG strictement identiques à beta.317**. Les JAR du mod et
des packs client/serveur préparés ont le même SHA-256 ; le ZIP du template est valide.
Aucun monde personnel ni installation de jeu n'a été touché.
[Commandes, empreintes et reçu](dried-cuisine-beta318-verification.json).
## Installation locale ultérieure
Le 30 octobre 2026, ce binaire vérifié est installé dans la même instance Prism
pour les essais, sans publication ni lancement d’un monde personnel.
[Profil local, conservation et reçu](local-beta318.md).
## Livraison publique ultérieure
La beta.318 est publiée le 30 octobre 2026. Le serveur et le site sont à jour,
et Prism a retrouvé le canal public. [Reçu de livraison](release-beta318.md).
@@ -0,0 +1,40 @@
{
"version": "beta.317",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.317.jar",
"jar_sha256": "a1ddd0b1701d2144a93f1368a4e1f862869e2170ee03c7c842908578c81a60a6",
"generated_json_verified": 1182,
"unchanged_original_pngs": 1108,
"new_items": 12,
"active_drying_recipes": 15,
"new_drying_recipes": 14,
"future_combinations_proposed": 18,
"legacy_smoking_xp_recipe_preserved": true,
"date": "2026-10-30",
"branch": "codex/itsalive-26-3",
"base_commit": "7b56c3cd",
"local_only": true,
"published_or_installed": false,
"world_generation_changed": false,
"drying_storage_version": 1,
"server": {
"command": "./gradlew check build assemblePack -PsanctuaryFocusedTests=drying317,drying313,foraging316,agriculture300,vanilla301,sausage315,cheesewine314,cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge -PsanctuaryAtlasOnly=true",
"required_tests_passed": 179,
"build_duration": "2m 40s",
"log": "build/drying317-check-build-pack.log"
},
"client": {
"command": "./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true -PsanctuaryDrying317ClientTests=true -PsanctuarySodiumClientTests=true -PsanctuaryFocusedTests=drying317,drying313 -PsanctuaryQuickTests=true -PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 -PsanctuaryClientNoVsync=true",
"backend": "Vulkan",
"renderer": "Apple M1",
"sodium": true,
"duration": "51s",
"result": "pass",
"screenshots": "build/drying317-final-screenshots",
"screenshots_count": 9,
"log": "build/drying317-client.log",
"accelerated_near_completion_only_in_graphical_fixture": true
},
"template_zip_sha256": "bd8f959ce3d835c1ffff7f7d769cf125700c599bee2f049ed9b04cb1e9412b94",
"staged_client_and_server_jar_sha256_match": true,
"graphics_limit": "Existing sprites with native constant tint; no twelve separately painted PNGs."
}
+114
View File
@@ -0,0 +1,114 @@
# IA-10 — Viandes, poissons, fruits et herbes au séchoir
Préparation locale **beta.317**, 30 octobre 2026, même branche
`codex/itsalive-26-3`, socle `7b56c3cd` / beta.316 locale. Demande : ajouter les
produits séchés et proposer des combinaisons culinaires. Aucune publication,
installation Prism, modification du site ou du serveur personnel.
## Résultat jouable
[Recettes détaillées, usages et 18 propositions de plats](wiki/alimentation/sechoir.md) ·
[Copie autonome sous forme de tableaux](wiki/alimentation/sechoir.html).
Le séchoir possède **15 recettes**, dont le saucisson de beta.313 inchangé :
| Durée de jeu | Produits |
| --- | --- |
| 1 minute | Basilic, menthe, coriandre et fraises séchés |
| 1 min 30 s | Raisins secs, piment séché, pomme séchée |
| 2 minutes | Cabillaud séché, saumon séché, tomates et ananas séchés |
| 3 minutes | Gousse de vanille séchée |
| 4 minutes | Viande séchée depuis du bœuf cru ou du porc cru |
| 5 minutes | Saucisson séché depuis sa préparation |
**Douze nouveaux objets** dans l'onglet vanilla Nourriture et boissons,
avec libellés FR/EN, modèles et recettes JEI. Cabillaud et saumon crus utilisent
les objets Minecraft existants. Bœuf et porc donnent le même produit séché ;
les deux poissons gardent des produits distincts. Les fruits ajoutés sont
pomme, fraise et ananas, plus les raisins secs.
Les nouvelles provisions sont comestibles. Viande : 6 points et coefficient
de saturation 0,8 ; cabillaud : 5/0,6 ; saumon : 6/0,7 ; raisins et fraises :
3/0,5 ; tomate : 2/0,6 ; pomme : 4/0,5 ; ananas : 4/0,7. Piment et herbes
séchés restent des ingrédients. La couronne d'ananas est rendue exactement
une fois **à la fin du séchage**, par le mécanisme de restes déjà présent.
Le produit séché n'en rend pas à sa consommation.
Les quatre crochets restent indépendants : aliments différents, départs
différents et durées différentes sur un même cadre. Aucun combustible.
Ticks chargés à 20 ticks/s ; pluie et immersion suspendent le travail,
un toit protège. Alimentation par entonnoir et extraction des produits prêts
seulement conservées. Le retrait d'un aliment annule uniquement son propre
travail. Les ingrédients prêts ne sont pas séchés à nouveau.
## Recettes existantes et pistes futures
Le piment et chaque herbe séchée remplacent leur équivalent frais, un pour
un, dans les recettes de cuisine portées, aussi bien à la préparation manuelle
que dans les appareils. Les tags sont additifs : `cooking_chilies`,
`cooking_basil`, `cooking_mint`, `cooking_coriander`, et le tag `herbs` inclut
aussi les trois herbes sèches. Cela rend immédiatement utilisables les
omelettes, infusions de menthe, sauces tomate, pizzas, chilis, currys, mouton
épicé, kimchi et sauce piquante concernés. Les récoltes sèches ne donnent
pas de nouvelles graines via les recettes agricoles.
Les tags `dried_fish` et `dried_fruits` décrivent les produits disponibles.
Les **18 autres combinaisons du guide sont des propositions**, avec des
ingrédients présents dans le jeu ; aucun nouveau pain, sandwich, ragoût,
mélange de fruits ou assaisonnement n'est annoncé comme implémenté.
Les quantités, eau, récipients et valeurs nutritionnelles de ces futurs plats
restent à décider lors d'un prochain lot.
## Contrat de compatibilité et graphismes
Les identifiants existants, le format `DryingVersion=1`, les quatre cases
et leurs compteurs sont conservés. Aucun changement de génération ni de
sauvegarde n'est ajouté. Pas de repeuplement ou de conversion d'un monde.
Les préparations de saucisson gardent leur recette et leurs 6 000 ticks.
La production active de vanille utilise désormais `sanctuary:dry_vanilla_pod`,
`sanctuary:food_drying`, 3 600 ticks, et garde le résultat `sanctuary:vanilla_pod`.
L'ancien identifiant `sanctuary:dried_vanilla_pod` reste enregistré comme recette
native de fumoir avec sa valeur d'XP historique, mais son tag d'ingrédients de
compatibilité `legacy_vanilla_smoking` est vide : aucune gousse ne s'y traite.
Cette conservation évite le cast natif vers `AbstractCookingRecipe` lors du
paiement d'une ancienne réserve d'XP de fumoir. Le test recharge cette histoire
native, récupère les recettes/XP et vérifie que gousses vertes et charbon restent
intacts. Aucun inventaire ou format de sauvegarde n'est réécrit.
La poudre de vanille au moulin et les recettes utilisant la gousse restent
compatibles. Aucune modification de monde existant n'est réalisée pour tester
ce changement.
Les nouvelles icônes utilisent le modèle natif `item/generated`, les sprites
existants et une teinte constante, comme les préparations déjà portées.
Tous les PNG d'origine restent intacts. Ce sont des icônes réutilisant les
dessins actuels, pas douze nouvelles textures peintes sur mesure.
## Sources et vérifications
`scripts/data/drying-foods.json` pilote les objets, 14 nouvelles transformations,
durées et 18 propositions. `scripts/dried_food_resources.py` génère les
modèles, recettes, tags et fiches de découverte ; `DriedFoods` enregistre les
objets. `scripts/build_drying_guide.py` régénère le guide Markdown et sa copie
autonome HTML. Le catalogue historique 26.2 n'est pas réécrit.
`./gradlew check build assemblePack` a réussi en **2 min 40 s**, avec
**179 tests serveur natifs réussis** : nouvelles transformations, séchoir historique,
récoltes, agriculture et vanille, fromage/vin/saucisson, appareils, cuisine,
recettes et progression. Les 14 nouvelles transformations exécutent chaque
échéance complète, avec contrôle au tick précédent puis au tick exact.
Le parcours **Vulkan / Apple M1 avec Sodium** a réussi en **51 s** : pose et
accrochage payés de quatre aliments différents, douze modèles sans texture
manquante, onglet Nourriture et boissons, FR/EN aux échelles 2/3/4, immersion
et vidage avec de vrais seaux, fermeture/réouverture du monde de test, reprise
des compteurs, quatre récupérations, consommation native et **15 recettes JEI**.
Les compteurs sont rapprochés de leur fin uniquement dans la fixture graphique,
après sauvegarde et vidage ; les durées complètes sont testées côté serveur.
Neuf captures sont conservées dans `build/drying317-final-screenshots/`.
L'audit du JAR vérifie **1 182 ressources JSON** contre les générateurs,
**1 108 PNG strictement identiques à beta.316**, et les modèles/libellés FR/EN.
Les JAR du mod et des packs client/serveur préparés ont le même SHA-256 ;
le ZIP du template beta.317 est valide. Aucune installation ni publication.
[Commandes, empreintes et reçu](drying-foods-beta317-verification.json).
@@ -0,0 +1,87 @@
{
"version": "beta.313",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.313.jar",
"sha256": "54ea931d2f54eec8dac2d03e5ad1df8fd5b389db235a536bdd98d90a531fbe55",
"previous_verified_sha256": "90349a998970030ec0bfd880b307b9162e76fd0f460d70f1c9ac8ad2c115c8bd",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"data/minecraft/tags/block/mineable/axe.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/KitchenAppliances.class",
"fr/koka/sanctuary/cuisine/KitchenClient$1.class",
"fr/koka/sanctuary/cuisine/KitchenClient.class",
"fr/koka/sanctuary/cuisine/KitchenJei$Category.class",
"fr/koka/sanctuary/cuisine/KitchenJei.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [
"assets/sanctuary/blockstates/drying_rack.json",
"assets/sanctuary/items/cured_sausage.json",
"assets/sanctuary/items/drying_rack.json",
"assets/sanctuary/items/raw_sausage.json",
"assets/sanctuary/models/block/drying_rack.json",
"assets/sanctuary/models/item/cured_sausage.json",
"assets/sanctuary/models/item/drying_rack.json",
"assets/sanctuary/models/item/raw_sausage.json",
"data/sanctuary/loot_table/blocks/drying_rack.json",
"data/sanctuary/recipe/dry_sausage.json",
"data/sanctuary/recipe/drying_rack.json",
"data/sanctuary/recipe/prepare_sausage.json",
"data/sanctuary/sanctuary_recipe_collections/drying.json",
"fr/koka/sanctuary/cuisine/culinary/block/DryingRackBlock.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/DryingRackBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/DryingRackHud.class",
"fr/koka/sanctuary/cuisine/culinary/client/renderer/DryingRackBlockEntityRenderer$1.class",
"fr/koka/sanctuary/cuisine/culinary/client/renderer/DryingRackBlockEntityRenderer.class",
"fr/koka/sanctuary/cuisine/culinary/client/renderer/state/DryingRackRenderState.class",
"fr/koka/sanctuary/cuisine/recipe/FoodDryingRecipe$1.class",
"fr/koka/sanctuary/cuisine/recipe/FoodDryingRecipe.class"
],
"removed_jar_entries": [],
"generated_json": {
"cuisine": 432,
"kitchen": 208,
"agriculture": 376
},
"additive_drying_json": 13,
"culinary_source_classes": 50,
"culinary_compiled_classes_verified": 69,
"drying_slots": 4,
"items_per_slot": 1,
"drying_ticks": 6000,
"native_minecraft_textures_only": true,
"old_pngs_unchanged": 1108,
"new_pngs": 0,
"server_required": 112,
"drying_scenarios": 12,
"client_vulkan": {
"log": "build/drying313-client.log",
"screenshots": "build/drying313-screenshots",
"screenshot_count": 11,
"world_seed": 313,
"sodium": "0.9.2+mc26.3",
"native_crafting": true,
"native_eating": true,
"actual_disk_reopen": true,
"actual_bucket_pause_drain": true
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"template_added_entries": [
"assets/sanctuary/blockstates/drying_rack.json",
"assets/sanctuary/items/cured_sausage.json",
"assets/sanctuary/items/drying_rack.json",
"assets/sanctuary/items/raw_sausage.json",
"assets/sanctuary/models/block/drying_rack.json",
"assets/sanctuary/models/item/cured_sausage.json",
"assets/sanctuary/models/item/drying_rack.json",
"assets/sanctuary/models/item/raw_sausage.json"
],
"build_log": "build/drying313-build.log"
}
+113
View File
@@ -0,0 +1,113 @@
# IA-06 — préparation de saucisson et séchoir, beta.313 locale
Demande du créateur du 29 octobre 2026 : préparer le saucisson puis le sécher
avec des gestes vanilla. Durée confirmée : **5 minutes de jeu**. Un séchoir
en bois porte quatre préparations visibles, sans combustible ni menu. La
pluie suspend le séchage exposé ; un toit le protège. Même branche locale
`codex/itsalive-26-3`, sans publication, installation ou déploiement.
## Contrat de stockage avant développement
Ajouts uniquement : bloc/objet/bloc entité `sanctuary:drying_rack`, objets
`sanctuary:raw_sausage` et `sanctuary:cured_sausage`, type et sérialiseur de
recette `sanctuary:food_drying`. Aucun identifiant existant ni format des
anciens appareils ne change. Aucune génération de monde n'est ajoutée.
Le séchoir possède quatre cases natives 0–3, **un objet par crochet**. La
préparation et le produit séché utilisent la même case : une conversion
remplace exactement un objet par un autre. Chaque crochet conserve ses
propres ticks, durée, identifiant de recette et état terminé, sous marqueur
`DryingVersion=1`. Les composants des objets restent natifs.
La progression est autoritaire côté serveur, uniquement sur les ticks du
bloc chargé et sec. Pluie et immersion suspendent sans payer ni perdre le
travail ; un toit protège de la pluie. Le rechargement reprend les ticks
stockés, sans rattrapage hors ligne. Remplacer/retirer une préparation annule
son avancement ; les autres crochets continuent. La casse rend le séchoir et
chaque objet présent une seule fois, cru ou séché selon son état réel.
Les pistons ne déplacent pas le bloc entité.
Une ancienne version ne connaît pas ces nouveaux identifiants : récupérer
les objets et retirer les séchoirs avant un retour à une version antérieure.
Aucun monde personnel n'est converti ; les tests ciblent des mondes neufs
et des fixtures de développement ignorés.
## Préparation et gestes retenus
À l'établi : deux côtelettes de porc crues, du sel, une gousse d'ail et une
ficelle donnent **deux préparations de saucisson**. La préparation crue ne se
mange pas. Le séchoir se fabrique avec trois bâtons, deux ficelles et deux
planches ; son modèle et ceux des saucissons utilisent des cuboïdes et des
textures vanilla référencées, sans nouveaux PNG.
Un clic place une préparation sur un crochet libre. À main vide, récupérer
un saucisson prêt ; sinon reprendre une préparation en cours. L'eau se gère
avec le comportement vanilla des blocs pouvant contenir de l'eau. L'orientation
est horizontale et les contenus tournent avec le cadre. Les entonnoirs peuvent
alimenter les crochets libres et ne retirer que les produits prêts dessous.
Les trois nouveaux objets rejoignent Nourriture et boissons, sans nouvelle
page créative. Les recettes sont intégrées au système de découverte et à JEI.
## Vérifications locales
Douze cas serveur natifs vérifient le vrai paiement à l'établi, l'absence de
recette concurrente, les **6 000 ticks complets** sur quatre crochets, les
interruptions indépendantes, la pluie et le toit, l'immersion et le seau,
les quatre progressions sauvegardées sans rattrapage hors ligne, la collecte
sélective, la casse sans duplication, l'alimentation/extraction par de vrais
entonnoirs, la sauvegarde d'un résultat fini et la découverte des trois recettes.
La fixture de pluie est placée dans un biome de plaine dans le monde de test.
Le parcours **Vulkan / Apple M1**, avec **Sodium 0.9.2+mc26.3**, a réussi en
**1 min 16 s**, monde plat neuf de graine **313** :
- vrais paquets de l'établi, deux fabrications payées donnant quatre
préparations depuis quatre porcs crus, deux sels, deux ails et deux ficelles ;
- pose du séchoir avec un objet réellement consommé, puis quatre accrochages ;
- retrait/raccrochage d'une préparation, sans annuler les trois autres ;
- huit états de modèle chargés, cinq cuboïdes de bois par état, trois modèles
d'objets sans texture manquante, objets dans Nourriture et boissons ;
- HUD français/anglais aux échelles 2, 3 et 4 ;
- vrai seau d'eau puis seau vide pour suspendre/reprendre le séchage ;
- fermeture/réouverture conservant les quatre préparations et leur progression
exacte pendant l'immersion ;
- transformation, quatre récupérations natives puis consommation réelle d'un
saucisson qui rend de la nourriture ;
- recette de cinq minutes synchronisée dans sa catégorie JEI.
Les 6 000 ticks sont exécutés intégralement dans les cas serveur. Pour ne pas
attendre cinq minutes dans le parcours graphique, la fixture rapproche les
quatre compteurs de leur fin **après** le rechargement et le vidage au seau ;
les 40 à 100 derniers ticks, les transformations, clics et paiements restent
réels. Onze captures sont archivées dans `build/drying313-screenshots/` ;
les journaux de build, serveur et client sont ignorés.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=drying313,cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryDrying313ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=drying313 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` a réussi en **3 min 9 s**, avec **112 tests serveur
obligatoires**. L'audit strict à beta.312 vérifie les ajouts du séchoir et les
modifications prévues de registre, rendu, JEI, langues et crédits. Les
**1 108 PNG** et les 195 JSON culinaires d'appareils existants sont inchangés ;
13 JSON de modèles/recettes/découverte sont ajoutés. Les 432 JSON de cuisine,
208 d'appareils et 376 d'agriculture sont comparés à leurs générateurs.
Le tag de minage à la hache garde ses entrées historiques. Les classes
culinaires compilées et les copies client/serveur du JAR sont vérifiées.
Le modèle de pack de ressources emporte les huit nouveaux JSON visuels.
[Reçu de vérification](drying-rack-beta313-verification.json). JAR local :
`mods/sanctuary/build/libs/sanctuary-beta.313.jar`
SHA-256 :
`54ea931d2f54eec8dac2d03e5ad1df8fd5b389db235a536bdd98d90a531fbe55`
Aucun push, tag, publication, canal packwiz public, installation Prism ou
serveur personnel n'a été modifié.
@@ -0,0 +1,53 @@
{
"version": "beta.322",
"date": "2026-10-31",
"branch": "codex/itsalive-26-3",
"local_only": true,
"jar": {
"path": "mods/sanctuary/build/libs/sanctuary-beta.322.jar",
"bytes": 19161350,
"sha256": "2e0d86c613f46be4636bf70d4f3b7e678472f62190d38d9225b4fe053d4dd152"
},
"client_server_copies_identical": true,
"active_hooks": 2,
"max_items_per_hook": 1,
"legacy_storage_version": 1,
"legacy_storage_positions": 4,
"legacy_reserve_slots": [
2,
3
],
"legacy_progress_preserved": true,
"legacy_waiting_food_does_not_advance": true,
"rack_wooden_cuboids": 7,
"crafting": {
"drying_rack": "5 sticks + 2 planks",
"mill": "3 smooth stone slabs + 2 copper ingots + 1 smooth stone + 1 stick"
},
"checks": {
"check_build_assemblePack": true,
"server_tests": 68,
"server_focus": "drying322,drying313,drying317,driedcuisine318,sausage315,mill306,kitchen304",
"sanctuaryAtlasOnly": true,
"vulkan_backend": "Apple M1",
"sodium": "0.9.2+mc26.3",
"full_native_sausage_and_mixed_food_path": true,
"final_upright_sprite_native_path": true,
"gui_scales": [
2,
3,
4
],
"locales": [
"fr_fr",
"en_us"
],
"native_inventory_payment_and_third_item_refusal": true,
"waterlogging_and_actual_disk_reload": true,
"first_interrupted_graphical_attempt_counted_as_pass": false
},
"evidence_directory": "build/drying322/",
"publication": false,
"existing_personal_or_server_world_modified": false,
"personal_instance_updated": false
}
+72
View File
@@ -0,0 +1,72 @@
# IA-14 — séchoir à deux aliments et fabrications simples
Branche `codex/itsalive-26-3`, préparation locale beta.322. Demande du
31 octobre 2026 : deux aliments visibles, plus grands et droits ; fabrication
du séchoir sans fil et du moulin sans tailleur de pierre.
## Contrat de compatibilité avant développement
Le séchoir conserve son identifiant et le stockage `DryingVersion=1`, avec
les quatre positions et leurs compteurs historiques. Seules les positions
0 et 1 acceptent de nouveaux ingrédients et travaillent. Les anciennes
positions 2 et 3 forment une réserve de compatibilité : elles ne sont jamais
réalimentées, ne progressent pas en attente et gardent leurs objets,
composants, recettes, durées et état terminé.
Dès qu’une position active se libère, le prochain ancien objet y est repris
avec sa progression intacte. Tant qu’un surplus ancien attend, l’insertion
manuelle ou par entonnoir est refusée. Les anciens produits déjà prêts
restent récupérables. Le HUD signale le nombre d’anciens objets en attente.
La casse restitue tous les contenus présents exactement une fois.
Aucune réécriture globale de monde ou de chunk : ce comportement s’applique
aux séchoirs normalement chargés. Aucun format ni identifiant supprimé.
## Fabrication et rendu
- Séchoir : cinq bâtons et deux planches, grille `SSS / S S / P P`.
- Moulin : trois dalles de pierre lisse, deux lingots de cuivre, un bloc de
pierre lisse central et un bâton. Identifiant de recette conservé.
- Deux points d’accroche en bois ; sprites agrandis et présentés droits.
Les saucissons sont suspendus verticalement par quart de tour, sans rotation
oblique des cuboïdes. Les dessins diagonaux de viande et de poisson sont
redressés uniquement dans le séchoir ; les icônes d’inventaire restent intactes.
- Durées, pluie, immersion, récipients, recettes alimentaires et extraction
des produits prêts sont conservés. Les deux aliments restent indépendants.
## Validation locale
- **68 tests serveur réussis** : deux positions actives, refus d’un troisième
objet, entonnoirs, durées complètes et indépendantes, pluie et immersion,
restes d’ananas, sauvegardes et nouvelles fabrications payées à l’établi.
- Une sauvegarde native version 1 à quatre objets conserve ses composants,
quatre progressions et résultats. La réserve attend, reprend une place libre
sans réinitialisation, puis la casse restitue chaque objet exactement une fois.
- Parcours **Vulkan / Apple M1 avec Sodium** réussi : fabrication native,
deux accrochages payés, retrait/raccrochage, huit états de cadre, saucissons
verticaux, noms FR/EN aux échelles 2/3/4, vrais seaux, relecture sur disque,
récupération, part de saucisson posée et consommation des produits séchés.
- Contrôle complémentaire Vulkan après redressement des dessins diagonaux :
viande et cabillaud droits, refus de consommer le troisième ingrédient,
douze modèles alimentaires résolus, seize recettes JEI synchronisées.
Les captures finales ont été inspectées.
- Le premier essai graphique s’est interrompu avant sa fin ; il n’est pas
compté comme réussi. Le parcours regroupé a ensuite réussi, puis le contrôle
ciblé du rendu final a réussi également.
Les journaux et captures restent dans `build/drying322/` (ignoré par Git).
Aucune publication, modification du canal ou installation personnelle demandée.
Le site et le serveur restent sur leur livraison beta.321.
`./gradlew check build assemblePack` final réussi en **4 min 50 s**, avec
les **68 tests serveur** et les contrôles de construction et distribution.
Profil : `drying322,drying313,drying317,driedcuisine318,sausage315,mill306,kitchen304`,
avec `sanctuaryAtlasOnly=true`. Le parcours Vulkan regroupé réussit en
**1 min 22 s** ; le contrôle final des sprites redressés en **1 min 16 s**.
Les JAR client/serveur sont identiques, les nouvelles classes de test sont
absentes du binaire distribué, les langues FR/EN et recettes générées sont vérifiées.
JAR : `mods/sanctuary/build/libs/sanctuary-beta.322.jar`, 19161350 octets.
SHA-256 : `2e0d86c613f46be4636bf70d4f3b7e678472f62190d38d9225b4fe053d4dd152`.
[Reçu de vérification](drying-rack-beta322-verification.json).
+88
View File
@@ -0,0 +1,88 @@
# LIGHT-288 — intégrer la correction des lumières portées
Branche `codex/dynamic-light-integration`, socle local beta.287 conservé.
État : intégré, vérifié et construit en pack local beta.288.
## Résultat demandé
Intégrer au pack courant le correctif du commit
`6f44214f2725b4ef2d1002606cb83e70885186ec`, branche `codex/dynamic-hand-light`.
Sa version locale isolée était beta.283 ; la livraison combinée prend beta.288
et conserve les zombies, leurs neuf tenues partagées, les bras natifs et le
Hunter accroupi de beta.287.
Une torche ou une lanterne tenue réagissait dans les normales PBR sans éclairer
le terrain avec Sodium. La collecte des sources était correcte, mais les copies
`LevelSlice` utilisées par les workers Sodium ne recevaient pas l’instantané.
L’interface `DynamicLightContext` et deux mixins optionnels transmettent
l’instantané immuable du contexte préparé côté rendu vers la copie du worker.
Chaque nouveau travail remplace sa capture et `reset` la libère. Les lectures
directes de lumière de bloc dans Sodium utilisent le même champ radial que
le chemin natif, sans modifier le canal du ciel.
Les mixins ne sont sélectionnés que côté client avec Sodium présent. La
version exacte reste `0.9.2+mc26.3`, facultative et active par défaut dans le
pack ; aucune nouvelle dépendance. Les budgets, réglages et chemins natifs
existants restent en vigueur. Aucun monde, identifiant, format de sauvegarde
ou comportement serveur n’est modifié.
## Vérification
Le test existant `HandLight283ClientChecks` est repris sans modification du
commit source. Monde plat neuf, graine `283`, salle en pierre fermée et zone
de pixels du sol sans interface ni objet en main visible. Deux parcours
**Vulkan / MoltenVK 1.4.2, Apple M1** réussis :
| Rendu du pack combiné | Sol sans source | Sol avec torche |
| --- | ---: | ---: |
| Sodium `0.9.2+mc26.3` | 11,785 | 85,366 |
| Natif, Sodium absent | 11,783 | 90,043 |
Ces moyennes de luminance sur 255 sont des mesures de pixels, pas des niveaux
de lumière du serveur. Les deux mains, l’AO activée/désactivée, shaders/PBR
coupés, profil Moyen sans/avec PBR, déplacement et torche jetée sont vérifiés.
Après retrait, le sol retrouve sa luminosité initiale ; le moteur de lumière
du monde reste à zéro. Avec Sodium, le worker retardé conserve son instantané,
la réutilisation le remplace, le ciel reste inchangé et `reset` le libère.
Commandes des deux parcours, en sessions distinctes :
```sh
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryHandLightClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryQuickTests=true -PsanctuaryClientGraphicsBackend=vulkan \
-PsanctuaryClientHeapGb=8 -PsanctuaryClientNoVsync=true
```
Le second parcours utilise `-PsanctuarySodiumClientTests=false`. Le parcours
`Zombie287ClientChecks` réussit également avec Sodium activé, Vulkan, graine
`287` : neuf tenues partagées pour les sept types, bébé classique, bras natifs,
21 combinaisons de familiers et marche/bond du Hunter. Logs et captures sous
`build/dynamic288/`.
`./gradlew check build assemblePack -PsanctuaryFocusedTests=lights,hunter286
-PsanctuaryAtlasOnly=true` réussit en **2 min 42 s** : **19 GameTests requis**
pour les lumières et le Hunter, test d’infrastructure compris, ainsi que tous
les contrôles purs configurés par `check`.
L’export packwiz est vérifié : intégrité ZIP, version `beta.288`, Minecraft
`26.3`, Fabric Loader `0.19.5`, un seul JAR Sanctuary identique au binaire
construit. Par rapport au JAR beta.287, seules **cinq entrées** changent :
la version Fabric, le plugin de sélection des mixins et les trois nouvelles
classes du pont Sodium. Toutes les classes et ressources des zombies et
familiers sont strictement identiques. Les tests et Sodium ne sont pas
embarqués dans le JAR Sanctuary.
## Livraison locale
- [Pack beta.288](../build/Sanctuary-beta.288.mrpack), 16 715 918 octets.
SHA-256 : `51f70f5f00b0ccd293cf9be0dd34cf3e125c493d7929393428623668543c396b`.
- JAR `mods/sanctuary/build/libs/sanctuary-beta.288.jar`.
SHA-256 : `189883fad82476da221552fc56facb585f05f3167d0908a855f510625b932358`.
- Reçu : `build/dynamic288/validation.json`, comparaison des archives et
références des logs. Le MRpack beta.287 reste intact.
Aucune publication, synchronisation Prism ou ouverture de sauvegarde
personnelle. La décroissance radiale et ses limites d’occultation restent
celles de l’éclairage dynamique existant.
+105
View File
@@ -0,0 +1,105 @@
# WHALE-01 — baleine fantôme volante
Branche `codex/flying-ghost-whale`, préparation locale **beta.290** le
26 octobre 2026. Demande : import direct de la baleine de Sanctuary 26.2,
avec son IA et son œuf, deux baleines présentes au maximum sur le serveur.
## Import
Sources historiques : `26.2/itsalive`, commit
`94644a28f05b8010f06ec1181fe6c74a50ad80d6`. Le modèle, ses animations,
la texture nuageuse 512 × 256, les particules et les sons Minecraft sont
repris. Les API Fabric/Minecraft sont adaptées à **Minecraft 26.3**, sans
nouvelle dépendance. La texture de la baleine est copiée octet pour octet.
- `sanctuary:flying_whale` : baleine géante, paisible, volante, intangible,
invulnérable, sans butin. Dimensions historiques 36 × 11, rendu ×2,7.
- IA conservée : compagnon vivant non spectateur le plus proche à 520 blocs,
cibles successives entre 68 et 140 blocs du joueur, altitude libre, virages
progressifs, souffle et lente errance sans joueur.
- Spawner historique : contrôle toutes les 400 ticks, une apparition réussie
par tiers de journée (8 000 ticks), dans l’Overworld à 92–138 blocs d’un
joueur. Il attend si le chunk candidat n’est pas déjà chargé. Aucun chunk
n’est généré ou forcé par le spawner. Le calendrier appartient au serveur
courant et repart au démarrage, comme le calendrier historique.
- Dissipation au plus tard après 14 400 ticks (12 minutes à 20 TPS), possible
dès 12 000 ticks après plus de 900 ticks sans joueur proche. Seules les
baleines nommées sont sauvegardées, comme en 26.2 ; elles restent soumises
à cette durée de vie après chargement.
Le quota historique de deux baleines chargées est partagé entre **toutes les
dimensions du serveur**, et étendu aux œufs, invocations, distributeurs et
rechargements. Une troisième entité chargée est retirée. L’utilisation
manuelle d’un œuf est refusée avant consommation si les deux places sont
prises, avec un message FR/EN. Retirer une baleine libère immédiatement sa
place. Les baleines nommées dans des chunks déchargés ne réservent pas de
place ; elles repassent par le quota au rechargement.
## Œuf Minecraft personnalisé
`sanctuary:flying_whale_spawn_egg` figure dans l’onglet Œufs d’apparition.
Son icône est dérivée directement de **`assets/minecraft/textures/item/egg.png`
de Minecraft 26.3**, sans reprendre le dessin historique de l’œuf.
`scripts/generate_whale_egg.py` recolore les pixels en bleu nuage pâle avec
huit pixels lavande. Dimensions 16 × 16, les 90 pixels de coquille,
transparence, contour asymétrique et emplacements des ombres restent natifs.
Le script refuse une version ou une empreinte source différente et propose
`--check` pour comparer les pixels livrés sans réécriture.
```sh
python3.14 scripts/generate_whale_egg.py --check /chemin/minecraft-client.jar
/give @s sanctuary:flying_whale_spawn_egg
/summon sanctuary:flying_whale ~ ~10 ~
```
Libellés de l’entité, de l’œuf et du refus de quota en FR/EN. Aucun familier
miniature, capture de baleine ou conversion d’ID 26.2 n’est ajouté. Pas de
changement de générateur, de sauvegarde existante ou de publication distante.
## Vérification
- `./gradlew check build assemblePack
-PsanctuaryFocusedTests=whale290,recipes,progression
-PsanctuaryAtlasOnly=true` : **réussi en 3 min 34 s**, avec **19 tests
serveur requis réussis**, tous les contrôles purs de `check`, le JAR
`sanctuary-beta.290.jar` et les profils packwiz client/serveur assemblés.
Ce périmètre serveur cible la baleine, les recettes et la progression ;
il ne rejoue pas les suites de génération historiques.
- Archive JAR relue : version beta.290, classes et deux textures présentes,
un seul JEI embarqué, aucune classe de test ; même JAR unique dans chacun
des deux profils packwiz. Reçu SHA-256 sous `build/whale290/artifacts.json`.
- Suite native ciblée `:sanctuary:runGameTest
-PsanctuaryFocusedTests=whale290 -PsanctuaryAtlasOnly=true` : **7 tests
requis réussis**, dont les six scénarios baleine et le contrôle
d’infrastructure. Usage réel de l’œuf en survie, non-consommation à quota
plein, quota Overworld/Nether, refus de la troisième invocation, libération
d’une place, apparition naturelle à rayon/altitude historiques, déplacement
natif, dissipation, collision sans modification du terrain et sauvegarde
nommée vérifiés. Les tests attendent que les chunks de développement soient
effectivement chargés avant de vérifier leur population.
- Parcours graphique **Vulkan / MoltenVK 1.4.2 / Apple M1**, avec
**Sodium 0.9.2+mc26.3**, réussi en **49 s** : deux baleines géantes
translucides, nageoires animées, texture historique, véritable déplacement
autour du joueur, œuf en main et hotbar, libellés FR/EN. Les captures
`0000_whale290-native-egg-and-two-whales.png` et
`0001_whale290-ghosts.png` sont inspectées visuellement.
- `generate_whale_egg.py --check` : pixels livrés identiques au résultat
déterministe, 90 pixels opaques et masque alpha strictement natif.
PNG de la baleine identique octet pour octet à la référence 26.2 ;
JSON des libellés FR/EN et modèles d’objet valides.
Commande du parcours graphique :
```sh
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryWhale290ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=whale290 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Journaux et captures ignorés sous `build/whale290/`. Validation en monde
plat de développement neuf, graine `290` pour le client ; aucun monde
personnel ni serveur Beta n’est ouvert ou modifié. Le calendrier complet
sur une journée réelle et un parcours multijoueur distant ne sont pas
revendiqués ; les trois fenêtres sont exercées par les tests de calendrier.
+40
View File
@@ -0,0 +1,40 @@
{
"version": "beta.316",
"status": "local-only",
"date": "2026-10-30",
"jar": {
"path": "mods/sanctuary/build/libs/sanctuary-beta.316.jar",
"sha256": "27ec0a8f492517131766a8c026cd0406189db3e78595a59ab605bbacd4303889",
"bytes": 19070080
},
"textures_unchanged_from_beta315": 1108,
"server_required_tests": 85,
"build": "check build assemblePack",
"build_seconds": 300,
"client": {
"backend": "Vulkan",
"device": "Apple M1",
"sodium": "0.9.2+mc26.3",
"preset": "sanctuary:sanctuary",
"profile": "231 Medium",
"seed": 316,
"natural_plants": 66,
"types": 16,
"models": 24,
"locales": [
"fr_fr",
"en_us"
],
"reload_preserved": 65,
"harvested_stays_empty": true,
"seconds": 140,
"scope": "starter island native generation, native survival packets, models and disk reload; wild fruit tree plans validated separately by server tests on seeds 0/42/316"
},
"wiki": {
"islands": 9,
"crops_and_products": 28,
"biome_aliases": 111,
"missing_images": 0
},
"deployment": "none; server and Prism remain beta.315"
}
+146
View File
@@ -0,0 +1,146 @@
# IA-09 — Découverte alimentaire en survie, beta.316
Demande du 30 octobre 2026. Même branche `codex/itsalive-26-3`, socle public
`beta.315` / branche `bb61547b`. Préparation locale : pas de publication,
d'installation personnelle ou de modification de la Beta dédiée par ce ticket.
## Résultat
La première semence ne nécessite plus le créatif. Les 20 cultures importées,
le café, la vanille, les citronniers et les oliviers ont une voie de découverte
renouvelable en survie. Le blé, la carotte, la pomme de terre et la betterave
disposent aussi de plantes sauvages sur l'île tempérée.
Le [guide des récoltes](wiki/alimentation/README.md), ses neuf pages d'îles
et sa [planche illustrée](wiki/alimentation/planche.html) viennent du même
catalogue que le jeu : `scripts/data/foraging.json`. Ils décrivent les habitats,
les gestes et les semences à rapporter, ainsi que les ressources vanilla.
Ils restent des pages locales ; aucun wiki externe n'est modifié.
## Répartition
| Habitat | Principales zones | Récoltes |
| --- | --- | --- |
| Tempéré | Sanctuary ; certaines prairies du Nord-Ouest | Blé, carotte, pomme de terre, betterave, fraise, tomate, maïs, concombre, poivron, laitue, oignon, ail, chou, haricot, basilic, menthe |
| Frais | Vallées et clairières du Nord, prairies/taïgas du Nord-Ouest | Blé, carotte, pomme de terre, betterave, fraise, laitue, oignon, ail, chou, menthe |
| Frais humide | Marais et jardin pâle du Nord-Est | Concombre, laitue, chou, haricot, menthe |
| Chaud sec | Bosquets/berges du Sud, savanes et sols vivants du Sud-Ouest | Maïs, raisin, pois chiche, piment, coriandre, olive |
| Doux ensoleillé | Oasis/berges vivantes de l'Ouest | Tomate, maïs, poivron, aubergine, raisin, basilic, citron, olive |
| Tropical | Jungles de l'Est et du Sud-Est, mangroves | Ananas, riz, soja, piment, café, vanille |
La règle lit le **biome réel à la position**, avec des tags explicites pour
les biomes vanilla et les alias Sanctuary versionnés. Elle ne déduit pas
le climat de coordonnées cardinales : les expansions ne sont pas fixées
à des coordonnées universelles. Le bambou tempéré de l'île principale
reste dans le groupe tempéré ; les grottes de roche nue, zones de soufre, cratères, pics de glace et
biomes de vide ne sont pas des lieux de cueillette agricole.
La découverte suit le climat. La culture après transplantation conserve les
règles de beta.300/301 : lumière et sol vanilla, riz dans une source sur boue,
vanille appuyée contre les troncs. Aucun nouveau verrou climatique de croissance.
## Gestes et renouvellement
- Casser une plante sauvage donne une unité de récolte et une semence distincte,
ou une seule unité si le produit se replante lui-même. Ananas : fruit + couronne.
Aucun labourage automatique du terrain naturel.
- Caféier sauvage mûr : clic droit pour les cerises ; leur recette donne les
grains verts replantables. Le casser donne aussi un grain.
- Arbre fruitier : clic droit sur les feuilles portant un fruit. Les feuilles
cassées/décomposées peuvent donner une pousse, selon les règles déjà portées.
- Vanille mûre sur un tronc : clic droit pour les gousses, casse pour une bouture.
- Dans un terrain déjà exploré, les petites herbes et fougères cassées sans
cisailles ni Toucher de soie donnent parfois une récolte du climat : **1/8**,
puis tirage uniforme dans la liste admissible. La recette de récupération
de semences ou la plantation directe permet de la multiplier.
- Riz : herbes marines simples de jungle/mangrove, **1/8**. Pas les algues de
pleine mer ; le riz sauvage visible se trouve sur les berges proches d'eau.
- Bouture de vanille : lianes vanilla cassées en jungle/mangrove, **1/8**.
- Pousses fruitières : feuilles de chêne/acacia dans les habitats chauds
correspondants, **1/40**, puis choix parmi les pousses autorisées.
Les tables natives sont **étendues**, sans remplacement de leurs graines,
pommes, bâtons ou pousses. Les variantes à deux blocs ne reçoivent aucun butin
ajouté, pour éviter le double paiement des moitiés. Cisailles et Toucher de soie
conservent la végétation sans créer simultanément une récolte. Les remplacements
de tables par un datapack restent prioritaires. Fortune n'augmente pas les
quantités de ces nouvelles trouvailles.
## Contrat de génération et sauvegardes
**Décoration agricole IA-09 / révision 316**, graine du parcours natif **316**.
Le relief, les identifiants des profils, les biomes et les journaux des expansions
ne changent pas. La décoration s'ajoute à la fin de `applyBiomeDecoration`, pour
le générateur Sanctuary qui possède les neuf îles. Elle ne s'applique pas aux
mondes vanilla ou au monde plat de test.
Huit candidats déterministes par chunk, sel `0x316F00D`, graine du monde et
coordonnées du chunk. Lecture de surfaces déjà présentes ; aucun sol, bassin,
source d'eau ou couche de neige n'est créé. Petites herbes/fougères remplaçables,
autres végétaux, roches, fluides, constructions et réservations conservés.
Les petits arbres fruitiers sauvages utilisent les bois vanilla et un volume
entièrement contenu dans leur chunk ; leurs pousses plantées conservent les
arbres natifs de beta.300. La vanille ne se pose que contre un tronc accepté.
**Aucun ancien chunk n'est repassé en décoration**. Les chunks sauvegardés
gardent leurs blocs. Aucun chargement, tick de repeuplement, changement de
format de sauvegarde ou activation d'expansion n'est ajouté. Un monde existant
peut découvrir les semences par les nouveaux butins puis les cultiver ; les
nouveaux chunks obtiennent la décoration agricole à leur première génération.
Cette évolution additive peut donc être visible à une ancienne frontière
d'exploration, sans retouche rétroactive.
## Vérification
Le contrôle final `check build assemblePack` valide **85 GameTests serveur requis**,
dont huit scénarios IA-09 : toutes les cultures, les climats, les terrasses
vivantes du preset public, les premières propagules, les outils natifs,
la plantation en survie, les obstacles et les deux arbres sauvages (graines
0, 42 et 316). Log : `build/foraging316-build.log`.
Le parcours client final réussit sous **Vulkan / Apple M1 / Sodium 0.9.2+mc26.3**,
avec le preset public `sanctuary:sanctuary`, profil **231 Medium**, graine **316**,
dans un monde de développement neuf :
- **66 plantes sauvages**, **16 types**, relevés dans 25 chunks autour du départ ;
- vraie casse en survie, attente de l'état serveur et contrôle des objets attendus,
au sol ou ramassés dans l'inventaire ;
- **24 modèles sauvages** réellement chargés, quatre faces pour deux plans en croix,
sans sprite manquant ; noms FR/EN vérifiés ;
- fermeture et réouverture sur disque : **65 plantes conservées**, emplacement
récolté toujours vide, aucun repeuplement au chargement.
Log : `build/foraging316-client-final.log`, réussite en **2 min 20 s**.
Les captures restent ignorées dans `build/foraging316-screenshots/` ; le contrôle
valide le chargement des modèles et les interactions, pas une visite esthétique
exhaustive des huit expansions.
La planche est vérifiée dans le navigateur : **9 îles, 28 lignes de produits,
aucune image manquante ni débordement horizontal** au format du panneau.
Ses 111 alias de biomes et les 80 ressources ajoutées sont issus du catalogue.
Les commandes reproductibles sont :
```sh
python3 scripts/build_foraging_wiki.py
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=foraging316,agriculture300,vanilla301,sausage315,cheesewine314,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryForaging316ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=foraging316 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Le module Test sert au lanceur de contrôle ; les classes de génération et les
ressources agricoles sont dans le JAR Sanctuary de production. Aucun test
OpenGL, déploiement, visite d'un monde personnel ou activation d'expansion sur
le serveur existant n'est effectué. Le serveur et Prism restent en beta.315.
Les durées/quantités ci-dessus décrivent le parcours local, pas une garantie
uniforme du nombre de plantes de chaque île.
Assemblage final réussi en **5 min**, 161 tâches. JAR client/serveur et
ressources générées identiques ; les **1108 PNG** restent strictement
identiques à beta.315. [Reçu binaire et vérifications](foraging-beta316-verification.json).
SHA-256 du JAR beta.316 : `27ec0a8f492517131766a8c026cd0406189db3e78595a59ab605bbacd4303889`.
+99
View File
@@ -0,0 +1,99 @@
# Happy creepers — réintégration
Branche `codex/happy-creepers`, worktree isolé du chantier baleines.
Version locale préparée : **beta.291**, sur le socle beta.289.
Cette fiche conserve le reçu de la branche dédiée. Son commit `0ffd371a` est
repris dans la [livraison intégrée beta.293](release-beta293.md), avec les
baleines, le logo packwiz et les quatre mods facultatifs. Consulter ce reçu
pour l'état de publication et les vérifications de la combinaison finale.
## Contrat
Le happy creeper est un état du creeper Minecraft existant. **Maj + clic droit
avec une fleur** équipe son unique emplacement cosmétique de tête ; **Maj +
clic droit à main vide** rend cette même fleur. Le geste, les contrôles de
distance/visibilité, la consommation en survie et la conservation des composants
de l'objet sont ceux du système de chapeaux existant. Un emplacement occupé
doit être vidé avant d'équiper une autre fleur.
Toute fleur du tag Minecraft `minecraft:flowers` rend le creeper heureux :
visage souriant historique, fleur exacte visible sur la tête animée, aucun
ciblage hostile ni explosion. L'équipement annule immédiatement une mèche
déjà amorcée, y compris au briquet ; retirer la fleur ne reprend pas cette
ancienne mèche. Tant que la fleur est portée, briquet et boule de feu ne
l'allument pas et ne sont pas consommés ou usés. Le creeper continue d'utiliser
ses déplacements natifs et peut toujours subir des dégâts.
Retirer la fleur ou la remplacer par un objet sans rapport rétablit le visage,
le ciblage et l'explosion ordinaires. Un pot de fleurs, des feuilles ou des
graines ne déclenchent pas cet état. La charge électrique est indépendante :
un creeper chargé peut être heureux, et la foudre peut charger un happy
creeper. Retirer sa fleur conserve sa charge.
## Sauvegarde et périmètre
L'état heureux se déduit uniquement de l'objet dans `sanctuary:mob_head`, dont
le schéma 1 est réutilisé sans modification. Cette pile est déjà sauvegardée
et synchronisée par les chapeaux de mobs. Aucun second drapeau, nouvelle
entité, changement de format, migration de monde ou tirage de variante n'est
ajouté. Un creeper portant déjà une fleur devient donc heureux avec cette
version. L'identité, la santé, la charge et les autres données natives restent
sur le même creeper. Le port d'un chapeau conserve sa protection habituelle
contre la disparition à distance.
Les nouvelles apparences de creepers restent pour un prochain ticket. Le
suivi du joueur, les apparitions naturelles de happy creepers et les anciennes
entités `happy_creeper:*`/`mobopia:*` ne font pas partie de cet incrément.
Aucune nouvelle interface n'est ajoutée ; les messages d'équipement et de
retrait FR/EN existants sont réutilisés.
## Vérification
- Serveur `happycreeper,cosmetics,headblocks` : **28 tests requis réussis**,
dont sept tests happy creeper et le test d'infrastructure Fabric. Annulation
immédiate d'une vraie mèche à vingt ticks, refus répété du ciblage/allumage,
représailles, tous les objets du tag fleurs, récupération de la pile nommée,
allumage natif sans fleur et rechargement du même creeper chargé vérifiés.
- Parcours client **Vulkan avec Sodium** : **réussi**. Vrais appuis sur Maj et
clics souris pour équiper/récupérer une fleur en survie ; synchronisation de
la pile et du visage ; AI active pendant 85 ticks près d'un vrai joueur ;
sourire, fleur sur la tête animée et aura électrique native vérifiés.
Monde plat de développement neuf, graine `290`, Minecraft 26.3 sur Apple M1.
Capture : `build/happy-creepers-screenshots/four-states-vulkan.png` ; de gauche
à droite : chargé, chargé heureux, heureux, ordinaire.
- `check build assemblePack` : **réussi en 3 min 55 s**, contrôles purs et
**28 tests serveur** inclus. Export MRpack réussi, versions et dépendances
exactes contrôlées ; un seul JAR Sanctuary embarqué, identique au JAR
construit ; texture historique identique octet par octet et classes de test
absentes. Logs : `build/happy-creepers-final-check-build.log`,
`build/happy-creepers-server.log`, `build/happy-creepers-vulkan.log`.
Reçu : `build/happy-creepers-validation.json`.
Commandes reproductibles :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=happycreeper,cosmetics,headblocks \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryHappyCreeperClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuarySodiumClientTests=true \
-PsanctuaryClientHeapGb=4 -PsanctuaryClientNoVsync=true
```
Le premier essai de `check build` associait par erreur le preset unifié et le
profil rapide ; il a échoué au choix du générateur avant les tests. Le profil
plat `sanctuaryAtlasOnly=true` évite ce conflit de configuration existant.
Aucun monde personnel, serveur Beta, canal packwiz ou Prism n'est modifié.
## Artefacts locaux
- [Pack beta.291](../build/Sanctuary-beta.291.mrpack), 16 724 142 octets.
SHA-256 : `3c2d630fc85e88b08bac94cc2244e975d3552fcac4d508ad366adea730062468`.
- JAR : `mods/sanctuary/build/libs/sanctuary-beta.291.jar`.
SHA-256 : `e8e315db1e4831400244d17429723099fbfe3a352387d8a9cf0ecb01d8170e9e`.
Cette branche part de beta.289 et ne contient pas le travail parallèle des
baleines préparé en beta.290. L'intégration des deux branches précède toute
éventuelle publication commune. Aucun tag ni artefact distant n'est créé.
+87
View File
@@ -0,0 +1,87 @@
# ZOMBIES-286 — Hunter et bond offensif
Branche `codex/hunter`, sur le socle local beta.285 conservé. État : implémenté,
vérifié côté serveur et sous Vulkan ; pack local beta.286 construit et vérifié.
## Contrat demandé
Sixième infecté : un Hunter qui prépare son bond, saute réellement vers sa
cible et la blesse seulement si son corps la touche. Le bond peut rater : sa
direction reste fixée après le départ et les blocs utilisent leurs collisions
natives. Aucun plaquage ni dégât répété automatique n'est ajouté.
- Zombie adulte vanilla 26.3, t-shirt bleu soutenu et pantalon anthracite
recolorés par script ; tête, peau, chaussures, UV et alpha conservés.
Identifiants `sanctuary:hunter` et `sanctuary:hunter_spawn_egg`.
Aucun bébé, y compris via œuf, chargement ou familier ; pas de noyé.
- Sauvage : 10 PV, vitesse 0,30, mêlée 3, poursuite 36 blocs. Préparation
de 16 ticks au sol, bond à 3–10 blocs avec ligne de vue, impulsion verticale
0,62 et vitesse horizontale adaptée à la distance, plafonnée à 1,25.
Une seule frappe de 4 dégâts au contact, récupération de 24 ticks,
recharge de 120 ticks engagée au décollage, même si le bond rate.
- Gravité, trajectoire et collisions natives ; corridor complet chargé et
bordure vérifiés. Mur, plafond, atterrissage ou durée bornée terminent le bond.
Une téléportation n'est pas interprétée comme un balayage d'attaque. Aucun
bloc détruit, chunk généré ou monde existant réécrit.
- Familier rare : adulte miniature à taille variable persistante, 12 PV,
vitesse 0,30. Attaque de contact automatique et G de bond offensif à 8 blocs,
avec trajectoire physique et récupération. Les protections communes des
familiers gardent autorité sur les dégâts, destinataires, claims et duels.
Le familier ne bondit pas lorsqu'il est monté ou transporté.
- Œuf créatif, spawn rare dans les habitats de zombies de l'Overworld : poids 4,
un individu. Recharge conservée au chargement ; préparation et saut interrompus
ne reprennent pas après rechargement. Aucun identifiant ou format existant changé.
## Vérification
- `:sanctuary:runGameTest -PsanctuaryFocusedTests=hunter286
-PsanctuaryAtlasOnly=true` : **16 tests requis réussis**, dont le test
d’infrastructure. Préparation accroupie, vraie élévation, contact unique,
esquive, murs, plafond, atterrissage, recharge, sauvegarde interrompue,
téléportation, corridor déchargé, G physique, protections communes et six
tailles persistantes.
- Régressions séparées : **77 tests** avec
`ziplines242,boomer284,spitter283,charger282,infected280,familiar260,companions`,
puis **19 tests** avec `smoker285`. Les joueurs simulés du Smoker imposent
une session indépendante des tests d’IA asynchrones. Chaque total comprend
son test d’infrastructure.
- Deux arènes historiques corrigées sans changement de comportement : sol
du Charger élargi pour garder l’esquive de quatre blocs sur la plateforme ;
arènes du Smoker replacées dans les chunks suivis par GameTest pour que les
recherches natives de projectiles voient immédiatement les joueurs.
- `:sanctuary:runClientGameTest -PsanctuaryClientTests=true
-PsanctuaryHunter286ClientTests=true -PsanctuaryQuickTests=true
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8
-PsanctuaryClientNoVsync=true` : **réussi**, Vulkan / MoltenVK 1.4.2 /
Apple M1. Monde de développement plat temporaire, graine `286` : appui G
réel, familier en vol, contact et recharge ; bond sauvage sur le vrai joueur,
dégâts, récupération et gravité ; esquive au clavier sans dégâts ; rendu
adulte aux tailles 500/1000/1500 ; interface et infobulle FR/EN, GUI 2/3/4.
Captures : `build/hunter286-screenshots/`.
- `./gradlew check build assemblePack -PsanctuaryFocusedTests=hunter286
-PsanctuaryAtlasOnly=true` : **réussi en 2 min 46 s**, y compris les 16
tests Hunter rejoués et tous les contrôles purs configurés par `check`.
- Export `packwiz modrinth export` et intégrité ZIP vérifiés : un seul JAR
Sanctuary, identique au JAR construit ; version `beta.286`, Minecraft `26.3`,
Fabric Loader `0.19.5`. Classes de test exclues ; classes Hunter, œuf,
profil, butin, tags et traductions FR/EN présents. Pixels du PNG conformes
au script, cinq textures antérieures et MRpack beta.285 inchangés.
## Artefacts locaux
- [Pack beta.286](../build/Sanctuary-beta.286.mrpack), 16 682 455 octets.
SHA-256 : `9363b9067bc9974cd5f850b671e0d97c1f0876eda6885a51e2acf32d6d3b1103`.
- JAR `mods/sanctuary/build/libs/sanctuary-beta.286.jar`.
SHA-256 : `02a62837d2385ec61cf76c915c2eb0e0cc5b339d5bd3ceab64a2f1086bc94abf`.
- Reçu détaillé : `build/hunter286-validation.json`. Logs et captures ignorés
sous `build/hunter286-*`. Les premiers essais échoués des arènes historiques
sont conservés à côté des résultats finaux ; les réparations ci-dessus ne
changent aucun comportement du Charger ou du Smoker.
## Limites
Le Hunter saute puis retombe : aucun plaquage ou maintien du joueur. La vitesse
de lancement adapte la portée au sol ; un dénivelé, un obstacle ou le déplacement
de la cible peut faire rater le contact. Seuls les chunks déjà chargés sont
utilisés. Aucune validation graphique OpenGL, publication, synchronisation
Prism, installation personnelle ou modification de sauvegarde existante.
+76
View File
@@ -0,0 +1,76 @@
# ZOMBIES-281 — Infectés adultes et familiers miniatures
Branche `codex/special-zombies`, suite au retour sur beta.280. État : livré et
vérifié localement.
## Contrat
Les infectés n'ont **aucune forme bébé**. Leur modèle et leur texture sont
toujours ceux de l'adulte. Cette règle appartient à `AbstractInfectedEntity`,
le socle commun des variantes : les futurs Hunter, Charger, Spitter et Boomer
devront aussi en hériter. Ces variantes restent à implémenter.
L'Infecté actuel refuse le flag bébé des groupes naturels, des appels natifs,
des œufs et du chargement des données d'entité. Il ne reçoit pas le bonus de
vitesse bébé. Les bébés zombies Minecraft gardent leurs règles habituelles.
En familier, l'adulte est réduit avec le système `FamiliarSize` existant.
Son trait de taille enregistré dans l'œuf reste identique : petites, ordinaires,
grandes et colossales restent possibles. Le rendu en jeu, les aperçus des menus,
les dimensions de monture et les sons utilisent tous la même forme adulte.
La taille ne dépend donc plus d'un âge bébé.
Les identifiants, la texture vanilla recolorée, les règles de combat et les
formats restent ceux de beta.280. Une ancienne donnée d'Infecté portant
`IsBaby=true` est interprétée comme adulte à la lecture, sans changement de
son UUID ou de sa santé. Aucun monde personnel n'est ouvert ou réécrit.
## Vérifications
- Refus du bébé et de son bonus de vitesse, avec bébé zombie vanilla conservé.
- Lecture d'un ancien flag bébé sans perdre l'identité ni la santé.
- Familier adulte à six tailles, de 120 à 6 000 ‰, sans changer le trait ni
l'identité ; cohérence entre hauteur visible et hauteur de monture.
- Parcours Vulkan sur un monde plat neuf, graine `281` : trois tailles réelles
de familier, inspection de la géométrie adulte et menus FR/EN GUI 2/3/4.
- `./gradlew check build assemblePack` et vérification du MRpack beta.281.
La suite de régression conserve son entrée `infected280` et son option client
`sanctuaryInfected280ClientTests`, actualisées selon ce nouveau contrat.
Les **34 GameTests serveur** ciblés passent, dont neuf pour l'Infecté. Les
contrôles de réapparition et des 88 familiers vanilla passent aussi. Le parcours
client **Vulkan / MoltenVK 1.4.2 / Apple M1** passe en **54 secondes**.
Il vérifie le vrai rendu du familier, sa géométrie adulte et sa hauteur pour
500, 1 000 et 1 500 ‰, ainsi que les noms, infobulles et menus FR/EN aux échelles
2, 3 et 4. Dix captures sont conservées sous `build/infected281-screenshots/` ;
les petites et grandes miniatures et le menu FR GUI 2 ont été inspectés.
Logs : `build/infected281-native.log`, `build/infected281-client-vulkan.log`
(marqueur `INFECTED281_CLIENT_PASS`). La construction complète finale
**`check build assemblePack` passe en 3 min 09 s**, avec les 34 tests serveur.
Log : `build/infected281-check-build-pack.log`.
Le JAR et le MRpack beta.281 sont vérifiés : version exacte, intégrité ZIP,
un seul JAR Sanctuary identique au build, socle adulte commun présent,
texture corrigée conservée octet pour octet et fixtures de test exclues.
Reçu : `build/infected281-validation.json`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=infected280,familiar260,companions \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryInfected280ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
## Livraison locale
- `mods/sanctuary/build/libs/sanctuary-beta.281.jar`
- `build/Sanctuary-beta.281.mrpack`
- `build/infected281-screenshots/0002_infected281-miniature-1000.png`
Aucun déploiement dans Prism ou un serveur personnel. Les artefacts beta.280
sont conservés ; cette livraison utilise le numéro suivant.
+135
View File
@@ -0,0 +1,135 @@
# ZOMBIES-280 — Premier infecté
Le contrat bébé de cette livraison est remplacé par
[beta.281 : adultes en miniature et taille variable](infected-adults-beta281.md).
Branche `codex/special-zombies`. Premier incrément demandé : l'Infecté simple,
avant les Hunter, Charger, Spitter et Boomer. État : livré localement et vérifié.
## Contrat
- `sanctuary:infected` est un zombie vert au modèle vanilla, t-shirt rouge et
pantalon brun sombre. Adulte et bébé utilisent les formes natives.
- Attributs de base : 10 PV, vitesse 0,25 contre 0,23 pour le zombie ; mêlée
native, dégâts de base 3, portée de poursuite 36 blocs. Il brûle au soleil
et ne se transforme pas en noyé. Aucun pouvoir spécial dans ce premier lot.
- Apparition au sol dans l'obscurité, selon les règles des monstres, uniquement
dans les biomes de l'Overworld qui proposent déjà le zombie : poids 15,
groupes de 1 à 3. Aucun spawner ni remplacement des zombies existants.
- `sanctuary:infected_spawn_egg` apparaît dans l'onglet des œufs créatifs et
invoque uniquement l'Infecté. Il peut être équipé comme familier bébé avec
identité, suivi, ordres, santé et combat persistants du système existant.
- Le familier a 10 PV, vitesse 0,30, morsure de mêlée et assaut court. Son
profil FR/EN est distinct du zombie. Aucune nouvelle aptitude de travail.
- Les autres infectés et le zombie des glaces restent à réaliser. Aucune
nouvelle voie d'acquisition des œufs en survie n'est ajoutée dans ce lot.
## Référence et compatibilité
Référence en lecture seule : `../26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, `InfectedVariant.INFECTED` et
`InfectedEntity`. Le nouveau type est indépendant des cinq variantes sous
`itsalive:infected` de l'ancien mod ; aucune importation de leur sauvegarde.
Les identifiants, profils et données des familiers existants sont conservés.
L'ajout de tables de spawn affecte les apparitions futures, sans changer le
terrain, les graines, les chunks ou un format de sauvegarde.
La texture est une recoloration déterministe du zombie natif **26.3**, par
masques UV et sélection des seuls pixels cyan du t-shirt et violets du pantalon.
Le visage, la peau verte, les chaussures et l'alpha sont conservés pixel pour
pixel. L'œuf reprend l'icône rouge historique. La première texture générée par
ImageGen décalait l'atlas ; elle a été écartée après le retour du créateur.
## Vérifications
Les **33 GameTests serveur** ciblés passent, dont huit nouveaux : attributs,
mêlée réelle et bébé ; utilisation de l'œuf en survie et consommation ;
sauvegarde/relecture native avec UUID, âge et santé ; tables de spawn ;
immersion sans conversion en noyé ; équipement et rééquipement du familier ;
morsure réelle du familier ; changement d'œuf pendant un objectif en cours.
Les suites de pouvoirs existants et de réapparition
beta.260 passent avec le nouvel œuf installé.
Log final : `build/infected280-check-build-pack.log`.
Le serveur plat natif 26.3 utilise le désert ; le contrôle positif des tables
porte sur cet habitat réellement générable, avec exclusions Champignons,
Nether et End. Il ne mesure pas la fréquence des rencontres en partie longue.
Le parcours client final **Vulkan / MoltenVK 1.4.2 / Apple M1** passe en 54 s :
apparences adulte et bébé face au zombie classique, familier réellement équipé,
renderer partagé avec les proxies, texture embarquée, rareté et infobulle
native, noms et menus **FR/EN GUI 2/3/4**. Sept captures sont conservées dans
`build/infected280-screenshots/`. Les vues comparatives, FR GUI 4 et EN GUI 2
ont été inspectées après correction de la texture. La vue comparative finale
confirme le visage et les bras vanilla, le t-shirt rouge et le pantalon brun
sans décalage. Log : `build/infected280-client-vulkan.log`, marqueur
`INFECTED280_CLIENT_PASS`. Aucun essai OpenGL.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=infected280,familiar260,companions \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryInfected280ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Le mode plat explicite évite la fixture historique de génération, sans modifier
le générateur de production. Tous les mondes utilisés sont jetables et ignorés.
La construction complète finale **`check build assemblePack` passe en 2 min 59 s**,
avec la texture corrigée et les 33 tests serveur. Les contrôles purs du dépôt
passent également. Le MRpack est exporté et vérifié : intégrité ZIP,
Minecraft 26.3, Fabric Loader 0.19.5, un seul JAR Sanctuary beta.280 identique
au build et texture corrigée présente octet pour octet. Les fixtures de test
sont exclues du JAR. Reçu : `build/infected280-validation.json`.
Le second parcours a également reproduit un plantage lors du remplacement
d'un œuf : l'ancien objectif d'IA pouvait continuer un tick avant la création
du nouvel individu. Le cerveau vérifie désormais que le familier est actif
et que son œuf correspond encore à celui équipé avant d'agir. Un huitième
GameTest couvre cet intervalle ; le parcours client final inclut le correctif.
## Essai local
Dans un monde de développement avec commandes autorisées :
```mcfunction
/give @s sanctuary:infected_spawn_egg
/summon sanctuary:infected
```
L'œuf placé dans l'emplacement Familier invoque sa forme bébé. Les commandes
Alt bref / Alt maintenu et la technique G restent celles des autres familiers.
L'œuf est fourni en créatif ; aucune nouvelle acquisition en survie n'est
annoncée. Aucun canal packwiz, serveur personnel ou instance Prism modifié.
## Ressources graphiques
- Texture livrée : `mods/sanctuary/src/main/resources/assets/sanctuary/textures/entity/infected.png`.
- Œuf historique : `mods/sanctuary/src/main/resources/assets/sanctuary/textures/item/infected_spawn_egg.png`.
- Outil de texture : `scripts/generate_infected_texture.py`, Python standard et
ImageMagick 7 pour lire/écrire le PNG. **Aucun dessin génératif ni changement
de géométrie.** 331 pixels de t-shirt et 239 pixels de pantalon recolorés,
nuances natives conservées ; visage et transparence vérifiés avant encodage,
puis tous les pixels vérifiés après écriture.
- SHA-256 du PNG source :
`1b88eea9b63889c2c3399773f887af375defc3aad0e7a375adc84249da54cbbd`.
- SHA-256 de la texture livrée :
`398898aed83ec22ef525b60da120fc3e0b971b33ad3640c73104b952ad060e29`.
Reproduction sans modifier le JAR source :
```sh
python3 scripts/generate_infected_texture.py /chemin/vers/minecraft-26.3-client.jar
```
Voir aussi la provenance dans `THIRD_PARTY_NOTICES.md`.
## Artefacts locaux
- Mod : `mods/sanctuary/build/libs/sanctuary-beta.280.jar`.
- Pack : `build/Sanctuary-beta.280.mrpack`.
- Captures corrigées : `build/infected280-screenshots/`.
La livraison est locale. La publication et la mise à jour de l'instance Prism
restent distinctes de ce travail de développement.
+116
View File
@@ -0,0 +1,116 @@
# MENU-271 — Habitant en deux colonnes et deux rangées
Demande du 24 octobre 2026, continuation de `codex/inhabitant-property`.
Version locale `beta.271`, après le premier lot de propriété beta.270.
## Résultat demandé
- Pause retrouve **Combats / Battles** dans **Communauté**, sous Habitant.
Story et Factions ne figurent pas dans ce menu.
- Habitant présente une barre horizontale **Propriété — Factions — Familier**
en haut, sur les mêmes boutons natifs que les catégories de Découvertes.
- Le personnage et son nom occupent la cellule supérieure gauche, avec
des marges autour de la silhouette. La biographie est en haut à droite.
- Sous la biographie, un tableau de bord présente le temps joué, les blocs
posés, les blocs cassés, les créatures tuées, les morts et les progrès obtenus.
Son bouton Statistiques ouvre la page générale complète existante.
- Sous le personnage, l’activité occupe tout le panneau inférieur gauche,
jusqu’en bas du contenu. La liste affiche les dernières activités disponibles
dans son propre défilement, et **Historique reste dans son pied de panneau**.
Il ouvre les 24 dernières activités disponibles ; l’ancien journal des cycles
et achats reste accessible dans cette page.
- Aucun aperçu, nom ou réglage du familier ne figure dans Habitant. Son bouton
ouvre la page dédiée avec l'aide alliée, le carnet, les choix en attente et
les contrôles opérateur admissibles, en plus des commandes déjà présentes.
- Propriété, Factions, Familier, Statistiques et Historique reviennent à
Habitant ; Combats revient à Pause. Le pied de page natif est conservé.
Les textes FR/EN, nombres compacts et infobulles gardent les valeurs et titres
complets accessibles dans les petits formats. Biographie, statistiques et
activité défilent indépendamment, et conservent leur position à la mise à jour
des données. Les hauteurs s’adaptent aux échelles GUI 2, 3 et 4 ; la silhouette
garde de l’air autour d’elle dans la cellule supérieure gauche.
## Sources et contrat de données
L'aperçu est une **lecture personnelle côté serveur**, via l'acteur authentifié
du protocole communautaire existant. Aucun UUID du joueur à consulter n'est
accepté depuis le client. Les opérations de fichier ou JDBC restent dans le
worker communautaire ; les données Minecraft sont copiées sur le thread serveur.
- Temps, minage, morts et créatures tuées : compteurs Minecraft existants.
Le temps est celui des ticks de jeu Minecraft. Le minage suit les règles de
comptage vanilla ; les destructions en Créatif ne sont pas inventées.
- Pose : sommes des poses confirmées du Blocodex, y compris les identifiants
sauvegardés d'un mod absent. Les usages d'objets ne sont pas assimilés à des
poses. Une source endommagée est signalée indisponible, jamais remise à zéro.
- Progrès : accomplissements natifs ayant un affichage public ; les recettes
et critères incomplets ne sont pas présentés comme des achievements.
La date est le moment où toutes les exigences deviennent satisfaites :
un critère optionnel obtenu plus tard ne déplace pas cette date.
- Activité : publications, annonces, réponses et bulletins personnels visibles,
progrès achevés et achats/cycles/factions déjà datés dans les sauvegardes.
Le contenu intégral des publications et leurs photos ne sont pas transmis.
Les publications modérées et les réponses à un parent masqué sont exclues.
- Tri décroissant par date avec identifiants stables pour les égalités,
dédoublonnage et limite de 24. Les anciennes données sont lisibles sans
journal supplémentaire. Une panne communautaire conserve l'aperçu natif
et signale que les publications manquent temporairement.
Ce panneau n'enregistre pas le texte du chat, des messages privés ou toutes
les actions du monde. Il réunit les événements déjà persistants et datés ci-dessus.
Aucun format de sauvegarde, coût, droit, règle de jeu ou monde personnel ne
change. Aucun familier n'est retiré de l'inventaire ni rappelé en ouvrant Habitant.
Les artefacts beta.270 déjà exportés sont conservés.
## Vérifications
`check build assemblePack` réussit en **2 min 37 s**, avec **15 GameTests
serveur ciblés**. Le parcours Vulkan FR/EN aux échelles GUI 2, 3 et 4 réussit
en **45 s** et utilise un nouveau monde
plat de graine 271. Il vérifie la barre supérieure, les deux colonnes et deux
rangées, les marges du personnage, le panneau d’activité jusqu’en bas et son
bouton Historique, la biographie et les statistiques à droite, les défilements
et la conservation de leur position après rafraîchissement.
Des compteurs serveur connus (une heure de ticks ajoutée, deux poses et
25 blocs minés), un progrès natif et une annonce réellement publiée dans le
monde de développement sont relus par le réseau. Le parcours conserve aussi
les retours Propriété/Factions/Familier/Historique, la modification du consentement
à l’aide alliée et l’achat d’une extension de propriété.
Les tests serveur ciblés couvrent les données personnelles, les dates des
critères OR, les statistiques sans double comptage, les publications masquées,
les sources persistantes lues sans modification, les pannes communautaires et
le dédoublonnage. Le test de fichier communautaire couvre l’isolation des auteurs,
les réponses sous un parent masqué, l’ordre et la limite de 24.
La requête MariaDB reste paramétrée et bornée ; aucun serveur SQL réel n’a été
exercé pour cette livraison.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=overview271,property270,progression,menus \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryInhabitant271ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Une exécution exploratoire de la suite supplémentaire `companions` a échoué
sur `creatureProfilesActuallyMove` : « Native navigation produces an actual
airborne displacement ». Les règles de déplacement ne sont pas modifiées ici ;
ce comportement n’est pas validé ni corrigé par ce lot d’interface. Le contrôle
Vulkan du bouton Familier et de son consentement est distinct de cet essai.
Résumé conservé dans `build/inhabitant271-exploratory-navigation.txt`.
Journaux locaux ignorés : `build/inhabitant271-client-vulkan.log` et
`build/inhabitant271-check-build-pack.log`. Les **32 captures** sont conservées
dans `build/inhabitant271-screenshots/`. Les fiches Habitant FR/EN, les formats
GUI 2/4 et la page d’activité ont été inspectés.
Export local vérifié : [Sanctuary-beta.271.mrpack](../build/Sanctuary-beta.271.mrpack),
16 483 048 octets. Intégrité ZIP, versions Minecraft/Fabric, dépendances et JAR
Sanctuary/JEI comparés aux builds. Le MRpack beta.270 reste identique par SHA-256.
Reçu de validation : `build/inhabitant271-validation.json`.
Aucune publication de canal ni synchronisation d’instance personnelle.
+108
View File
@@ -0,0 +1,108 @@
# INSECT-08 — Activité saisonnière, soleil et météo, beta.295
## Intégration beta.320
Cette note conserve le contexte et les preuves du chantier local beta.295.
Son code est repris sans les modifications de propriétés du checkout dans
le [regroupement beta.320](integration-beta320.md), qui possède sa propre validation.
Demande du créateur du 30 octobre 2026. Branche
`codex/insect-seasonal-activity`. Les modifications locales de la commande
de propriété beta.294 sont conservées, sans modification de leurs sources.
## Comportement
Le calendrier des 47 espèces conserve ses mois, créneaux et pics pondérés,
avec le fuseau du serveur et le décalage de six mois dans l’hémisphère sud.
Une journée ensoleillée ne peut donc pas faire apparaître une espèce hors
saison. Les saisons ne sont pas remplacées par le biome.
L’activité utilise également la position réelle du soleil dans l’horloge
native de l’Overworld : lever inclus, coucher exclu. Elle suit les journées
saisonnières lorsque le temps réel est actif, et le soleil du jeu en mode
vanilla. Une baisse de luminosité due à un orage n’est pas un coucher de soleil.
| Groupe | Activité |
| --- | --- |
| Papillons de jour, libellules, criquets/sauterelles, mantes, coccinelles, gerris et cigales diurnes | Jour uniquement ; 20 % des tentatives sous la pluie ; aucune sous la neige |
| Papillon de nuit et grand paon de nuit | Nuit uniquement ; 20 % des tentatives sous la pluie ; aucune sous la neige |
| Grillon et grillon des prés | 100 % la nuit, 25 % le jour dans leur créneau existant ; pluie : facteur 1/5 ; aucune sous la neige |
| Moustique et scarabées/lucanes nocturnes | 100 % la nuit, 25 % le jour dans leur créneau existant |
| Autres insectes volants | Pluie : facteur 1/2 ; aucune sous la neige |
| Cigale du soir | Ses créneaux d’aube/crépuscule sont conservés ; pluie : facteur 1/5 ; aucune sous la neige |
| Escargot, cloporte et autres espèces | Habitats et restrictions existants conservés, dont la pluie effective pour l’escargot |
Les pourcentages sont des chances d’accepter une tentative déjà sélectionnée
par le calendrier et son pic. Ils ne sont pas renormalisés entre espèces :
la pluie réduit aussi les apparitions lorsqu’un grillon est le seul candidat.
La météo est celle du niveau et de la précipitation du biome au point réel ;
un biome sans précipitation n’est pas traité comme mouillé. La neige native
et le profil neige saisonnier Sanctuary sont reconnus.
Les spécimens présents revérifient leur activité toutes les secondes. Un
passage à une activité nulle les retire. Une baisse conserve une fraction
proportionnelle de la population ; cette sélection a lieu à la transition,
sans répéter la réduction chaque seconde de pluie. Le retour au sec restaure
les chances des nouvelles tentatives. Les entités restent transitoires,
avec la durée maximale existante de deux minutes.
## Lumières extérieures
Le papillon de nuit cherche les blocs lumineux dans les quatre blocs autour
de la colonne échantillonnée, de deux blocs en dessous à six au-dessus.
Cela permet de trouver les lanternes ordinaires et des âmes, y compris
suspendues sous une clôture. Il se place à côté de la lumière et vole dans
un petit rayon de 0,3 bloc, sans traverser le luminaire.
Le grand paon de nuit garde son habitat de tronc. Les blocs lumineux
immergés et les faces occupées sont refusés. Les règles existantes de toit
restent appliquées à la position du papillon : pas d’insectes introduits
dans une maison, y compris sous verre. Les plafonds de population et les
18 tentatives / deux ajouts au maximum toutes les cinq secondes restent
inchangés. La recherche ne consulte que les chunks déjà chargés.
Les spécimens explicitement mis en inspection par le laboratoire gardent
leur exception. Aucun bloc, monde, identifiant, texture, son, dépendance,
interface ou format de sauvegarde n’est modifié.
## Vérification
Vérification réussie le 30 octobre 2026 sur Minecraft 26.3, Fabric Loader
0.19.5, Fabric API 0.160.5+26.3 et Java 25 :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=insects245 -PsanctuaryAtlasOnly=true
```
- `check build assemblePack` réussit en **4 min 9 s**, avec **25 GameTests
requis réussis**, les contrôles communs de `check` et les deux profils
packwiz client/serveur vérifiés.
- Les nouveaux scénarios vérifient les limites exactes lever/coucher,
l’apparition naturelle sur une fleur en été, son refus en hiver et sous
un soleil nocturne, et le retrait du papillon au coucher du soleil.
- Deux cents tentatives sèches puis deux cents sous une pluie réelle
contrôlent la réduction absolue des grillons ; les survivants ne sont
pas retirés répétitivement. Les scènes fixent explicitement leurs biomes :
pluie en plaine, absence de pluie dans le désert, neige en plaine enneigée.
- Les deux lanternes suspendues attirent un papillon naturel la nuit.
Quatre-vingts ticks vérifient son mouvement borné à côté du luminaire ;
retirer la source le fait disparaître. Refus le jour et sous un toit de
verre, contrôle de chunk éloigné non chargé et anciennes régressions
de supports, plafonds, déplacements et captures réussis.
- [JAR local](../mods/sanctuary/build/libs/sanctuary-beta.295.jar) et
[export MRpack](../build/Sanctuary-beta.295.mrpack) vérifiés : intégrité
ZIP, version, dépendances exactes et JAR embarqué identique. Le catalogue
embarqué est identique au fichier source inchangé.
- Les quatre fichiers Java préexistants de propriété et leur ticket
beta.294 conservent leur empreinte initiale. Journal :
`build/insects295/check-build-pack-final.log` ;
[reçu et empreintes](../build/insects295/validation.json).
La validation porte sur les règles et déplacements côté serveur ; aucun
nouvel essai graphique n’est revendiqué pour cette passe.
Préparation locale uniquement. Pas de publication, modification de serveur
Beta ni synchronisation de l’instance Prism personnelle. L’appréciation de
la densité sur une île complète reste un retour de jeu à recueillir.
@@ -0,0 +1,60 @@
{
"version": "beta.320",
"date": "2026-10-30",
"branch": "codex/itsalive-26-3",
"base": "163618ed",
"scope": [
"direct_cuisine",
"minecraft_cauldron",
"dairy_churn",
"natural_seeds",
"player_height_maps",
"seasonal_insect_activity"
],
"server_tests": 241,
"check_build_assemblePack_assembleServerPack": "passed",
"client_graphics": {
"backend": "Vulkan",
"sodium": true,
"device": "Apple M1",
"combined_run": "passed",
"production_classes_identical": 2770,
"paths": [
"dairy",
"direct_cuisine_legacy_creative_jei",
"exact_height_maps_island_under_type_fixture"
],
"local_screenshots": 36
},
"provenance": {
"map_commit": "f99b83a4",
"map_base": "c15b4ba2",
"insect_branch": "codex/insect-seasonal-activity",
"insect_base": "74dc1265",
"other_worktrees_modified": false
},
"compatibility": {
"retained_preparations": 46,
"retained_compatibility_recipe_ids": 141,
"existing_worlds_opened": false,
"existing_chunks_modified": false,
"under_prototype_activated": false,
"test_fixtures_in_distribution": false
},
"deployment": "none",
"latest_public_release": "beta.318",
"artifacts": {
"mods/sanctuary/build/libs/sanctuary-beta.320.jar": {
"bytes": 19160731,
"sha256": "09459661e40f610d61dfcb463cdba3b73e0962328eebe72c11e78b8ce6eee453"
},
"build/Sanctuary-Server-beta.320.zip": {
"bytes": 4036721,
"sha256": "c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43"
}
},
"logs": [
"build/integration320/check-build-pack.log",
"build/integration320/all-vulkan.log"
]
}
+92
View File
@@ -0,0 +1,92 @@
# beta.320 — Cuisine, carte et activité saisonnière
**Livraison effectuée :** [serveur et site en beta.320](release-beta320.md).
Le reste de cette note conserve le cadrage et les vérifications de préparation.
Regroupement demandé le 30 octobre 2026 sur `codex/itsalive-26-3`, à partir
de la livraison publique beta.318 (`163618ed` pour son reçu).
Cette préparation réunit le travail culinaire initialement prévu en beta.319
et les deux correctifs développés séparément. La cible autorisée est le
**push des sources Git** ; aucun tag de release, canal packwiz, site, serveur
ou instance Prism n’est mis à jour par ce lot.
## Contenu
- [Cuisine directe et chaudron Minecraft](cuisine-beta319.md) : retrait des
46 préparations artificielles des fabrications, du créatif et de JEI,
récupération des anciens stocks, et semences naturelles dans les herbes.
- [Baratte et laitages](wiki/alimentation/laitages.md) : cinq minutes de repos
du lait, puis beurre, crème fouettée et beurre aux herbes travaillés à la
main. Fromage au tonneau ; intégration des produits dans la cuisine existante.
- [Carte à la hauteur exacte du joueur](map-player-height-beta319.md) : Atlas
et aperçu Pause suivent le Y des pieds, sans arrondi aux six anciens
plafonds. Grottes et altitudes négatives, zoom et centre conservés,
anciennes données de surface conservées et nouvelles coupes séparées.
- [Activité saisonnière des insectes](insect-activity-beta295.md) : calendrier
des 47 espèces conservé ; activité adaptée au soleil, à la pluie et à la
neige. Sous la pluie, les grillons ont 80 % de chances d’apparition en moins.
Papillons diurnes le jour et papillons de nuit près des lanternes extérieures,
y compris suspendues. Habitats et plafonds de population conservés.
## Provenance et portée de l’intégration
Le correctif de carte est repris du commit `f99b83a4` de
`codex/map-player-height`, qui reposait sur le prototype Under `c15b4ba2`.
Seuls les changements de cartographie sont repris, avec le prédicat existant
`UnderVisibility` reconnaissant les types Under v3 à v10. **Aucun portail,
générateur, préréglage ou dimension du prototype n’est ajouté au pack normal.**
Les mêmes règles de carte pourront fonctionner dans ces dimensions lorsqu’elles
seront présentes. Leur absence n’active aucun nouvel accès.
La validation de séparation des dimensions utilise un monde plat dédié,
avec le vrai type de dimension `sanctuary_test:under_v10`, mais un terrain
de contrôle or/lapis et un toit en bedrock. Le type et le préréglage de cette
scène sont dans les seules ressources de GameTest, exclues du JAR distribué.
Elle vérifie le changement réel de dimension, la carte, Pause et le retour,
sans importer le prototype Under complet.
L’activité saisonnière provient des changements non commités du checkout
`codex/insect-seasonal-activity`, base `74dc1265` : `InsectActivity`,
`InsectEntity`, `InsectSpawner` et leurs tests. La copie est ciblée ; ses
changements de propriétés et de duels, son compteur et ses autres fichiers
locaux ne sont pas intégrés ni modifiés.
Les notes beta.295 et MAP-319 conservent leurs **preuves historiques isolées**.
Elles ne constituent pas une validation du binaire beta.320. Le reçu de cette
intégration est produit après ses propres tests et son assemblage.
## Données existantes
Aucun monde personnel n’est ouvert ou modifié. Aucun chunk n’est régénéré,
aucun ancien relevé n’est converti. L’Overworld garde ses chemins de cartes ;
les coupes exactes et les relevés Under emploient les chemins additifs décrits
dans MAP-319. Client et serveur devront recevoir ensemble la future livraison
du protocole acceptant les altitudes intermédiaires.
Les entités d’insectes sont ambiantes et non sauvegardées ; les spécimens
capturés restent des objets persistants. Aucun calendrier, catalogue d’espèces
ou format de sauvegarde des captures n’est modifié.
## Vérification
`check build assemblePack assembleServerPack` réussit en **2 min 53 s**, avec
**241 tests serveur requis réussis**, les contrôles communs de `check` et les
profils packwiz client/serveur vérifiés.
Le parcours client regroupé réussit en **1 min 29 s**, sous **Vulkan avec
Sodium sur Apple M1** : baratte et quatre transformations par vraies interactions,
cuisine directe et anciens stocks, créatif et JEI, Atlas/Pause à hauteur exacte,
altitudes négatives, données persistées et séparation Island/Under de contrôle.
Les textes FR/EN passent aux échelles 2/3/4. Les **36 captures** sont conservées
localement dans `build/integration320/screenshots/` ; vues de baratte, de recette,
de carte et de Pause inspectées.
Le JAR contient exactement les **2 770 classes de production** employées par
ce parcours Vulkan. Son intégrité ZIP, sa version et l’exclusion des classes
et dimensions de test sont vérifiées. Le kit serveur est aussi vérifié ; aucun
artefact n’est téléversé. [Reçu et empreintes](integration-beta320-verification.json).
La densité des insectes sur une île complète reste à apprécier pendant les
prochains essais de jeu. La validation Under porte sur le type et les
transitions de dimensions de la scène contrôlée, sans livraison du prototype.
@@ -0,0 +1,54 @@
{
"version": "beta.324",
"server_tests": 221,
"full_check_build_pack_server_pack": true,
"focused_tests": "chickens323,eggaudit,poultry,aptitudes236,forgerie238,progression,movement,sorting,recipes,foodknowledge,companions,familiar,starter,refonte,drying322,drying313,drying317,driedcuisine318,sausage315,mill306,kitchen304,cuisine319,map321,map319,map244,map,menus",
"atlas_only": true,
"heap_caps": {
"pure_checks": "512m",
"game_tests": "2g"
},
"checks_skipped_by_memory_script": [],
"client": {
"backend": "Vulkan",
"gpu": "Apple M1",
"sodium": true,
"heap": "2g",
"seconds": 74,
"combined_path_passed": true,
"parts": [
"GemChicken323ClientChecks",
"Aptitudes236ClientChecks",
"JeiSearch297ClientChecks",
"Drying317ClientChecks"
],
"locales": [
"fr_fr",
"en_us"
],
"gui_scales": [
2,
3,
4
]
},
"sources": {
"chickens": {
"root": "/Users/koka/Documents/sanctuary/sanctuary-beta",
"head": "74dc1265a8247a44410ed466ca04b371b25284c1"
},
"aptitudes": {
"commit": "0cbb38691001593f32093f9defee18c8f8a35dda"
},
"jei": {
"root": "/Users/koka/.codex/worktrees/jei-search/sanctuary-beta",
"head": "74dc1265a8247a44410ed466ca04b371b25284c1"
}
},
"original_imported_files_unchanged": true,
"code_jar_sha256": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72",
"embedded_jei": "30.32.0-sanctuary.5",
"embedded_media": "0.3.2",
"evidence": "build/integration324/",
"personal_world_opened": false
}
+81
View File
@@ -0,0 +1,81 @@
# Beta.324 — poules rares, aptitudes, recherche JEI et séchoir
Branche de regroupement : `codex/itsalive-26-3`. Demande du 31 octobre 2026 :
intégrer les trois chantiers, mettre Git à jour et publier Sanctuary.
La livraison comprend les sources Git et le pack publié sur le site et le serveur Beta.
## Sources reprises
- Séchoir beta.322 : commit `7ca566292fb4f3b8ad5a718285181834de917f32`.
Deux objets, affichage agrandi et redressé, fabrication sans fil et moulin
sans tailleur de pierre. Les anciennes positions excédentaires restent en
attente avec leur progression. [Contrat](drying-rack-beta322.md).
- Poules rares : changements locaux du chantier `codex/rare-chickens`, depuis
`74dc1265`, repris fichier par fichier, avec sept PNG historiques intacts.
Les autres changements locaux de ce dossier ne sont pas importés.
[Contrat et provenance](rare-chickens-beta323.md).
- Aptitudes : patch du commit `0cbb38691001593f32093f9defee18c8f8a35dda`,
repris par fusion à trois sources en conservant la cuisine récente.
[Prix et transition](aptitude-prices-beta297.md).
- Recherche JEI : patch local de `codex/jei-search-input`, au-dessus de
`74dc1265`. Le fork embarqué devient `30.32.0-sanctuary.5`.
[Correctif de saisie](jei-search-beta297.md).
Les numéros beta.297 et beta.323 des notes sources désignent leurs préparations
isolées. La livraison commune est beta.324 ; aucune ancienne release n’est
remplacée. Les dossiers sources restent conservés en place.
## Contrats de conservation avant livraison
Les poules rares et l’œuf en or ajoutent des identifiants sans modifier les
chunks ou la génération : une poule ordinaire a une chance sur 256 de pondre
un œuf en or. Celui-ci donne un poussin rare, selon les poids 8:4:2:1 pour
émeraude, rubis, saphir et or. Les variantes rares ne se reproduisent pas.
Leurs produits et délais chargés sont ceux du contrat source.
Les reçus d’aptitudes déjà achetées restent valides, sans supplément ni rachat.
Les nouvelles dépenses utilisent les tarifs du chantier Aptitudes. La
transition de configuration est explicitement reprise : `progression.json`
5 → 6, `companion-powers.json` 1 → 2 ; seuls les anciens tarifs par défaut
égaux à 4 deviennent les nouveaux tarifs. Les autres valeurs personnalisées
et les autres paramètres restent conservés. Une sauvegarde complète du
serveur et des configurations précède leur chargement par le nouveau binaire.
Après démarrage, seules ces transitions documentées de configuration sont
admises. Un retour à beta.321 exige la sauvegarde compatible, pas un lancement
de l’ancien code sur les nouveaux schémas.
JEI garde les favoris, les connaissances et l’événement de texte natif ;
seule la décision de conserver le focus utilise le code logique SDL.
Les fixtures culinaires paient désormais le prix courant du Catalogue ;
les tests de reçus historiques restent distincts.
Le site conserve son bouton de téléchargement direct. Publication du nouveau
pack par les outils versionnés ; aucun remplacement global du code Web,
changement de comptes, permissions, Alpha, réseau ou génération n’est prévu.
## Validation
- `check build assemblePack assembleServerPack` réussi en **2 min 58 s**,
**221 GameTests serveur requis réussis**, avec les contrôles purs du dépôt.
Le script de développement limite les tests purs à 512 Mio et le serveur
de test à 2 Gio ; aucun contrôle n’est exclu par ce script.
- Premier passage : un ancien test de carte donnait huit niveaux au joueur
pour un achat désormais à douze. La fixture utilise maintenant le tarif
configuré ; les assertions de paiement exact et de refus du rachat restent.
- Parcours commun **Vulkan / Apple M1 avec Sodium**, réussi en **1 min 14 s** :
quatre variantes et huit modèles adulte/poussin, couleurs et noms FR/EN ;
treize aptitudes, Catalogue refusé à 29 puis payé à 30 avec XP synchronisée
pendant la pause ; saisie JEI avec lettres, accents, Unicode, filtrage,
édition, focus clavier et chat ; séchoir à deux aliments, refus du troisième,
immersion, relecture sur disque, récupération et consommation.
- Captures inspectées : poules FR, achat Catalogue et recherche JEI FR GUI 4.
Langues FR/EN et interfaces 2/3/4 vérifiées dans le parcours commun.
- Les sept PNG historiques des poules/œuf et les fichiers sources originaux
importés restent intacts. Un seul JEI embarqué, en `.5`, plus Media 0.3.2.
Aucun module de test ajouté au JAR ; copies packwiz client/serveur et
override MRpack identiques au JAR validé.
JAR : `sanctuary-beta.324.jar`, SHA-256
`2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72`.
Les preuves du regroupement sont conservées dans `build/integration324/`.
Le reçu de livraison site/serveur sera ajouté après les vérifications publiques.
+124
View File
@@ -0,0 +1,124 @@
# Prochaine passe — mods du pack et modules personnels
Cadrage du **26 octobre 2026**, à la demande de Koka. Initialement préparés
pour après beta.291, les quatre tickets d'intégration sont désormais repris
dans [la préparation locale beta.292](optional-mods-beta292.md), à sa demande.
Dozei Stream et Only Fun restent des contrats futurs. Chaque implémentation
prendra sa propre branche `codex/<sujet>` et son prochain compteur libre.
Les versions du cadrage ci-dessous sont des candidats repérés pour **Minecraft 26.3,
Fabric 0.19.5 et Java 25**, pas des intégrations validées. Tous les essais
graphiques cibleront Vulkan, avec Sodium puis sans si le mod le permet.
L'API Modrinth a été interrogée avec les filtres exacts `game_versions=["26.3"]`
et `loaders=["fabric"]`. Les JAR candidats ont été téléchargés dans le dossier
ignoré `build/optional-mods291/`, vérifiés contre leur SHA-512 publié et leurs
`fabric.mod.json` relus. Revalider versions, dépendances, licences et hashes au
début de chaque ticket ; aucun binaire téléchargé n'entre dans Git.
| Ticket | Branche prévue | Candidat observé | Résultat à obtenir |
| --- | --- | --- | --- |
| PACK-VOICE-01 | `codex/simple-voice-chat` | [2.6.26+26.3, Fabric, bêta](https://modrinth.com/plugin/simple-voice-chat/version/cZm965sW) | Conversation de proximité client/serveur, compatible avec l'acoustique Sanctuary |
| PACK-BOBBY-01 | `codex/bobby-optional` | [5.2.16+mc26.3](https://modrinth.com/mod/bobby/version/J7YnfCss) | Voir les chunks déjà reçus au-delà de la distance envoyée par le serveur, installation facultative |
| PACK-LITHIUM-01 | `codex/lithium-integration` | [0.26.2+mc26.3, Fabric](https://modrinth.com/mod/lithium/version/xS0Q8LSi) | Réduire le coût de simulation en conservant les règles Sanctuary |
| PACK-CULL-01 | `codex/entity-culling` | [1.11.3 pour 26.3, Fabric](https://modrinth.com/mod/entityculling/version/X1g3VhTx) | Éviter le rendu des entités et blocs entités masqués, sans disparitions incorrectes |
| MODULE-DOZEI-01 | `codex/dozei-stream-contract` | Pas encore réalisé, aucun artefact fourni | Définir le premier résultat vérifiable de Dozei Stream |
| MODULE-ONLYFUN-01 | `codex/only-fun-contract` | Mod personnel futur | Définir une première interaction potache autonome |
## PACK-VOICE-01 — Simple Voice Chat
Le JAR 2.6.26 déclare `minecraft=26.3.x`, Java ≥25, Loader ≥0.19.3 ;
Fabric API doit être ≥0.160.5+26.3, ce qui correspond au socle actuel.
**Conflit constaté : il déclare `breaks.sound_physics_remastered=<1.5.2`,
alors que Sanctuary distribue 1.5.1+26.3.** Le candidat 2.6.25 a le même refus.
Le JAR [2.6.24+26.3](https://modrinth.com/plugin/simple-voice-chat/version/OLnMVWXy)
ne déclare pas ce conflit ; cela ne prouve pas sa compatibilité en partie.
Décider et tester soit une mise à jour délibérée de Sound Physics et de son
adaptateur natif Sanctuary, soit une version vocale antérieure compatible.
Ne pas contourner les dépendances de Fabric. Conserver un artefact autonome
provenant de l'auteur et ses conditions de distribution.
Acceptation : connexion de deux clients de développement, voix de proximité,
muet, push-to-talk, déconnexion/reconnexion, coexistence Sound Physics et
préférences conservées. Vérifier les profils packwiz client/serveur, le refus
des versions incompatibles et les interfaces FR/EN ajoutées par Sanctuary.
L'activation réseau de la Beta sera une étape de livraison distincte : le
[protocole amont](https://dev.modrepo.de/minecraft/voicechat/wiki/server_setup)
utilise UDP et un port vocal propre, par défaut 24454. Tester depuis l'extérieur
avec `/voicechat test`, puis un échange audible ; l'ouverture du port Minecraft
TCP ne suffit pas. Aucun port ni serveur personnel n'est modifié par ce ticket
documentaire.
## PACK-BOBBY-01 — cache client facultatif
Le candidat déclare un environnement client, Minecraft `~26.3`, Loader
≥0.18.4 et refuse Sodium <0.6.0 ; Sodium 0.9.2 du pack satisfait ce seul
contrat déclaré. Cloth Config et Mod Menu sont suggérés, pas requis dans le
JAR inspecté. Le [principe amont](https://github.com/Johni0702/bobby) est de
mettre en cache les chunks envoyés dans `.bobby`, puis d'afficher leur dernière
copie connue à distance. Ce cache ne simule pas les chunks et ne remplace pas
leur état serveur actuel.
Acceptation : choix packwiz **facultatif**, installation/désinstallation par
le sélecteur et préférence conservée au second lancement ; parcours puis
retour sur un serveur de développement avec distance d'envoi courte ; chunks
lointains visibles sous Vulkan, actualisation lors de leur réception réelle,
claims/Atlas et blocs Sanctuary cohérents au retour. Aucun monde personnel
utilisé comme `bobby-fallback`. Définir une valeur initiale de distance et une
politique de cache mesurées avant livraison ; pas de génération supplémentaire
imposée au serveur.
## PACK-LITHIUM-01 — simulation
Le [candidat](https://github.com/CaffeineMC/lithium) peut fonctionner côté client
et serveur. Ses dépendances déclarées sont Minecraft `~26.3`, Loader ≥0.19.5
et MixinExtras ≥0.5.5. Vérifier la version réellement fournie par Loader ; ne
pas ajouter une bibliothèque par supposition. Définir séparément les profils
serveur et client, sans faire dépendre l'autorité serveur du choix d'un joueur.
Acceptation : démarrage et rechargement d'un monde de test, recettes et
inventaires, IA des infectés/familiers/baleines, interactions multiblocs et
budget de ticks comparés avant/après sur le même scénario. Les gains doivent
être mesurés ; conserver les identifiants, sauvegardes et règles serveur.
## PACK-CULL-01 — masquage visuel
Le [candidat](https://github.com/tr7zw/EntityCulling) cible Minecraft `~26.3`
et requiert Fabric API ; TRansition et TRender sont déjà imbriqués dans le
JAR inspecté. Vérifier leurs hooks de rendu sur Vulkan avant toute inclusion,
ainsi que les conditions de distribution du binaire original.
Acceptation : comparaison activé/désactivé sur une scène de développement,
avec mur opaque, fenêtres, verre, sortie d'occlusion et changement rapide de
caméra. Vérifier familiers portés, cosmétiques, baleines translucides, coffres
et multiblocs ; aucune disparition visible incorrecte. Mesurer le gain et le
coût CPU. Aucun essai OpenGL ne vaut validation de ce ticket.
## Modules personnels — contrats à écrire
**MODULE-DOZEI-01 :** conserver le nom donné « Dozei Stream » ; son rôle,
ses sources, sa cible client/serveur, ses dépendances et son premier scénario
restent à préciser avec le créateur. Ne déduire aucune fonctionnalité du nom.
Acceptation du cadrage : une action observable et un périmètre testable avant
de créer un faux artefact ou une entrée packwiz sans téléchargement.
**MODULE-ONLYFUN-01 :** reprendre la [vision Only Fun](vision.md#only-fun--interactions-sociales-et-absurdes),
avec l'intention confirmée d'ajouter de l'humour « pipi caca ». C'est un mod
personnel autonome, séparé du socle nécessaire pour jouer à Sanctuary.
Choisir une première interaction, définir ses entrées, effets, données
persistantes et branchements facultatifs au calendrier/aux événements.
Acceptation du cadrage : petit scénario jouable défini, comportement en solo
et serveur, installation indépendante et libellés FR/EN prévus. Le contenu
futur de la vision ne devient pas une fonctionnalité livrée par ce document.
## Ordre proposé et fin d'un ticket
Commencer par Bobby facultatif, puis les optimisations mesurées ; traiter la
voix avec sa décision Sound Physics et son parcours réseau. Les deux modules
personnels commencent par leur contrat, sans dépendance implicite à ces mods.
Cet ordre reste une proposition pour la prochaine séance.
Chaque intégration livrée passe `./gradlew check build assemblePack`, les
essais propres au comportement ajouté, deux synchronisations packwiz isolées,
la conservation des choix et le contrôle du profil serveur. Décrire les
résultats réels et les limites restantes avant toute publication demandée.
+297
View File
@@ -0,0 +1,297 @@
# IA — Refonte d'It's Alive ! pour Minecraft 26.3
**Livraison du 30 octobre 2026 :** [beta.318 publiée, serveur/site/Prism mis à jour](release-beta318.md).
**Livraison beta.320 :** [cuisine, carte et activité saisonnière sur le site et le serveur](release-beta320.md), dont IA-12 initialement prévue en beta.319.
Les autres mentions « locale » ci-dessous conservent l'historique des préparations avant publication.
Demande du créateur du **28 octobre 2026**, branche locale
`codex/itsalive-26-3`, socle `77fdabfb` (dernière livraison beta.298).
Le checkout historique 26.2 et les changements locaux du checkout principal
restent intacts. Aucun push, tag, canal, serveur, site ou Prism mis à jour.
Le premier lot retenu par le créateur est **textures et ressources d'abord**.
Le même jour, il demande ensuite le port jouable des cultures, arbres
fruitiers et caféier : [IA-02, préparation beta.300](agriculture-beta300.md).
Les statuts ci-dessous distinguent le port agricole des prochains tickets ;
leur inscription seule ne vaut pas implémentation. Les incréments continueront avec le compteur normal
`beta.xxx`, sans réserver ni publier à l'avance une série de versions 300.
L'intégration reste dans Sanctuary, conformément au
[cadrage de fusion](multiblocs-itsalive-contrat.md).
## IA-01 — Import graphique, beta.299 locale
**Import réalisé.** Les textures sont copiées dans
`mods/sanctuary/src/main/resources/assets/sanctuary/textures/`, avec les noms
de fichiers historiques, sans conversion, redimensionnement ou retouche.
Aucune ressource Sanctuary préexistante n'est écrasée. Le namespace de
destination est celui de Sanctuary ; aucun identifiant de registre n'est
ajouté par la présence d'un PNG.
| Ressources | Nombre | Contenu |
| --- | ---: | --- |
| Textures de blocs | 212 | Croissance, feuillages, pousses, appareils, blocs d'ingrédients |
| Textures d'objets | 129 | Semences, récoltes, ingrédients et plats |
| Sprites d'interface | 2 | Rail et tête du moulin historique |
| **Total** | **343** | Cuisine et agriculture uniquement |
Les **38 PNG fournis dans `food/`** sont prioritaires sur leurs homologues
26.2 et conservés octet pour octet, transparence comprise. Ils existent tous
déjà sous le même nom dans l'historique : ce sont de nouvelles versions des
dessins, pas 38 nouveaux objets. Comparaison avec la 26.2 :
- **32** modifient les pixels ;
- **2**, `corn.png` et `lettuce.png`, modifient seulement l'encodage PNG ;
- **4** sont strictement identiques : `bell_pepper.png`, `eggplant.png`,
`strawberry_seeds.png` et `tomato.png`.
Les **305 autres PNG** proviennent sans modification du module historique
`26.2/itsalive`, commit `26f2c2a0061619df1f146f9081d6740c560a7497`.
Le [reçu complet](itsalive-textures-beta299.json) conserve pour chaque texture
son origine, son SHA-256 final, le SHA-256 26.2 et ses dimensions. Les monstres,
œufs, archives ZIP, fichiers système et textures Canaplia restent hors de
ce lot culinaire. Les portages déjà présents dans Sanctuary sont conservés.
Les textures comprennent les huit stades des **20 cultures historiques** :
fraise, tomate, ananas, maïs, concombre, poivron, aubergine, laitue, oignon,
ail, chou, raisin, riz, soja, haricot, pois chiche, piment, basilic, menthe
et coriandre. S'ajoutent les parties hautes de la tomate, du maïs, du
concombre et du haricot, les quatre stades du caféier et de la vanille,
ainsi que les pousses et feuillages avec/sans fruits du citronnier et de
l'olivier. Les deux arbres historiques réutilisent les bois vanilla :
aucune nouvelle famille de bois n'est sous-entendue.
Les textures sont présentes dans les ressources du mod, mais **aucun de ces
nouveaux objets, blocs, arbres, appareils ou recettes n'est encore enregistré
en jeu**. Le Java, les recettes, les modèles et les règles de génération de
26.2 ne sont pas copiés automatiquement. Les images seules ne suffisent pas
à porter les comportements ni à valider leur compatibilité 26.3.
## Évolution beta.307 — recette du moulin manuel
[La redstone de la recette cède la place à un bâton](mill-recipe-beta307.md)
pour la poignée. Les dalles de pierre lisse, le cuivre et le tailleur de pierre
restent la base de l'appareil. La recette rejoint Divers dans le livre natif ;
son identifiant et le fonctionnement manuel de beta.306 restent stables.
## Évolution beta.306 — moulin manuel
[Le moulin devient un poste manuel comme le tailleur de pierre](mill-beta306.md),
sans combustible ni attente. Le résultat est un aperçu : seule sa récupération
paie un ingrédient. Le nom devient Moulin / Mill ; le menu conserve le
mouvement mécanique et retire le feu. Les neuf recettes et les identifiants
restent stables ; les anciens objets stockés sont récupérables.
## Évolution beta.305 — écrasement direct
À la demande du créateur, la presse alimentaire est retirée du jeu courant.
[Les blocs de fruits s'écrasent directement en huit paliers](crushing-beta305.md),
avec résidus progressifs, piston immédiat et super piston sur 27 blocs.
Les identifiants de fruits restent stables ; l'ancien ID de presse n'est gardé
que pour récupérer un inventaire d'essai local, sans traitement ni catalogue.
## IA-09 — Découverte des premières semences en survie
[Répartition climatique, récoltes sauvages et guide des neuf îles](foraging-beta316.md),
préparation locale beta.316 du 30 octobre 2026. Ce lot remplace le report de
la découverte naturelle annoncé dans IA-02/IA-03, sans repeupler les chunks sauvegardés.
## IA-10 — Extension du séchoir, beta.317 locale
[15 recettes de séchage, 12 nouveaux produits et propositions culinaires](drying-foods-beta317.md).
Les quatre crochets et les sauvegardes gardent leur fonctionnement ; la vanille
se sèche désormais sur le cadre et les herbes/piments secs servent aussi en cuisine.
## IA-11 — Les 18 recettes aux produits séchés, beta.318 locale
[Implémentation et vérifications](dried-cuisine-beta318.md). Les propositions de
beta.317 deviennent des recettes jouables avec les appareils prévus ; le saucisson
pimenté garde les gestes de préparation, séchage et partage en tranches. Les plats
épicés déclenchent de petits coups cosmétiques sans perte de vie.
## Suivi des mécaniques
### IA-02 — Cultures, arbres fruitiers et caféier jouables
**Port implémenté dans la préparation locale beta.300**, sur cette même
branche. [Comportements, accès et vérifications](agriculture-beta300.md).
Le texte ci-dessous conserve le périmètre du ticket.
Porter les 20 cultures, leurs propagules, les arbres et le caféier vers les
API 26.3. Reprendre explicitement les récoltes pérennes et annuelles, les
parties hautes et la plantation particulière du riz, après examen des règles
historiques. Ajouter les noms et aides FR/EN. Tester plantation, croissance,
récolte, casse, rechargement et absence de duplication côté serveur.
La répartition climatique et l'apparition naturelle feront l'objet d'un
contrat de génération séparé, documenté avec graine et version. Aucune
injection rétrospective dans les chunks existants n'est autorisée par ce lot.
### IA-03 — Vanille grimpante
**Implémentée dans la préparation locale beta.301**, sur la même branche :
[attachement aux troncs, croissance ascendante et vérifications](vanilla-beta301.md).
[Correction graphique beta.302 : quatre stades en 16 × 16](vanilla-16px-beta302.md).
Le texte ci-dessous conserve le périmètre initial du ticket.
Obtenir une plante plaquée contre son support, visuellement comparable aux
lianes, qui **progresse vers le haut** plutôt que de former un grand totem.
L'ancien `VanillaVineBlock` possède déjà une méthode `growUpward` et exige
une bûche de jungle ; il faut donc examiner aussi le modèle, les faces et les
supports, sans présenter un simple changement de direction comme une refonte.
Vérifier la pose, le support de chaque segment, la croissance supérieure,
les obstacles, la récolte, la casse du support et la poudre d'os. Choisir les
supports admis et la forme exacte dans ce ticket. Les quatre anciens PNG
sont conservés comme références, sans promettre qu'ils suffiront au modèle final.
### IA-04 — Cuisiner avec le chaudron
**Suite locale beta.312 :** [le premier geste mémorise la recette, les lots
se répètent et le réapprovisionnement garde le travail en cours](cauldron-repeat-beta312.md).
La sortie s’accumule, sa collecte conserve la série et Maj-clic à main vide
permet de l’arrêter.
**Refonte locale beta.311 :** [préparation libre, démarrage au bâton, aucun
plat raté au chaudron, récipients payés en fin de cuisson et sons natifs](cauldron-beta311.md).
Le geste manuel est confirmé par le créateur ; les 19 recettes restent les
recettes portées, avec une seule préparation lancée par geste.
**Port jouable en beta.304 locale :** [chaudron vanilla, eau exacte, chauffe, lots et récipients](kitchen-beta304.md).
Repartir des usages du chaudron vanilla pour l'eau, la chauffe, les ingrédients
et les récipients, puis définir comment préparer et servir un plat. Examiner
l'ancien `CookingCauldronBlock` avant de choisir l'extension du bloc vanilla
ou un appareil spécialisé. Les gestes, niveaux d'eau, portions et retours de
bols/seaux doivent former une boucle vérifiable, sans pertes ni duplication.
### IA-05 — Plats ratés et nouvelles recettes
**Suite beta.304 locale :** [appareils et plats ratés historiques portés](kitchen-beta304.md). La fermentation est désormais temporisée dans le tonneau et le pressage exige le pressoir.
**Recettes portées en beta.303 locale à la demande du créateur :**
[92 recettes alimentaires sur table et four/fumoir](cuisine-beta303.md),
avec les ingrédients intermédiaires. La fabrication manuelle instantanée de
fermentation de cette étape est remplacée par le tonneau en beta.304. Les plats
ratés historiques sont également portés dans cette suite.
Le texte ci-dessous conserve le cadrage initial ; la demande d'import du
28 octobre autorise le port du catalogue avec les adaptations documentées.
Revoir les « fake dishes » cités dans la demande. L'historique contient
`failed_dish`, produit par la poêle et le chaudron : c'est la correspondance
probable, à confirmer au cadrage de ce ticket. Définir ce qui constitue une
recette, un mélange incomplet et un échec, puis les ingrédients consommés et
le résultat obtenu. Ne pas importer en bloc l'ancien catalogue de recettes
avant cette décision. Conserver les idées de nouveaux plats dans ce même suivi.
### IA-06 — Saucisson et séchoir
**Implémentation locale beta.313 :** [préparation à l’établi, quatre crochets
visibles, cinq minutes de jeu, protection de la pluie et conservation des
objets/progressions](drying-rack-beta313.md). Les modèles utilisent les
textures natives ; le fonctionnement ci-dessous décrit le cadrage initial.
Créer une préparation qui devient du saucisson après séchage dans un séchoir.
Définir la recette initiale, la durée, les conditions et les gestes de pose
et de récupération. Vérifier interruption, reprise et rechargement, avec
progression autoritaire côté serveur et résultat unique. Le séchoir et le
saucisson n'ont pas de nouvelle texture fournie dans `food/` ; leur dessin
et leur fonctionnement restent à réaliser.
### IA-07 — Poêle native et pose souple
**Refonte locale beta.310 :** [une recette commune par pile de une à quatre
poêles, pose en ligne, paiement réel, réserves natives et continuité](pan-stacks-beta310.md).
Le choix confirmé concerne les piles ; les orientations supplémentaires et
les ancrages particuliers restent ouverts.
**Port de la poêle en beta.304 locale :** [bloc entité, contenu visible, cuisson, retraits et sauvegarde](kitchen-beta304.md). La forme historique est conservée ; la refonte de pose/orientation reste ouverte.
Revoir les bugs, la pose et l'intégration de la poêle, avec la souplesse de
placement des coussins comme référence exprimée par le créateur. L'ancienne
`FryingPanBlock` étend déjà `BaseEntityBlock` et possède une
`FryingPanBlockEntity` : l'absence de bloc entité n'est donc pas un diagnostic
établi. Reproduire les défauts puis choisir le placement, l'orientation et
l'ancrage adéquats pour 26.3.
Vérifier les surfaces prévues, le contenu visible, la source de chaleur,
l'ajout/retrait d'ingrédients, la casse et le rechargement. Un ingrédient ou
plat doit toujours être récupéré une seule fois. Ne pas reprendre l'ancien
modèle et son placement comme s'ils satisfaisaient déjà cette demande.
### IA-08 — Cuisinière : four et table de fabrication
**Précision beta.309 :** [une seule sortie, sans aperçu supplémentaire,
grille manuelle et extraction des plats par entonnoir](oven-single-output-beta309.md).
**Refonte locale beta.308 :** [cuisson automatique, aperçu, paiement en fin de
cycle, annulation des modifications et poursuite avec le menu fermé](oven-beta308.md).
Le créateur a retenu le démarrage comme un four et les recettes de cuisine
uniquement. La fabrication de l'appareil garde sa table et son four.
**Port culinaire en beta.304 locale :** [grille 3 × 3, combustible, résultat temporisé et recette table + four + briques + fer](kitchen-beta304.md). Le Fourneau multibloc existant est conservé.
Reprendre la cuisinière comme un assemblage cohérent du four et de la table
de fabrication. Examiner ses usages historiques et le Fourneau multibloc
déjà présent pour éviter deux appareils redondants. Définir ensuite les
gestes et une recette plus élaborée, mais lisible dans Minecraft.
La table de fabrication et les quatre pierres évoquées sont une **piste**,
pas une recette arrêtée. Le remplacement par le Fourneau reste à décider
dans ce ticket. Aucun inventaire historique ni travail de cuisson en cours
n'est converti sans contrat explicite.
## Vérifications du premier lot
Le contrôle permanent des 343 empreintes et dimensions est intégré à
`./gradlew check` via `verifyItsAliveTextures`. Il peut aussi comparer les
fichiers originaux et le JAR construit :
```sh
python3 scripts/verify_itsalive_textures.py
python3 scripts/verify_itsalive_textures.py --jar mods/sanctuary/build/libs/sanctuary-beta.299.jar
./gradlew check build assemblePack -PsanctuaryFocusedTests=recipes,progression -PsanctuaryAtlasOnly=true
```
Import : les 343 PNG ont été décodés intégralement ; comparaison des pixels
des 38 images fournies, contrôle visuel de leur planche avant/après et
vérification des fichiers originaux réussis.
- `check build assemblePack` avec le profil ci-dessus : **réussi en 3 min 2 s**,
158 tâches, **13 GameTests serveur requis réussis** et contrôles du dépôt.
Le profil cible les recettes et la progression existantes ; il ne teste
aucune culture nouvelle, puisqu'elles ne sont pas encore enregistrées.
- JAR final : les 343 textures correspondent exactement au reçu. Comparé
au JAR beta.298, aucune classe, recette, modèle ou dépendance embarquée
ne change. Seuls les 343 PNG, la version Fabric et les crédits (dont leur
copie dans le template) diffèrent ; aucune entrée n'est supprimée.
- Template de ressources et JAR rafraîchis après finalisation des crédits ;
profils packwiz client/serveur assemblés, versions et index vérifiés.
Le JAR du pack est strictement identique au JAR contrôlé.
- SHA-256 final de `sanctuary-beta.299.jar` :
`e219b13b2e211908bfff171615ad7c3f923d4e4c2df1bf031689930f3efd489b`.
- Logs et reçu local dans `build/itsalive-beta299-build.log`,
`build/itsalive-beta299-refresh.log` et
`build/itsalive-beta299-validation.json`, hors de Git.
Aucun essai graphique en jeu n'est revendiqué pour cet import sans contenu
enregistré. Les futurs essais graphiques cibleront Vulkan exclusivement.
Aucun monde personnel n'est ouvert ou modifié, aucun format de sauvegarde
ne change. Les versions mod/pack sont alignées en **beta.299**, préparée
localement ; la dernière release publiée reste beta.298.
### IA-09 — Fromage à partager et qualité du vin
Demande du 29 octobre 2026 : fromage posable et mangeable par parts comme un
gâteau ; quatre qualités de vin. Confirmation : le jeune vin reste prêt après
trois minutes de jeu, puis table/réserve/grand cru après un/trois/sept jours
réels de garde dans le tonneau, y compris jeu fermé.
[Implémentation et contrat local beta.314](cheese-wine-beta314.md).
Même branche locale, aucune publication.
### IA-10 — Saucisson posé en tranches
Demande du 29 octobre 2026 : poser le saucisson séché et manger ses tranches,
comme le fromage. [Implémentation locale beta.315](sausage-slices-beta315.md) :
le même objet de séchage devient posable, quatre tranches rendent huit points
de nourriture au total, quatre orientations et parts sauvegardées nativement.
Même branche locale, sans publication ou installation.
File diff suppressed because it is too large Load Diff
+38
View File
@@ -0,0 +1,38 @@
# Export modifiable It's Alive — beta.315
Demande du 29 octobre 2026 : fournir toutes les textures de pousse et tout le
contenu graphique ajouté depuis le début de la refonte, puis livrer le pack.
Le script `scripts/export_itsalive_textures.py` extrait les **347 PNG Sanctuary**
ajoutés depuis le socle beta.298, y compris les quatre nouveaux stades de
vanille grimpante. Il fournit **368 images modifiables** et **696 JSON visuels**
avec les matériaux vanilla réutilisés et les fonds/sprites d'interface.
L'export local est dans `Downloads/ItsAlive-Textures-beta.315/`, avec son ZIP.
`a-modifier/` est un pack de ressources au format 97.1, prêt pour Minecraft
26.3. `originaux/`, les notices et les inventaires CSV/JSON conservent les
références et SHA-256. Aucun dessin n'est réencodé ou redimensionné.
Les matériaux partagés par les modèles Minecraft sont recopiés sous
`sanctuary:itsalive_editable/<aliment>/...`, et les modèles de cet export sont
redirigés vers ces images. Fromage, saucissons cru/séché et séchoir se modifient
ainsi séparément, sans recolorer les blocs vanilla correspondants. Toutes les
portions d'un même aliment partagent ses matériaux. Chaque qualité de vin a
également son propre PNG, même si le jeu emploie l'icône héritée du vin jeune.
Les quatre images d'interface sous `assets/minecraft/` sont une exception
signalée dans l'inventaire : les écrans natifs partagent ces fonds/sprites ;
leur modification touche aussi ces écrans vanilla. Les 343 images d'import
initial, y compris les anciennes références conservées, restent présentes.
Le script vérifie les références, dimensions, copies, empreintes et intégrité
ZIP, refuse d'écraser un export existant et n'installe/active aucun pack.
Pour tester des dessins, copier `a-modifier/` dans les packs de ressources de
l'instance choisie, l'activer au-dessus de Textures Sanctuary et recharger.
Les règles de jeu et recettes restent celles du mod.
```sh
python3.14 scripts/export_itsalive_textures.py \
--output /chemin/neuf/ItsAlive-Textures-beta.315 \
--native-jar /chemin/du/client/Minecraft-26.3.jar
```
+76
View File
@@ -0,0 +1,76 @@
# JEI-297 — Saisie dans la recherche de l’inventaire
Branche `codex/jei-search-input`, version préparée `beta.297`.
## Symptôme et cause
Cliquer dans la barre JEI donne bien le focus, mais le premier appui sur une
lettre le retire avant l’arrivée du caractère. Le texte reste vide.
Le portage SDL de Minecraft 26.3 distingue le scancode physique (`KeyEvent.key`)
du code logique dépendant du clavier (`KeyEvent.keycode`). JEI utilisait encore
le premier comme caractère pour décider si le champ devait consommer la touche.
Les scancodes A–Z valent 4–29 : le contrôle les prend pour des caractères de
commande interdits, puis le routeur abandonne le focus.
## Correctif
Le fork JEI `30.32.0-sanctuary.5` utilise le code logique pour cette décision.
L’insertion du texte reste assurée par les événements de caractères natifs ;
aucune lettre n’est fabriquée à partir du clavier physique. Les identifiants
des objets, les connaissances de recettes, les favoris et les sauvegardes ne
changent pas.
Le correctif est conservé dans `mods/jei/patches/26.3.patch` et reconstruit depuis
le commit upstream fixé. Sanctuary continue d’embarquer ce fork dans son JAR.
Le travail est isolé du dossier principal, dont les changements locaux sont conservés.
## Vérifications
La régression est reproduite sous **Vulkan** avec le fork `.4`, sur un monde plat
de développement neuf (graine `297`). Le clic, le focus et l’activation de la
saisie SDL passent ; l’appui physique sur P échoue ensuite sur l’assertion
`The physical letter key keeps JEI focused until its character arrives`.
Journal conservé dans `build/jei297-regression-before-vulkan.log`.
Les tâches `check`, `build` et `assemblePack` réussissent avec les propriétés
`sanctuaryFocusedTests=recipes,progression`, `sanctuaryAtlasOnly=true` et
`sanctuaryQuickTests=true` : contrôles purs du dépôt, **13 GameTests serveur**
et profils packwiz client/serveur assemblés. La première invocation combinée
échoue ensuite dans un contrôle client qui supposait Ctrl/Cmd+F déjà attribué.
Sans Amecs, le fork laisse ce raccourci non attribué : le test est corrigé pour
lier temporairement F, puis rétablir la liaison initiale. Le comportement des
raccourcis par défaut n’est pas modifié.
La relance cliente finale réussit, avec arrêt normal du client :
```sh
./gradlew :sanctuary:runClientGameTest \
-PsanctuaryClientTests=true -PsanctuaryJeiSearchClientTests=true \
-PsanctuaryQuickTests=true -PsanctuaryAtlasOnly=true \
-PsanctuaryFocusedTests=recipes,progression \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=2 \
-PsanctuaryClientWindowed=true --console=plain
```
Parcours réel des callbacks clavier : clic dans la barre, maintien du focus
entre la touche et son caractère, texte inséré une seule fois, filtrage des
planches connues, Retour arrière, Échap et Entrée. Les noms français et anglais
sont recherchés après un véritable rechargement des ressources, en GUI 2/3/4.
Les 26 lettres passent, dont les touches d’inventaire et de recettes E/R/U,
ainsi que majuscule accentuée, texte IME et Unicode hors BMP. Le raccourci
temporaire ne s’insère pas dans la recherche, et le chat natif garde sa saisie
après fermeture de l’inventaire. Captures FR GUI 4 et EN GUI 2 inspectées.
Journaux ignorés : `build/jei297-check-build-pack-vulkan.log` et
`build/jei297-client-vulkan.log`. Le reçu `build/jei297-artifact.json` vérifie
le seul JEI embarqué en `.5`, le code des sources effectivement distribuées
et l’identité du JAR Sanctuary entre `mods/sanctuary/build/libs` et le profil packwiz.
Artefact : `mods/sanctuary/build/libs/sanctuary-beta.297.jar`.
SHA-256 : `e01f74675b24d79e4397a27baf363bd59f240e19030ca6a37d495e1f24e1fd97`.
Le pack est préparé dans `build/packwiz`, sans export MRpack ni nouveau kit
de serveur.
Préparation locale uniquement. Aucune publication, modification de serveur
personnel ni synchronisation de l’instance Prism.
+189
View File
@@ -0,0 +1,189 @@
# DIST-280 — JEI embarqué et packwiz serveur
Branche `codex/jei-packwiz-server`, base commit `697e4a2` (beta.278).
Version réservée `beta.280` : beta.279 appartient au chantier parallèle
Map Island Zoom, dont les modifications ne sont pas reprises ici.
## Contrat
- Un seul JAR Sanctuary à distribuer, avec le fork JEI exact
`30.32.0-sanctuary.4` et ses notices/bibliothèques embarqués. Fabric API reste
une dépendance commune ; Sodium et Sound Physics restent facultatifs côté client.
- Même JAR sur client et serveur. JEI possède une initialisation commune
(recettes et transfert), ses écrans restent dans son entrée client.
- Un manifeste serveur `server/pack.toml` sur le même canal packwiz que le
client, avec uniquement Sanctuary et Fabric API. Même version, URL et hash
du JAR Sanctuary dans les deux profils. Publication atomique des manifestes
après vérification de l'artefact immuable.
- Un kit serveur local avec mise à jour packwiz sans interface et lancement
Fabric. Les mondes, configurations, permissions, listes de joueurs et secrets
restent hors de l'index. Une erreur de mise à jour empêche le démarrage.
- Documenter les paramètres existants de l'API Sanctuary Web et de la MariaDB
communautaire, sans inventer d'API ni migrer les données ou configurer un site
public implicitement. Les secrets restent dans l'environnement du service.
## Vérifications locales
`./gradlew check build assemblePack assembleServerPack
-PsanctuaryFocusedTests=recipes,progression -PsanctuaryAtlasOnly=true` réussit :
13 GameTests requis, contrôles purs du dépôt et assemblages. Le fixture ciblé
évite le harnais worldgen historique `unified`, sans modifier sa génération.
Les sept tests de l'outil de mise à jour passent séparément, y compris le
relais du signal d'arrêt et l'attente de Java avant libération du verrou.
Installation réelle avec packwiz, deux synchronisations et six fichiers
personnels témoins conservés octet par octet. Le JAR de production démarre et
s'arrête dans un monde plat de développement neuf avec le JEI imbriqué ;
celui-ci correspond au fork construit. Minecraft normalise lui-même les fichiers
`server.properties`, `ops.json` et `whitelist.json` au lancement : leurs valeurs
sont vérifiées après cet arrêt, distinctement de la préservation par packwiz.
La transition du profil client retire réellement le JEI séparé suivi par
packwiz et conserve les favoris. Les manifestes de publication client/serveur
référencent le même artefact. Aucun nouveau parcours graphique n'est revendiqué ;
les contrôles historiques Vulkan de l'interface ne sont pas rejoués ici.
Journaux et reçus ignorés : `build/jei-server-final.log`,
`build/server280-updater-final.log`, `build/server280-validation-delivery/validation.json`,
`build/client280-validation/validation.json`.
## Serveur dédié demandé le 25 octobre 2026
Le créateur demande une **nouvelle CT pour 20 joueurs** sur le nœud `gpu`.
La CT 350 `sanctuary-beta-20` est créée à cette fin : Debian 13 amd64,
6 vCPU, 8 Gio de RAM, disque 80 Gio, non privilégiée. Le budget Java retenu est
6 Gio, avec 20 places, portée 6 et simulation 4 ; ce dimensionnement n'est pas
une mesure de charge avec vingt joueurs connectés.
L'Alpha (CT 300), les CT 330 et 340 et les mondes existants restent hors cible.
Le nouveau monde utilisera `sanctuary:sanctuary` (réglages initiaux
`sanctuary:island231_medium`), graine `28020261025`, version beta.280.
Aucune expansion n'est activée par le déploiement. Le site est dans la CT 320 ;
son API et son schéma communautaire 3 sont présents.
## Livraison et mise en service
La [release beta.280](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.280)
est publiée depuis le commit `23b295356b499404e0056affbb5d3b3811c1b01f`.
Le canal packwiz est avancé au commit `338e8a62387048c7e703ef036fda759ef57b4130`,
avec les profils client et serveur dans le même commit. Aucun JEI séparé n'est
joint. Le MRpack contient le seul JAR Sanctuary en override, et trois dépendances
téléchargées (Fabric API, Sodium et Sound Physics).
| Artefact | SHA-256 |
| --- | --- |
| `sanctuary-beta.280.jar` | `489dade38218d34d2a4502fa4ffe71f0bc13035948dc1c52b633b528e9855c7e` |
| `Sanctuary-Server-beta.280.zip` | `54ed73e75b53305a9f0cc5505f3d64624d23598f906ac69d121030255ced0d5a` |
| `Sanctuary-beta.280.mrpack` | `b23ba2d9cf72d27da2595e3f4a32a36656f71abf2d2cb4d6cefd7f9d29e4cd01` |
Le kit téléchargé dans la nouvelle CT correspond à cet artefact immuable.
Java 25, Python 3.13 et le service `sanctuary-beta.service` sont installés ;
le service est activé au démarrage. Le premier monde Sanctuary a été créé à
la graine annoncée, avec le générateur 231, taille Medium, en Survie et
`online-mode=true`. La réponse réseau Minecraft annonce 26.3, protocole 777,
**20 places**, et le JEI embarqué est chargé côté serveur.
La synchronisation packwiz a été exécutée après arrêt propre du nouveau serveur :
**61 fichiers de monde, de configuration et de secrets gardent leurs hashes**.
Le même monde redémarre ensuite. L'outil maintient son verrou jusqu'à la fin
de la sauvegarde Java, y compris lorsque systemd transmet SIGTERM.
L'API du site accepte l'authentification et refuse un corps de vérification
vide avec HTTP 422 : aucun code d'habitant n'est consommé. L'accueil serveur
confirme que les codes sont requis. Un compte MariaDB propre à Beta a été créé,
restreint à son hôte et aux sept tables nécessaires, avec TLS obligatoire ;
Connector/J utilise `sslMode=verify-full`. Le schéma existant 3 n'est pas migré.
La ligne de statistiques du nouveau serveur est alimentée toutes les 30 secondes.
La console du site était non configurée. Seules ses trois variables RCON ont
été renseignées pour Beta, après sauvegarde privée ; le cache Laravel est
reconstruit sans redémarrer le site. La commande de lecture `list`, appelée
par le vrai service PHP, répond « 0 of a max of 20 ». Le port RCON est filtré
dans la CT Beta : accès du site et de loopback uniquement, refus depuis un autre
client LAN. Aucune redirection publique RCON n'est créée.
Les secrets restent dans `/etc/sanctuary/beta.env`, le `server.properties`
privé et l'environnement Web, jamais dans Git ou packwiz. Les unités
`sanctuary-beta-rcon-firewall.service` et le complément systemd associé
appartiennent à cette installation, hors de l'index de mods.
Le domaine demandé est `beta.sanctuary-minecraft.net`. Les deux enregistrements
OVH sont publiés : A pour Beta et SRV `_minecraft._tcp.beta` vers le port 25567,
TTL 300. Les quatorze enregistrements DNS préexistants sont conservés. Une
réservation DHCP lie l'adresse de la CT à sa MAC ; elle est activée après test
de syntaxe et redémarrage de dnsmasq, sans changer ses deux fichiers existants.
Aucun serveur Minecraft ou proxy existant n'est redémarré par cette opération.
Une redirection UPnP Beta seule a servi d'amorçage. Le 25 octobre, le créateur
réenregistre la règle Bbox permanente « Sanctuary beta 20 » : **port externe
25567 → 192.168.1.122:25565**. L'API de la Bbox déclare encore `protocol=all`
(TCP/UDP) ; l'accès Minecraft TCP est vérifié.
La redirection UPnP appartenant à Beta est ensuite supprimée. Son timer est
désactivé, le service est arrêté, puis les trois fichiers du maintien sont
retirés de la configuration active et archivés dans la CT sous
`/root/sanctuary-beta-maintenance/upnp-retired-20261025-1792900244/`.
Les sept autres règles NAT permanentes et les quatre autres redirections UPnP
sont conservées. Le processus Minecraft reste le même : aucun redémarrage ni
modification d'une sauvegarde n'est nécessaire à ce retrait.
Après suppression du secours, `beta.sanctuary-minecraft.net:25567` répond bien
Minecraft **26.3**, protocole **777**, **0/20**, avec le MOTD du nouveau Beta.
Le SRV public permet de saisir seulement `beta.sanctuary-minecraft.net`.
La vérification utilise le chemin public depuis le LAN (hairpin) ; une validation
depuis un réseau Internet extérieur reste à effectuer.
Le [MRpack client publié](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.280/Sanctuary-beta.280.mrpack)
est retéléchargé et vérifié : 16 589 058 octets, hash identique au fichier local,
ZIP intègre, version beta.280, Minecraft 26.3 et un seul override Sanctuary avec
JEI intégré.
Aucune charge réelle avec vingt joueurs, nouvelle connexion OAuth Discord ou
nouvelle qualification graphique n'est revendiquée.
Les sources sont isolées de Map Island Zoom. La prochaine livraison doit
reprendre ce profil serveur et utiliser un compteur supérieur à beta.280.
L'instance Prism personnelle n'a pas été synchronisée par cette mise en service.
Preuves locales supplémentaires : `build/server280-publication.log`,
`build/server280-deployment.log`, `build/server280-gpu-update-validation.log`,
`build/server280-rcon-setup.log`, `build/server280-dhcp-reservation.log`,
`build/server280-upnp-retirement.log` et
les inventaires sous `/root/beta-publication-20261025/` sur PVE. Ces fichiers
restent hors de Git.
## Raccordement Sanctuary Web corrigé le 25 octobre 2026
Le statut et l'Intendance de [Sanctuary Web](https://sanctuary-minecraft.net)
lisaient encore l'ancienne base distante par la connexion Laravel `game`, alors
que Beta écrivait déjà dans la base `sanctuary` de la CT Web 320. La vérification
initiale des écritures serveur ne couvrait donc pas toutes les lectures du site.
Hermes confirme l'identité de cette instance Web ; les anciens sites de release
ne sont pas remis en service.
La connexion `game` utilise maintenant la même base locale que Beta, en gardant
`COMMUNITY_DB_CONNECTION=game` pour les services et les ressources
d'administration. Le cache de configuration Laravel est reconstruit. Les sources
Web déployées, qui contiennent des changements préexistants, restent inchangées.
La connexion Discord fonctionne selon le créateur et n'est pas modifiée.
La nouvelle communauté ne contient aucune publication : Gazette, Tableau et
Intendance affichent désormais cet état, sans suppression dans l'ancienne base.
Les trois comptes, dont deux administrateurs, le groupe d'équipe, ses deux
adhésions et les vingt-deux permissions sont conservés. Les empreintes des
identités, des droits administrateurs et des tables d'équipe sont identiques
avant et après l'opération.
Les services publics et les requêtes d'administration Gazette/Tableau lisent
zéro publication. La page d'accueil et les deux listes publiques répondent HTTP
200. Les métriques sont fraîches, le serveur est déclaré en fonctionnement, et
son temps cumulé continue d'augmenter. Le compteur reste à zéro jour tant que
Beta n'a pas cumulé vingt-quatre heures ; les anciens décès ne sont plus affichés.
La configuration précédente est sauvegardée dans la CT Web, avec accès root
seul, sous
`/root/sanctuary-beta-maintenance/web-game-connection-20261025-1792901058/`.
Le reçu `build/sanctuary-web-beta-alignment.log` et la capture
`build/sanctuary-web-beta-after.png` restent hors de Git. Cette correction de
configuration et de documentation ne change aucun binaire beta.280 ni aucune
sauvegarde Minecraft.
+297
View File
@@ -0,0 +1,297 @@
{
"source_commit": "26f2c2a0061619df1f146f9081d6740c560a7497",
"license": "GPL-3.0-or-later",
"java": [
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/CulinaryAppliance.java",
"sha256": "aabb476edecbe0c0f7accd936853a625681b924c47b7800995dfd5da0035358c",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/CulinaryAppliance.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/CulinaryExperience.java",
"sha256": "7f658276c4918af0ffac5f4bb9682b5844f520fa70f301999ad97fa115e32367",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/CulinaryExperience.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/CulinaryHeat.java",
"sha256": "b9294332154a1110d94f5110d693109e7c6c35ad6cdb5332c1af833d0c91a2fb",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/CulinaryHeat.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/CookingCauldronBlock.java",
"sha256": "334d22224387c7da4ce28bfd0e642bb5e7adb6697ddebd884e21df5d2a84ea27",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/CookingCauldronBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/FermentationBarrelBlock.java",
"sha256": "770364f134b8c9ee04be674b1dbe38956f5fa17c91a81ca258d7ea6a8d187dc5",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/FermentationBarrelBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/FryingPanBlock.java",
"sha256": "d6ec6cbf4ab52230bcdd6a64c97ceb8a4df33f2b2d717ce7346fe3c79370cffd",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/FryingPanBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/KitchenOvenBlock.java",
"sha256": "d9cd55b9e002aab5c2d14d95d59ba46a7731a70d0bbb3d0959f1bf7e3eee1a19",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/KitchenOvenBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/AbstractCulinaryContainerBlockEntity.java",
"sha256": "25ec974def75ab1891ddcd3eb150bbacf2a2b7e1c8b2ac30081698fe7afa94d7",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/AbstractCulinaryContainerBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/AbstractTimedCulinaryBlockEntity.java",
"sha256": "99f217bc615aa414f41ffeeccc85d68655da48b794b82f8289fe86f93004c8a3",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/AbstractTimedCulinaryBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/CookingCauldronBlockEntity.java",
"sha256": "9c7f8145973f570f70e758650f99e174b5625b91e844bbcd1bf417eff1322951",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/CookingCauldronBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/FermentationBarrelBlockEntity.java",
"sha256": "feb866fca3848c80e9d06aa9fa38e9f49b8a5b22aa9c7bb5b5f4837ad4abee9a",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/FermentationBarrelBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/FryingPanBlockEntity.java",
"sha256": "af102fc1c80600208778d6d2047781b63fa2ebaae2890b71acfc6dfa2af600fe",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/FryingPanBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/block/entity/KitchenOvenBlockEntity.java",
"sha256": "0f7c3f6612dee3dbb1b264be3e8a94c55e4f129155f351ea0eb8c3a1639ac463",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/CookingCauldronHud.java",
"sha256": "ec67f5180d01e5aa51abf229d1aa35aac325c50e93c3f2386ca194f95cf2e99a",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/CookingCauldronHud.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/FermentationBarrelHud.java",
"sha256": "ada21e2c3a268aa5b6b27bf9a16ffe42aeb1e20fd4305e07900e88a1a376d5e2",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/FermentationBarrelHud.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/FryingPanHud.java",
"sha256": "e37a353fde43eba54e4e60a98aa8a6ed87a06921f4040faca92dbd694d491304",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/FryingPanHud.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/renderer/FermentationBarrelBlockEntityRenderer.java",
"sha256": "adba55ed2154e1f0243bae3bf78247dac24fa79f9cc3de7fbb6e522f700f5109",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/renderer/FermentationBarrelBlockEntityRenderer.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/renderer/FryingPanBlockEntityRenderer.java",
"sha256": "13a30fee522d9b2efda13a763198b285f555bf3d011758780d27c19d9627249d",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/renderer/FryingPanBlockEntityRenderer.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/renderer/state/FermentationBarrelRenderState.java",
"sha256": "1adc65fe528cc9ea1da8e43350f8062c4bec0bb31cf03ee54914776acd9d9647",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/renderer/state/FermentationBarrelRenderState.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/renderer/state/FryingPanRenderState.java",
"sha256": "26eb76e9d6776d34ac9abb0769315d41f5a9574bf3415c2efd16b7b2c33c1b82",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/renderer/state/FryingPanRenderState.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/screen/KitchenOvenScreen.java",
"sha256": "f619f2b95a76193e21db4e2cbed4fa64ac2848aedaed042bee4fcfac54ea5842",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/screen/KitchenOvenScreen.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/client/screen/RedstoneMillScreen.java",
"sha256": "5ebc44972d34ea18b7982592b47a02ccd01fadd550bbe616e970b80cba1f9086",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/client/screen/RedstoneMillScreen.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryBatching.java",
"sha256": "9532bf15306e21e09da4e90f19563284c0d3889f8d4382ad46e23b6daf6274a1",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/recipe/CulinaryBatching.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryPartialMatching.java",
"sha256": "8cf3e2d74e24b9d83b8e9bdb36a216ba2745e1ab07bd2cbd55fb442b1a0f2824",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/recipe/CulinaryPartialMatching.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryProcessRecipe.java",
"sha256": "57a51a52d4732fd8f7df38b02ea6bafecf3290c88f3146fe8c44892688736c11",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/recipe/CulinaryProcessRecipe.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryRecipeInput.java",
"sha256": "d733004754aa377752118d8dd965a9025daafff2174bab76678940c4cf9fd79a",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/recipe/CulinaryRecipeInput.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/culinary/recipe/CulinaryRecipeTypes.java",
"sha256": "5227e6e3314502298ccba4cad95060b83604041eb0df53aac4769de1fe4fbe3c",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/culinary/recipe/CulinaryRecipeTypes.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/machine/FoodPressBlock.java",
"sha256": "aeb6210329b66323de012616fcb8f4e360dcd990a1b930347a6fb20110c6eeda",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/machine/FoodPressBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/machine/FoodPressBlockEntity.java",
"sha256": "1d0c93c1982fa1197fe9c56fd2a8e94c2109a29b2efc3bd5d6ab1e5e22a3d34e",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/machine/FoodPressBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/machine/FoodPressContent.java",
"sha256": "2aab91dd3b96d1fd2e759cb984bea6593e99a205ee68d0c7c00912329130e9e7",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/machine/FoodPressContent.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/machine/RedstoneMillBlock.java",
"sha256": "8dbd9e15609b4c07a27af0997b5c2e15f7bce49e32eedf3cc3e266f9685c09ef",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/machine/RedstoneMillBlock.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/machine/RedstoneMillBlockEntity.java",
"sha256": "31c750f9727430d00a80e1a65558ecc0471300bed5f9fbd4716a500d5d2274aa",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/machine/RedstoneMillBlockEntity.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/menu/KitchenOvenMenu.java",
"sha256": "4f222eb436ea88785e82c927682588530b44db7b5f86dca341c8cfb88ddd19ba",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/menu/RedstoneMillMenu.java",
"sha256": "7ca7c4d77c48121f9c81fecacf9b09f14964e7ac33a65d0c0688852a73425a2a",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/menu/RedstoneMillMenu.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/recipe/FoodPressingRecipe.java",
"sha256": "fbc8cf4b452e54662c4fc469aa16e14880f86110339d9388b5dba27469ba5c5d",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/recipe/FoodPressingRecipe.java"
},
{
"source": "src/main/java/fr/koka99cab/sanctuary26/itsalive/recipe/RedstoneMillingRecipe.java",
"sha256": "a0d011d89f46f38e8fa384299f73a7cab44fd3189600e041fb9aa20ea2ff612d",
"destination": "mods/sanctuary/src/main/java/fr/koka/sanctuary/cuisine/recipe/RedstoneMillingRecipe.java"
}
],
"assets": {
"src/main/resources/assets/itsalive/blockstates/olive_block.json": "998c5fa53bb09b44ce0cff864ca0a2ea7717b79efbd08637d820449a99e7ed69",
"src/main/resources/assets/itsalive/blockstates/food_press.json": "1f15baab1f3b678b2e3650b9c6af4bcc3404b9af0a3ade61eaf3a66049469f91",
"src/main/resources/assets/itsalive/blockstates/grape_block.json": "ed05b5c4e237b61ca0716a90bd7c57bcfa60aa2e40230481d86345862dd03622",
"src/main/resources/assets/itsalive/blockstates/fermentation_barrel.json": "47db1631c9bad0b690f04e7cd78f1c1d219ad1a2c4aff7d535dea8c6ae7e06a1",
"src/main/resources/assets/itsalive/blockstates/cooking_cauldron.json": "c79479d63942c3ae6ad360996c0e3e020575565dbc69c6e5c7f110c7225535a5",
"src/main/resources/assets/itsalive/blockstates/frying_pan.json": "c2de84cf795042a16faad51e61d4afe900571227cd0585624e8a994d2deaffdf",
"src/main/resources/assets/itsalive/blockstates/redstone_mill.json": "9cf9223ea7fb6fa2fa8df8a3fec63a60cc5849425b32ab3aa97c08b5a106eeb0",
"src/main/resources/assets/itsalive/blockstates/kitchen_oven.json": "d9ef62ee1e5fa7abec636166528628fc265de2241a0f3234e919b2bea5bbe0a8",
"src/main/resources/assets/itsalive/blockstates/tomato_block.json": "2acb0a87767691a0247788bdbfd744d7d06c03bf817e4dcaea48d6f86e3a6f6d",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_7.json": "773e1389d1dfd67e9bfa1eb0dc21052e126aeb3bee29a7ec4be886867b95e17f",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_3.json": "b7becfd2e2691d6b36d2a3cf2a315c96fa6db87709e0d2741e535da17f10051e",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_7.json": "3eac8754b3426624da4be9f67d201619231491702611a2f037490c8b48a18e6d",
"src/main/resources/assets/itsalive/models/block/olive_block.json": "de9fa7bb7246ff9aec219f9ab9de43a219c9d6ee684bfc7fae66f6038c3fb983",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_6.json": "5d864c423dd19ac779634899650c53562a22bb1ab175b93c28c8987329a22660",
"src/main/resources/assets/itsalive/models/block/food_press.json": "615b598729b5462a7e4cc654f79ebce901b6d4e82d89b1895b03945f30ca2d35",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_2.json": "23d6ec4aa8e21eb63561b8132d441fb76a5f6dce152a3ee5ce2289c077d4023f",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive.json": "b8df7bb819163a91ab6f7911743126c1583f8aa453b0b396cd6f6ce2abd3b668",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_6.json": "869b096b5ae751bb6020ed3ef42ff998b28f79d8f44fac0a05c40561db57b4a5",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_5.json": "0b803d06608cfa324bb6e35ac301a59ec86b701e96f2fff9a585835924ddc0e4",
"src/main/resources/assets/itsalive/models/block/grape_block.json": "195114f18de907448c9797aa539c4c5792c48efd17fff0f0a2779358eafcee73",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_1.json": "9376fecd6122b37ff4c6aebfe09ed798326fa932a9c28f41b83cc6dd28d0b89a",
"src/main/resources/assets/itsalive/models/block/redstone_mill_on.json": "50009556a95a7db5bdce15622208a2931ed4a2a6e1fd3457c0be2754b495b78c",
"src/main/resources/assets/itsalive/models/block/fermentation_barrel.json": "0ccb53d3f86eb2b7b4932e29149a5e210b54324c07c517c0aa79d73e6417a8dd",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_1.json": "7c5d3b41782ad57688a1209e83d15e58d145980423acc44d93e29baec0c3a961",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_9.json": "dfbbc138ee4c0851acc220ab7c1fc63498b12e39f1eb3a75c3c2d2b582b1574d",
"src/main/resources/assets/itsalive/models/block/kitchen_oven_on.json": "326567713bae7ed35dad107838b81b1e2b00b9a3a67a644782eb0a1323d2fa1e",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_8.json": "ee4b305779c34e5743728ef78dd964d3aa8302526a2bbb4ffe05c6efaa29c8f5",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_4.json": "e7f95e5ab13f1b98c18fbd2563925bc9c9adbd793d129c7752fe5d2b66c2a33c",
"src/main/resources/assets/itsalive/models/block/cooking_cauldron.json": "f9fcfdbb09a63ee6437b5494009a3d3f727291cf356f502a1e8a5aa30f972968",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_3.json": "7fd398a8089e5fa5f7d0b12f2799c6e960d03abefd6e186d5ff7f11e7f50a3f6",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_7.json": "c1042823e4fa94c5635e12f446a6bf7eb48541edce0bfd1661aa441a46d74c23",
"src/main/resources/assets/itsalive/models/block/frying_pan.json": "9f9b5b1c7ae19b350e1d4c8f973b9987c8efb0a0f218fcf31d6d035957e1d88c",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_3.json": "eb3189f1fa68a3f9cda9f801c83ec55fc1c7a81c4369c139e1218e88d38b62dd",
"src/main/resources/assets/itsalive/models/block/redstone_mill.json": "3d0be0d018982089aa3b9214abd1cc2c1b89ccc6f021f5eef57560feb1cc9a0f",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_2.json": "7cfe14676d665c671cebc443d4d5e17db441526ff76db1a2740abdebe77259a4",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape.json": "e5b07ea4d0c7c0303c2a38bae068a1dff16293df894a59d09b3cf57fdbe434a7",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_6.json": "8d6019eb3a441d91a34e6ceeb6e7d482431e48f6d42536b015fc42281e1f6764",
"src/main/resources/assets/itsalive/models/block/kitchen_oven.json": "e9b8327dd6022313935edee4c8daa1af0a0071c7d8436f96fa94c46de9eee14d",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_2.json": "7db27db21ebedce3f5cf5a3801ec9ecb908ca590a3e23e2375243e8195988c95",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_9.json": "a29d412b4e576d37962194aa61b1d676399741500d9e29d171536ef352cc2079",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_5.json": "d2627140a4f52fdc59e7773e0b5f524ed91e141b7026805a78f21009fbff73ed",
"src/main/resources/assets/itsalive/models/block/cooking_cauldron_coffee.json": "818a1e10296a651845621cf9c44647fe5fac1b37ba358c88dde445714dc98119",
"src/main/resources/assets/itsalive/models/block/tomato_block.json": "bec799c63bd80b6c69a3ddff317d688c717fb89cb25d43783194f9f2426ff2d3",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_5.json": "953f2e19c4997927d524aa5e768fd02b36170baa43ffa52572a889fefe431417",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato_1.json": "3a6f5d0cf5747a3441ed8171ea845240bd272f46a1ffe634a2058699b1d661aa",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_9.json": "767e70ea72263ffbb6f1812cf84ec90bcd2001254e5ae3e88c2280fd9fdef62d",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_8.json": "9d1d33f89591e75353fcbb083164328e0961c2d97f678724813d3e5015334397",
"src/main/resources/assets/itsalive/models/block/food_press_fill_tomato.json": "a590f64f1042ca751cd81717cc184d53a761c5daf2667004b1a0a6d8e0bc5b21",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_4.json": "5730a951afc7bf294a082908e9cdb6617c48159fed64d2d79f400cf65c9769a9",
"src/main/resources/assets/itsalive/models/block/food_press_fill_grape_4.json": "140e7b9e9703c56f897a469e70e6c082ce5697e0c1a13210184c2980e8e0d325",
"src/main/resources/assets/itsalive/models/block/food_press_fill_olive_8.json": "a751e6738d5a4ae00f2a9c7b9d0035ecf6bb5c989a1733e5fc3471ba742330dc",
"src/main/resources/assets/itsalive/models/item/olive_block.json": "84b2fad0a5e2ce33e1798786a79a436246a75836acd98828e52f1bd393193314",
"src/main/resources/assets/itsalive/models/item/food_press.json": "a4a57208fd428939b7b3d042335dcec6c45f8e9de190c9cabd8bbc831a011ce1",
"src/main/resources/assets/itsalive/models/item/grape_block.json": "92d78de7a02a42fbe015e7aee1338052ff29701d37fe6c7906d6de611c4508f1",
"src/main/resources/assets/itsalive/models/item/fermentation_barrel.json": "c9e3db73daee99a2a3efca454541e8dd5f2f6d9e1c40b3d0eb5f222914082533",
"src/main/resources/assets/itsalive/models/item/frying_pan.json": "5477410d6dd022b72ea0ebe7306dd0bf86ba6bf6357bec67ec265c654801d3d8",
"src/main/resources/assets/itsalive/models/item/redstone_mill.json": "b19fb1874697283774f774ca1cb57c817a55ce55b6ae3ed032d61d2b949e6151",
"src/main/resources/assets/itsalive/models/item/kitchen_oven.json": "f9dd37260005e466276b4c9002b8093f8446df854369bb7b0310417ad50881ed",
"src/main/resources/assets/itsalive/models/item/tomato_block.json": "5956b5a5a866fade827ad6088dda8cd6db341d702896cea1c425809abe424c9b",
"src/main/resources/assets/itsalive/items/olive_block.json": "a88c83d92ff0b115dc6bd8c37fb1a46a93d1722520989c62b39f3809279f9987",
"src/main/resources/assets/itsalive/items/food_press.json": "5fcd04addfe5cf076340f639c78cf63c77bc04988357328dd2877695b09f89dc",
"src/main/resources/assets/itsalive/items/grape_block.json": "068e0859a395f620d10ae8df4c42871ffe0e70b94d2a383adb61d717843edbb1",
"src/main/resources/assets/itsalive/items/fermentation_barrel.json": "dcc8d9be395cb93c4545481e675f8159e48facca2eccdc8f34de6a012e5ff719",
"src/main/resources/assets/itsalive/items/frying_pan.json": "de51f0130cb1107c4d57db273ba581519ed35fef1c911f80793746cac2b11717",
"src/main/resources/assets/itsalive/items/redstone_mill.json": "3c22f1b4e085d4c0742caae943a8cbf90ce6b5523cb27bcf346ca262a8726f6b",
"src/main/resources/assets/itsalive/items/kitchen_oven.json": "a20e4385c41fcc3045fcc4ce11d4749980860a5221458df2ca550e7535169610",
"src/main/resources/assets/itsalive/items/tomato_block.json": "bd7e4e2e8cf433d5bf6180134ae81539f1ee72f75f7f60b373cae98e37f9b839",
"src/main/resources/assets/itsalive/items/failed_dish.json": "f0331dab307785acc01ce34922ef0e8bc6751245f356c9d19f1442908894ae72",
"src/main/resources/assets/itsalive/models/item/failed_dish.json": "9ea5d1fa8a9de8b94fdc14436b0dd33da34a0051672aa42f759f091b3f6075e3"
},
"recipes": "scripts/data/cuisine.json; scripts/data/kitchen-crafting.json",
"crafting": {
"src/main/resources/data/itsalive/recipe/fermentation_barrel.json": "bce931d76ef4c465c757f16ad7ee0db71838a77b39d3540cec327b7bfd72cde9",
"src/main/resources/data/itsalive/recipe/food_press.json": "431bbd78c482085ebde27a5501db97d4c999bf6b91524fba22793e9f4085caa3",
"src/main/resources/data/itsalive/recipe/frying_pan.json": "e99e9a0b514642897fa8e82f12847fca618350d86359fd8786c6f1561c772cac",
"src/main/resources/data/itsalive/recipe/grape_block.json": "625b20deab5f4debfa1c08febf5f752e705ee015f2c796accf95e21945b0b89b",
"src/main/resources/data/itsalive/recipe/grapes_from_block.json": "870393e4a147f99440cf2742c8cd852b403caac85dcd9ac4bfef1ccbbfddec6c",
"src/main/resources/data/itsalive/recipe/kitchen_oven.json": "9f2ccb182f907f2d0932fb53b21226afb9c61faf280089703b6a04b6fe66f3be",
"src/main/resources/data/itsalive/recipe/olive_block.json": "35a5c6f87f4483837242598c58367d986c475f8fa44d6bca513383e4b58ee60c",
"src/main/resources/data/itsalive/recipe/olives_from_block.json": "23d7c22b40bda59e717b98254cfbf73c32c1cb8e03f9a605235c680b061122d0",
"src/main/resources/data/itsalive/recipe/redstone_mill.json": "cedd2025ff9961084f1e0818c2d45b4696e6c0108fda25847b07df8fc62a9425",
"src/main/resources/data/itsalive/recipe/tomato_block.json": "994e0f68beb5ea3b8811912d3eef46a6b7f0a7dc48af2e05c2a33e4fb87fe598",
"src/main/resources/data/itsalive/recipe/tomatoes_from_block.json": "eb7fa7e229187b4439e88f1e95f143ed999533f00415db06768f537c1f01e5ee"
},
"adaptations": [
"namespace sanctuary; Minecraft 26.3 APIs and exact cooking-fuel components",
"native cauldron liquid accounting; ingredient containers; timed fermentation",
"JEI six physical categories; native cauldron item icon added",
"equipment crafts: iron/copper replace unavailable silver; oven uses iron/bricks/crafting table/furnace"
],
"verification": {
"version": "beta.304",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.304.jar",
"sha256": "d24bac38e1177d785cd23a0ebe702c20e6a36dda160a0b4f366d23e9e7f4fa09",
"generated_json": {
"cuisine": 432,
"kitchen": 172,
"agriculture": 376
},
"culinary_classes": 43,
"server_required": 72,
"kitchen_scenarios": 17,
"physical_recipes": 80,
"device_blueprints": 91,
"client_vulkan": {
"kitchen": "build/kitchen304-client.log",
"cuisine": "build/kitchen304-cuisine303-client.log",
"agriculture": "build/kitchen304-agriculture300-client.log"
}
}
}
+190
View File
@@ -0,0 +1,190 @@
# IA-04 / IA-05 / IA-07 / IA-08 — appareils culinaires, beta.304 locale
Précision locale beta.311 : le chaudron attend désormais un geste au bâton et
ne produit plus de plat raté. Voir [fonctionnement et continuité](cauldron-beta311.md).
Précision locale beta.310 : la poêle se pose désormais en piles de une à
quatre, avec une recette commune et les ingrédients de chaque portion. Voir
[comportement actuel et continuité](pan-stacks-beta310.md). Le reçu ci-dessous
décrit les vérifications historiques de beta.304.
> Étape historique : [beta.305 remplace la presse par le piétinement et les
> pistons directement sur les fruits](crushing-beta305.md), puis
> [beta.306 rend le moulin manuel, sans combustible](mill-beta306.md).
> [beta.308 précise le cycle de la cuisinière et sépare aperçu et plats cuits](oven-beta308.md).
> Cette page conserve le résultat vérifié de beta.304.
Préparation du 28 octobre 2026 sur **`codex/itsalive-26-3`**, après beta.303.
Le créateur a choisi de porter **recettes et appareils culinaires ensemble**.
Aucune publication, installation, mise à jour de canal, de Prism ou de serveur.
Le checkout historique 26.2 reste une référence en lecture seule.
## Résultat jouable
Les six appareils sont enregistrés pour Minecraft **26.3**, Fabric API
**0.160.5+26.3**. Ils utilisent les textures déjà importées, des inventaires
serveur, les sauvegardes natives, les comparateurs et les entonnoirs.
Aucun onglet créatif supplémentaire : les dix nouvelles entrées d'objets
rejoignent **Nourriture et boissons**. Les semences restent dans Naturel.
| Appareil | Geste et fonctionnement | Recettes physiques |
| --- | --- | ---: |
| Poêle | Poser, ajouter un ingrédient par clic ; Maj + clic pour retirer le plat ou le dernier ingrédient. Contenu visible dans le bloc entité. Chauffe par dessous. | 26 |
| Chaudron | Jeter un aliment reconnu dans un chaudron vanilla rempli d'eau pour commencer ; ajouter ensuite par clic ou jet. Clic pour récupérer. | 19 |
| Cuisinière / four de cuisine | Ouvrir la grille 3 × 3, disposer les ingrédients sans forme, ajouter du combustible et attendre le résultat. | 13 |
| Tonneau de fermentation | Ajouter par clic, retirer à main vide. Délai historique conservé et affiché ; le temps du monde continue de compter lorsque le chunk est déchargé. | 10 |
| Moulin à redstone | Interface entrée / combustible / sortie, durées historiques ; le combustible suit les composants natifs du four 26.3. | 9 |
| Pressoir | Compacter neuf fruits, placer le bloc contre le pressoir et pousser avec un piston horizontal alimenté, depuis l'un des quatre côtés. Récupérer les portions avec le bon récipient. | 3 |
| **Total** | Catégories dédiées dans JEI, avec ingrédients, résultat et durée pour les procédés temporisés. | **80** |
La poêle est un bloc entité bas qui peut être posé sur les surfaces usuelles,
sans condition d'ancrage supplémentaire. Ce port conserve sa forme historique ;
il n'ajoute pas une pose murale, une orientation libre ou un nouveau modèle de
poignée. Ces améliorations éventuelles de IA-07 restent ouvertes.
Poêle et chaudron laissent **30 secondes de chauffe** pour assembler un mélange.
Une poêle avec quatre positions d'ingrédients distinctes peut commencer après
3 secondes de stabilité. Un gros tas d'œufs ne compte pas comme quatre
positions : le joueur peut encore ajouter du lait pour une omelette.
Sans chaleur, le délai d'assemblage et la cuisson sont suspendus.
Un mélange invalide à l'échéance donne un **plat raté**, en consommant une unité
de chaque ingrédient présent et en conservant ses récipients.
Les sources de chaleur sont le feu, la lave, un feu de camp allumé, un four
vanilla allumé ou une cuisinière allumée. Une lampe de redstone ou une propriété
`lit` quelconque ne suffit pas. Le moulin brûle du combustible ; son nom
historique ne signifie pas qu'un signal redstone remplace ce combustible.
## Eau, portions et récipients
Le chaudron conserve séparément ses **1 à 3 niveaux d'eau vanilla**. Ils servent
aux recettes comme le café, sans créer de bouteilles. Un niveau paie une dose
d'eau ; trois niveaux et trois cafés moulus donnent trois cafés. Les recettes
sont traitées en lots limités par les ingrédients et la place en sortie.
Récupérer le dernier plat ou annuler le mélange rétablit le chaudron vanilla,
avec exactement l'eau restante. Les potions à effets et les objets étrangers
ne sont pas des ingrédients admis.
Les bouteilles et seaux réellement utilisés sont rendus par la transformation.
L'ananas rend sa couronne. Les mélanges ratés rendent aussi ces récipients.
Les retours du chaudron sont éjectés avec une courte protection contre leur
réabsorption. Le pressoir donne neuf portions par bloc : bol pour la pulpe de
tomate, bouteille pour le moût de raisin et l'huile d'olive. Une portion
conditionnée conserve le récipient payé dans son composant natif de retour.
Une recette qui consomme cette portion rend ce même récipient.
Pour automatiser le pressoir, placer un inventaire/entonnoir dessous et fournir
les récipients correspondants par dessus. Seules les portions conditionnées
sortent par le bas ; un réservoir plein préserve le bloc de fruits devant lui.
Poêle, chaudron et tonneau acceptent les ingrédients par dessus/côtés et sortent
les résultats par dessous. Cuisinière et moulin prennent leur combustible par
les côtés et les ingrédients par dessus. Les récipients restés dans leurs
cases sont récupérables dans l'interface ou en vidant l'appareil.
## Recettes et continuité avec beta.303
Les **92 recettes historiques** restent couvertes. Les 46 préparations crues
et les identifiants d'objets déjà ajoutés restent utilisables au four/fumoir.
Les alternatives manuelles de cuisson et de mouture sont conservées.
Les dix identifiants `sanctuary:ferment_*` désignent désormais les procédés du
tonneau : leur ancienne fabrication instantanée disparaît. Les trois
`sanctuary:press_*` deviennent des recettes physiques de pressoir ; neuf fruits
se compactent en bloc, et ce bloc peut aussi se décompacter à la table. Il n'y
a plus deux résultats concurrents pour la même grille de neuf fruits.
Les 67 autres procédés physiques portent le préfixe `sanctuary:physical_*`.
Onze recettes donnent les cinq appareils fabriqués, les trois blocs de fruits
et leurs trois décompactages. Le chaudron de cuisine commence depuis le bloc
vanilla et rend un chaudron vanilla à la casse. La cuisinière coûte **trois
lingots de fer, quatre blocs de briques, une table de fabrication et un four** :
```text
Fer Fer Fer
Briques Table Briques
Briques Four Briques
```
Le pressoir utilise du fer à la place de l'ancien argent indisponible ; le
moulin utilise du cuivre à sa place. Les noms et aides d'interface sont FR/EN.
La pâte d'olive historique sans recette n'est pas ajoutée comme objet orphelin.
Les cultures enseignent également les recettes d'appareils et les procédés
physiques dans la progression et JEI. Les nouvelles entités sont additives ;
aucun identifiant agricole n'est renommé, aucun monde existant n'est modifié,
aucune génération n'est activée et aucune sauvegarde 26.2 n'est convertie.
Le saucisson, le séchoir, les nouvelles recettes inventées et la génération
naturelle restent dans leurs tickets. La cuisinière possède une grille de
recettes culinaires ; le Fourneau multibloc existant garde ses propres usages.
## Provenance et vérifications
Le port adapte **36 fichiers Java** de `26.2/itsalive`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, GPL-3.0-or-later.
[Reçu des sources](kitchen-beta304-sources.json), modèles historiques dans
`scripts/data/kitchen-assets.json`, recettes d'équipement adaptées dans
`scripts/data/kitchen-crafting.json`. Les 92 recettes originales et leurs
empreintes restent dans `scripts/data/cuisine.json`.
Les adaptations 26.3 concernent notamment les codecs de templates d'objets,
les combustibles à composants, les menus, le rendu de blocs entités, la
synchronisation Fabric des recettes et les six catégories JEI. Aucun PNG
agricole ou culinaire n'est retouché.
`check build assemblePack` passe en **2 min 51 s**, avec **72 tests serveur
requis réussis**, dont **17 scénarios pour les appareils**. Ils chargent les
80 recettes, font réellement cuire les 58 procédés chauds et tourner les neuf
recettes du moulin, vérifient le délai de fermentation et son rechargement,
l'eau vanilla, les récipients, les mélanges ratés, les quatre côtés du pressoir,
la capacité de sortie, le conditionnement, les 11 fabrications et la découverte
des 91 plans d'appareils/procédés. La casse répétée rend une seule fois les
inventaires des six appareils. Les régressions cuisine, cultures, vanille et
progression sont incluses.
Le parcours **Vulkan avec Sodium 0.9.2** passe en **1 min 8 s**. Il vérifie un
vrai paquet d'insertion dans la poêle, les ticks de cuisson, les contenus
synchronisés, les **233 états de blocs et dix modèles d'objets**, les menus
FR/EN aux échelles GUI 2/3/4 et les **six catégories / 80 recettes dans JEI**.
Une fermeture/réouverture réelle conserve les six appareils et leurs contenus,
y compris le délai du tonneau ; le vin se termine une fois après le temps
requis. Les échecs graphiques repérés pendant le port — icône de marmite,
libellé et références des sprites de moulin — sont corrigés.
La régression cuisine Vulkan passe en **37 s** : les 196 étapes du catalogue
restent indexées dans JEI, avec l'eau correcte ; 129 objets, table, fumoir et
rechargement sont vérifiés. La régression agricole Vulkan passe en **32 s** :
313 états, 48 objets, 20 cultures, les arbres et le caféier, onglets FR/EN
GUI 2/3/4 et rechargement réel de 173 états agricoles.
Le JAR contient les **432 JSON de cuisine**, **172 JSON d'appareils** et
**376 JSON agricoles** générés, identiques aux générateurs, ainsi que les
43 classes culinaires et les notices courantes. Les **343 PNG importés**
restent identiques, dont les 38 fichiers fournis ; les 13 PNG de vanille sont
toujours en 16 × 16. Les copies du JAR packwiz client et serveur sont
identiques au binaire vérifié. Le template conserve les mêmes textures
culinaires/agricoles/vanille et notices.
SHA-256 de `sanctuary-beta.304.jar` :
```text
d24bac38e1177d785cd23a0ebe702c20e6a36dda160a0b4f366d23e9e7f4fa09
```
Journaux et reçu de vérification dans `build/kitchen304-*`. Les captures du
dernier parcours restent dans le dossier de test client ignoré.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=kitchen304,cuisine303,vanilla301,agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryKitchen304ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=kitchen304,cuisine303 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Les tests client utilisent un monde de développement neuf, graine **304**.
La validation graphique cible uniquement Vulkan. Les tests des longues durées
avancent explicitement l'horloge de leur monde de test ; ils ne prétendent pas
avoir attendu plusieurs jours de jeu en temps réel.
+29
View File
@@ -0,0 +1,29 @@
{
"version": "beta.318",
"instance": "/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1",
"profile": "/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1/sanctuary-local-packs/beta.318",
"source_commit": "980544e27947b490684fb9dd1b0cb9a1eac4e3b1",
"jar_sha256": "5b8d6fff72c3128ceac085a9d71b493bbda13a0dbbe42ffdd3e8dc2fda3a632b",
"isolated_passes": 2,
"personal_passes": 2,
"passes_identical": true,
"protected_files_unchanged": 1018,
"optional_choices_preserved": true,
"launcher_changes": "Only the two PreLaunchCommand URL arguments; all other settings preserved.",
"installer_unchanged": "9e2912fdd05e5c23721acd58cd5c61bbf13061e453627e8f4df9a4c53f7aa875",
"bootstrap_unchanged": "a8fbb24dc604278e97f4688e82d3d91a318b98efc08d5dbfcbcbcab6443d116c",
"backup": {
"instance": "/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1",
"backup": "/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1/sanctuary-backups/before-local-beta318-20261030T053736Z",
"protected_files": 1018,
"backup_sha256": "56158b90e8b6b8ec9040129b1ee8077b0764f73aed1e7ba6afe946294b7f9327",
"backup_bytes": 272635407
},
"personal_world_opened": false,
"published": false,
"public_channel_modified": false,
"remote_server_modified": false,
"web_modified": false,
"date": "2026-10-30",
"verification": "Actual packwiz installer, two isolated passes then two personal passes; no game or personal world launched."
}
+78
View File
@@ -0,0 +1,78 @@
# beta.318 — installation locale pour les essais
Installation du **30 octobre 2026**, même branche `codex/itsalive-26-3`.
La demande autorise l’instance locale et exclut toute publication.
## Installation vérifiée
L’instance Prism existante **Sanctuary Beta**, dossier historique
`Sanctuary-0.1.0-alpha.1`, passe de beta.315 à **beta.318**. Aucune nouvelle
instance n’est créée ou importée. Un seul JAR Sanctuary parmi les neuf mods ;
les huit autres JAR, les choix des mods facultatifs, Minecraft 26.3, Fabric
0.19.5, Java, l’installateur au logo et le lien FFmpeg sont conservés.
Le JAR installé correspond exactement au binaire de
[la préparation beta.318](dried-cuisine-beta318.md), source `980544e27947b490684fb9dd1b0cb9a1eac4e3b1` :
```text
5b8d6fff72c3128ceac085a9d71b493bbda13a0dbbe42ffdd3e8dc2fda3a632b
```
Cette préparation avait réussi 189 tests serveur et le parcours Vulkan/Sodium.
La présente installation vérifie les fichiers et la commande de pré-lancement ;
aucun jeu ni monde personnel n’est ouvert pour la prouver. Pour essayer les
nouvelles recettes et les coups épicés, lancer **Sanctuary Beta dans Prism en solo**.
Les appareils restent autoritaires côté serveur ; aucun serveur distant n’est mis à jour.
## Profil de test local
Un profil autonome est conservé dans le dossier de l’instance :
```text
sanctuary-local-packs/beta.318/pack.toml
```
Il contient le manifeste, l’index vérifié, les métadonnées inchangées des
huit dépendances et le JAR Sanctuary local. Le vrai installateur packwiz lit
ce profil depuis le disque ; aucun serveur HTTP ni accès au worktree n’est
nécessaire au lancement. Le JAR est une entrée directe de l’index local.
Seuls les deux arguments d’URL `PreLaunchCommand` de `instance.cfg` sont
remplacés par le chemin cité `"$INST_DIR/sanctuary-local-packs/beta.318/pack.toml"`.
Le bootstrap, `--bootstrap-no-update`, les autres arguments et toutes les
lignes de configuration restent inchangés. Les lancements restent donc sur
beta.318 pour ces essais, au lieu de reprendre la version du canal public.
La commande publique d’origine est sauvegardée ; son retour sera effectué
lors d’une mise à jour publique compatible demandée.
## Sauvegarde et contrôles
Sauvegarde complète, hors de `mods/`, avant toute modification :
```text
/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1/sanctuary-backups/before-local-beta318-20261030T053736Z/instance.tar.gz
```
Archive de **272635407 octets**, SHA-256 :
```text
56158b90e8b6b8ec9040129b1ee8077b0764f73aed1e7ba6afe946294b7f9327
```
Le véritable installateur réussit **deux passages dans une copie isolée**,
puis **deux dans l’instance personnelle**. Le second passage est à jour,
les neuf JAR gardent leurs hashes et aucun doublon Sanctuary ne reste.
**1018 fichiers personnels** sont contrôlés identiques avant/après : sauvegardes,
réglages, captures, favoris, packs et dépendances. Les métadonnées Minecraft/Fabric,
les préférences des mods facultatifs et les outils de lancement restent identiques.
Aucune régénération, conversion ou ouverture de monde.
Aucun push, tag, release, canal public, site, serveur Beta ou autre instance
n’est modifié. Les journaux privés sont dans `build/local318/` ; les scripts
ponctuels y sont un historique de cette intervention, pas une procédure à rejouer.
[Reçu de vérification](local-beta318-verification.json).
## Livraison publique ultérieure
La beta.318 est publiée le 30 octobre 2026. Le serveur et le site sont à jour,
et Prism a retrouvé le canal public. [Reçu de livraison](release-beta318.md).
+126
View File
@@ -0,0 +1,126 @@
# MAP-279 — Carte des îles et grand dézoom
Branche `codex/map-islands-zoom`, base beta.278 ; livraison locale beta.279,
Minecraft 26.3, demande du 25 octobre 2026.
## Résultat
La limite de zoom liée à une fenêtre de 1 024 blocs disparaît. La molette et
les boutons permettent de passer du détail des blocs à une vue de plusieurs
îles, puis à une emprise de 67 108 864 blocs, suffisante pour cadrer le monde.
Le dézoom reste centré sous le pointeur ; les boutons gardent le centre de la
vue. Les zones découvertes éloignées sont affichées ensemble ; les zones non
relevées restent inconnues. Le centre de la carte peut rester fixe pendant que
le joueur se déplace et reçoit de nouveaux chunks.
Le message « Carte pleine : nouveaux relevés suspendus » provenait du plafond
de 16 384 chunks par couche et habitant. Il passe à **131 072**, sans éviction
des découvertes. Une carte ayant atteint l'ancien plafond reprend ses relevés
lorsque les chunks sont de nouveau reçus ou revisités. Les parcours non
conservés avant ce correctif ne peuvent pas être reconstitués automatiquement.
Cette capacité reste bornée ; ce lot ne promet pas une exploration illimitée.
## Rendu et serveur
La texture reste de 1 024 × 1 024 pixels. Seize niveaux de réduction regroupent
les couleurs par carrés de 2, 4, 8… jusqu'à 65 536 blocs de côté par texel.
Le niveau demandé dépend de la fenêtre et du zoom ; le serveur ne transmet
que les tuiles de ce niveau dans le viewport, par lots de 64 maximum.
Les caches réduits sont calculés à partir des seuls relevés personnels,
à la demande, et invalidés par les changements de terrain. Les couleurs de
terrain sont privilégiées sur le vide relevé pour garder les petits îlots.
Ce choix accentue les très petites zones et n'est pas une mesure de leur aire.
Les six couches d'altitude restent distinctes. Les positions des joueurs et
les marqueurs utilisent la même emprise étendue. La vue opérateur réduit
uniquement les chunks déjà chargés, échantillonnés à son budget existant de
quatre chunks par tick ; elle reste séparée des relevés personnels.
Les permissions, jetons, dimensions et cadences de requête restent contrôlés.
L'aperçu Pause conserve son échelle proche et bénéficie de la capacité accrue.
Les contours des propriétés, Demeure et le clic droit sur un chunk restent
accessibles au niveau détaillé ; la vue d'ensemble indique en FR/EN qu'il faut
zoomer pour les retrouver. La grille s'efface lorsque ses lignes seraient
espacées de moins de huit pixels. L'échelle affiche les blocs par pixel au
lieu d'un multiplicateur arrondi à zéro.
## Persistance et compatibilité
Les fichiers `data/sanctuary-atlas/<UUID>.json` et leurs six couches gardent
le schéma 2, les mêmes coordonnées, couleurs, propriétaires et graines.
Les lecteurs historiques de schéma 1 restent identiques. Aucun niveau réduit
n'est écrit dans les sauvegardes. La limite de taille acceptée passe de 12 à
64 Mio par fichier pour accueillir le plafond élargi ; les écritures atomiques
et le refus d'écraser un fichier modifié extérieurement sont conservés.
Aucun changement de génération, chunk, identifiant ou expansion.
Le protocole `sanctuary:atlas_request` ajoute le niveau de détail : mettre à
jour client et serveur ensemble. Un retour vers beta.278 exige la copie
antérieure des relevés dès qu'une couche a dépassé 16 384 chunks : l'ancien
lecteur refuse un tel fichier. Aucune sauvegarde personnelle ni instance de
jeu n'est ouverte ou modifiée par ce ticket.
## Vérification
Les contrôles purs couvrent les seize réductions, les coordonnées négatives,
le bord du monde, la conservation d'un petit îlot, l'invalidation après une
construction, les zones inconnues, les bornes des requêtes et les marqueurs
lointains. Le schéma 2 est sauvegardé puis relu avec 17 000 chunks ; le plafond
courant est aussi atteint sans éviction.
Commandes de validation :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=map244,map,claims273,claims277,waystones239 \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryMap279ClientTests=true -PsanctuaryClientGraphicsBackend=vulkan \
-PsanctuaryClientHeapGb=8 -PsanctuaryClientNoVsync=true
```
Le parcours graphique utilise un monde plat de développement neuf, graine
`279`, et cinq relevés de contrôle espacés de 8 192 blocs pour isoler les
problèmes d'échelle. Il ne constitue pas une visite des cinq continents
Sanctuary ni un benchmark multijoueur. Les déplacements lointains, envois
natifs de chunks et changements de blocs utilisent le vrai serveur intégré.
Le parcours **Vulkan / MoltenVK 1.4.2 / Apple M1** passe en **1 min 07 s**,
avec **11 captures**. Il vérifie les cinq relevés simultanés, une arrivée réelle
à 9 008 blocs sans déplacer le centre de la carte ni changer son jeton,
un bloc d'or natif nouvellement relevé, un dézoom au-delà de 256 blocs par pixel puis au
niveau maximal, l'emprise du monde sur les deux axes, le retour à la couleur
exacte du bloc, Pause, FR/EN GUI 2/3/4 et le retrait de l'aptitude Atlas.
Une tuile chargée pour le seul contrôle opérateur, à 12 000 blocs, apparaît
dans son aperçu réduit sans entrer dans les relevés personnels, puis disparaît
quand les commandes sont retirées. Le chargement forcé appartient uniquement
à la fixture du monde de test ; les requêtes Atlas n'en créent pas.
Les captures de vue d'ensemble FR GUI 4, de retour au détail, d'échelle du
monde et d'opérateur ont été inspectées. Les cinq petits carrés colorés sont
des relevés de contrôle, pas des captures du relief des continents.
Captures : `build/map279-screenshots/` ; log :
`build/map279-client-vulkan.log`, marqueur `MAP279_CLIENT_PASS`.
La construction complète et les **20 tests serveur ciblés** passent : relevé
natif au-delà de l'ancien plafond, six couches, absence de découverte chez un
autre habitant ou un spectateur, droits Atlas, claims, Demeure et Waystones.
Le log est `build/map279-check-build-pack.log`. Les contrôles purs du dépôt
passent également. La capacité maximale en multijoueur et le coût de sauvegarde
d'une couche entièrement remplie ne sont pas mesurés par ce lot.
## Artefacts locaux
La dernière passe `check build assemblePack` passe en **3 min 54 s**.
Le MRpack est exporté et vérifié : intégrité ZIP, Minecraft 26.3, Loader 0.19.5,
un seul JAR Sanctuary beta.279 identique au build local, nouvelle pyramide
présente, fixtures de tests absentes et trois libellés FR/EN embarqués. Le JAR
JEI est également identique au build local ; les trois dépendances distantes
gardent leurs empreintes. Reçu : `build/map279-validation.json`.
- JAR : `mods/sanctuary/build/libs/sanctuary-beta.279.jar`, 16 239 330 octets.
- MRpack : `build/Sanctuary-beta.279.mrpack`, 16 593 044 octets.
- SHA-256 du MRpack : `1ebe43f559cec3727fea17ed8cf5593702109ceb6151f5e45125beda83cda6c8`.
Cette livraison est locale : aucun canal, tag distant, serveur personnel ou
instance Prism n'est modifié.
+118
View File
@@ -0,0 +1,118 @@
# MAP-319 — Coupe de la carte à hauteur du joueur
## Intégration beta.320
Cette note conserve les preuves du chantier MAP-319 sur le prototype Under.
Le [regroupement beta.320](integration-beta320.md) reprend le correctif de carte
sans activer les dimensions ni les portails du prototype. Ses tests et artefacts
sont vérifiés séparément ; les empreintes historiques ci-dessous ne sont pas
celles du nouveau binaire.
Demande du 30 octobre 2026, branche `codex/map-player-height`.
Base isolée : `c15b4ba2` (`codex/under-portal-transit`, beta.316), après
confirmation du périmètre Island et Under. Les changements locaux
insectes/propriétés du checkout initial restent intacts. Les autres branches
ont déjà réservé des numéros jusqu'à beta.318 ; ce correctif prend beta.319.
## Contrat avant implémentation
L'Atlas et son aperçu de Pause suivent automatiquement le bloc Y des pieds
du joueur. Chaque colonne montre le premier bloc cartographiable à ce Y ou
plus bas : les plafonds au-dessus sont exclus, une roche traversée par la
coupe reste visible. Aucun arrondi aux six anciens paliers. Les boutons
manuels de couche sont retirés ; le déplacement horizontal et le zoom restent
libres. Un changement de Y vide terrain et calques et renouvelle le token.
Le serveur continue à ne lire que des chunks FULL, sans chargement distant.
Les permissions et la séparation des relevés personnels restent en place.
L’Atlas est disponible dans Island (Overworld) et les dimensions Under
reconnues par leur type. Les autres dimensions gardent leur refus existant.
## Contrat de données additif et retour arrière
Les relevés Under utilisent un sous-dossier distinct
`data/sanctuary-atlas/dimensions/<base64url de l’identifiant de dimension>/`,
avec les mêmes fichiers par habitant et altitude et la graine de cette dimension.
L’Overworld conserve ses chemins historiques. Les transitions ferment l’ancien
flux, vident les chunks visibles et changent le token client. Les bannières et
trésors historiques restent en Overworld ; les propriétés restent limitées à
l’Overworld. Joueurs, pierres de voyage et Demeure restent liés à leur dimension.
Aucun portail, accès ou réglage de génération n’est changé par ce ticket.
Les six fichiers historiques, leurs pixels et leur schéma 2 gardent leur
signification. Une coupe exacte supplémentaire utilise le même schéma et le
chemin déjà établi `data/sanctuary-atlas/layers/<UUID>/<Y>.json` ; aucun ancien
relevé n'est transformé. Les coupes exactes inconnues se remplissent à partir
des chunks déjà découverts et actuellement chargés, puis se conservent sur
disque. Un terrain distant jamais relevé à ce Y reste inconnu jusqu'à revisite.
Le serveur ne substitue jamais la surface à une coupe manquante.
Au plus quatre coupes supplémentaires sont gardées en mémoire par habitant
et par dimension ;
une coupe évincée est sauvegardée avant retrait. Les anciennes versions
ignorent les fichiers supplémentaires. Le protocole conserve sa structure,
mais accepte désormais un plafond entier entre -2048 et 2048 inclus : client
et serveur doivent être mis à jour ensemble. Aucun monde, chunk, identifiant
de jeu ou format de sauvegarde existant n'est migré.
## Vérifications
La validation finale réussit en **4 min 53 s** : `check build assemblePack`,
**9 tests serveur requis** et le parcours client **Vulkan** sur Apple M1,
avec les marqueurs `MAP319_CLIENT_PASS` et `MAP319_UNDER_PASS`.
```sh
./gradlew check build assemblePack :sanctuary:runClientGameTest \
-PsanctuaryFocusedTests=map319,map244,map,portals316 \
-PsanctuaryAtlasOnly=true -PsanctuaryClientTests=true \
-PsanctuaryMap319ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
- Serveur : toit exclu, coupe inclusive, descente d’un bloc, altitude négative,
transparence, vide relevé et consultation distante sans chargement. Sauvegarde
avant éviction, relecture d’une coupe exacte, isolation entre habitants et
fichier historique de surface inchangé. Régressions de livraison des chunks,
achat de Carte et portails beta.316 réussies.
- Client : Y=65 puis 63 sans changer le zoom ou le centre ; modification réelle
du sol reçue dans la même coupe, vieux paquets terrain/Demeure ignorés,
Y=-18 et réouverture d’une coupe déjà connue. Atlas et Pause en FR/EN aux
échelles GUI 2/3/4. **17 captures** dans `build/map319-evidence/` ; vues de
carte et Pause inspectées, y compris le petit format et Under.
- Vraie dimension `sanctuary_test:under_v10`, graine 312, dans le préréglage
de portails beta.316 : mêmes coordonnées/Y, sol or en Island et lapis en
Under, toit en bedrock exclu. Les vieux paquets Island et les claims reçus
avec un token de mise à jour globale sont ignorés en Under. Pause puis retour
Island réussis. Les deux fichiers de coupe Y=65 sont relus séparément en
schéma 2 et gardent leurs couleurs distinctes. Fermetures propres réussies.
- Codec : des altitudes intermédiaires, y compris sous zéro, survivent à un
aller-retour réseau ; valeurs hors limites refusées.
Le MRpack est exporté localement avec `packwiz modrinth export`. ZIP,
Minecraft 26.3, Loader 0.19.5, version interne, toutes les classes du JAR,
libellés FR/EN et octets du JAR embarqué sont vérifiés ; le module de laboratoire
n’est pas inclus dans le pack normal. Reçu : `build/map319-validation.json` ;
journal : `build/map319-final.log`.
- JAR : `mods/sanctuary/build/libs/sanctuary-beta.319.jar`, 18 347 427 octets ;
SHA-256 `2ec65e9ce4c250dc27472d6a44ad94397a75874e9d2aa1639225d9dce2ef94db`.
- MRpack : `build/Sanctuary-beta.319.mrpack`, 16 886 967 octets ;
SHA-256 `e30b3af37ed665d51791490983788364e5703bd34656df8920a097ab1634223b`.
## Portée et limites
Préparation locale sur la branche du prototype Under beta.316. Les chantiers
culinaires et médias des autres branches ne sont pas intégrés par ce ticket.
L’accès à Under reste celui du prototype existant ; aucune dimension n’est
activée dans une installation personnelle ou sur le serveur public.
Aucune publication Gitea, modification du canal packwiz ou synchronisation Prism.
Le brouillard reste horizontal : cette coupe ne simule pas la visibilité
optique de chaque caverne. Une ancienne découverte de surface ne suffit pas
à reconstruire une coupe exacte distante ; il faut la revisiter. Les coupes
relevées sont conservées sur disque ; leur volume après une longue exploration
à de nombreuses altitudes et la charge d’un serveur très peuplé ne sont pas
mesurés. Le parcours graphique utilise Vulkan avec le moteur Fabric natif ;
aucun essai Sodium supplémentaire n’est revendiqué.
+70
View File
@@ -0,0 +1,70 @@
# MEDIA-07 — normales résiduelles de l'ancre
Retour du 27 octobre 2026 : une bordure légèrement brillante reste sur la
vidéo à l'emplacement de l'ancre, dans le coin inférieur gauche.
Branche `codex/media-anchor-model`, **beta.298**, Media **0.3.2**.
[Livraison complète du 27 octobre 2026](release-beta298.md).
## Cause et correction
Le bloc est invisible pour le rendu Minecraft, mais conserve un ancien modèle
de cadre 1 × 1 avec **30 faces**. La passe PBR de Sanctuary collectait aussi
les modèles des blocs invisibles. Elle dessinait donc les normales et le
matériau de ce petit cadre, alors que sa couleur n'était pas rendue.
Les essais graphiques de MEDIA-06 avaient les shaders Sanctuary désactivés ;
ils ne couvraient pas cette passe.
La collecte PBR des modèles opaques et du verre respecte maintenant
`RenderShape.MODEL`. Les fluides gardent leur chemin dédié, y compris l'eau
contenue dans un bloc. Le modèle de bloc de l'ancre est également vidé ;
sa texture de particules reste disponible. L'objet utilise déjà un modèle
indépendant et garde son apparence dans l'inventaire et dans la main.
Le grand cadre reste dessiné par son maillage aux dimensions de l'écran.
Aucun identifiant, paquet, format de données ou règle d'interaction ne change.
Les ancres existantes bénéficient du correctif au chargement du client.
La sauvegarde et les dimensions ne nécessitent aucune migration.
## Validation
Reproduction avec le JAR beta.297 publié : deux clients Vulkan, Sodium,
Sound Physics et **shaders Sanctuary/PBR actifs**. Le diagnostic constate
`INVISIBLE`, 30 faces et admission de l'ancre dans la passe PBR opaque.
Le bois et le verre visibles sont admis dans leurs passes respectives, l'eau
dans la passe transparente.
Après correction, les deux clients constatent **zéro face**, ancre refusée
par les deux passes de matériau, PBR réellement appliqué et vidéo en mouvement.
Les chemins bois, verre et eau restent admis. Pose, taille 9 × 5 et ouverture
du lecteur testées dans le laboratoire ; un clic de pose a dû être rejoué
après la réception de l'inventaire du test.
Captures finales du client A inspectées, en gros plan du coin inférieur gauche,
de face et en vue rasante : aucune empreinte du cadre 1 × 1 sur la vidéo.
La sortie OpenAL est active sur les deux clients. Le JAR Sanctuary testé,
avec un seul Media embarqué et sans sonde, a pour SHA-256
`e6fdc36a212dcfcc89d31fbb29bc8eeec9d002cc9223ea6dcbfb31b7df17ec23`.
`check build assemblePack assembleServerPack :sanctuary-test:exportDuoLaunch`
réussis en **3 min 6 s**, 162 tâches, **18 GameTests requis** au profil
`property270,claims272,claims277,claims278`, atlas ciblé. Contrats Media inclus.
Compilation des vérifications client PBR, y compris les nouveaux contrôles
des blocs invisibles et des modèles visibles, réussie en **37 s**. La suite
graphique PBR historique complète n'est pas rejouée ; ce parcours ciblé
exerce la sélection réelle des matériaux du JAR construit.
Un lancement de client a automatiquement basculé hors Vulkan après une course
d'extraction MoltenVK entre les deux processus : il a été rejeté, arrêté et
relancé sous Vulkan. Seuls les relevés Vulkan sont retenus. Après les captures
et les relevés valides, le client B s'est arrêté sur l'écriture du journal de
la sonde (`No space left on device`). Le disque local ne disposait plus que
de 136 Mio au contrôle suivant ; ce parcours ne vaut donc pas essai d'endurance.
Ce défaut d'espace appartient au laboratoire, la sonde n'est pas distribuée.
[Relevé structuré](media-anchor-normals-results.json). Pas de nouvelle mesure
de synchronisation vidéo/live ou de source publique. Mur graphique orienté sud.
Laboratoires isolés sous `build/media-prototype/anchor-model-*`, captures finales
dans `anchor-model-after/client-a/screenshots/`. Aucun monde personnel utilisé.
Le correctif est maintenant publié et installé sur le canal, la Beta et la
même instance Prism. Le [reçu](release-beta298.md) distingue ces essais
graphiques des vérifications effectuées pendant la livraison.
+111
View File
@@ -0,0 +1,111 @@
{
"ticket": "MEDIA-07",
"state": "published and installed on Beta server, Web distribution and existing Prism instance",
"artifact": {
"version": "beta.298",
"bytes": 18301295,
"sha256": "e6fdc36a212dcfcc89d31fbb29bc8eeec9d002cc9223ea6dcbfb31b7df17ec23",
"media_version": "0.3.2",
"nested_media_count": 1,
"anchor_block_faces": 0,
"probe_embedded": false
},
"backend": "Vulkan",
"clients": [
{
"client": "client-a",
"model": {
"anchor_model_quads": 0,
"anchor_render_shape": "INVISIBLE",
"shaders_active": true,
"pbr_enabled": true,
"pbr_applied": true,
"anchor_pbr_opaque": false,
"water_pbr_opaque": false,
"wood_pbr_opaque": true,
"anchor_pbr_transparent": false,
"water_pbr_transparent": true,
"glass_pbr_transparent": true
},
"vulkan_video_uploads": 1625
},
{
"client": "client-b",
"model": {
"anchor_model_quads": 0,
"anchor_render_shape": "INVISIBLE",
"shaders_active": true,
"pbr_enabled": true,
"pbr_applied": true,
"anchor_pbr_opaque": false,
"water_pbr_opaque": false,
"wood_pbr_opaque": true,
"anchor_pbr_transparent": false,
"water_pbr_transparent": true,
"glass_pbr_transparent": true
},
"vulkan_video_uploads": 1448
}
],
"before": {
"version": "beta.297",
"clients": [
{
"client": "client-a",
"anchor_model_quads": 30,
"anchor_render_shape": "INVISIBLE",
"shaders_active": true,
"pbr_enabled": true,
"anchor_pbr_opaque": true,
"water_pbr_opaque": false,
"wood_pbr_opaque": true,
"anchor_pbr_transparent": false,
"water_pbr_transparent": true,
"glass_pbr_transparent": true
},
{
"client": "client-b",
"anchor_model_quads": 30,
"anchor_render_shape": "INVISIBLE",
"shaders_active": true,
"pbr_enabled": true,
"anchor_pbr_opaque": true,
"water_pbr_opaque": false,
"wood_pbr_opaque": true,
"anchor_pbr_transparent": false,
"water_pbr_transparent": true,
"glass_pbr_transparent": true
}
]
},
"build": {
"check_build_assemble": "passed",
"duration": "3m06s",
"tasks": 162,
"required_gametests": 18,
"client_checks_compile": "passed, 37s, 6 tasks; historical PBR graphic suite not rerun"
},
"limits": [
"No new live synchronization or public-source validation",
"Graphical wall faces south",
"Graphical validation used isolated instances; deployment to Beta and existing Prism is recorded in the delivery receipt",
"One automatic fallback after concurrent MoltenVK extraction was rejected and the client relaunched in Vulkan",
"Client B stopped after valid samples and captures because the probe could not write its log: No space left on device; not an endurance test"
],
"graphics_checks": {
"lower_left_front_video": "inspected, no 1x1 frame imprint",
"lower_left_grazing_video": "inspected, no 1x1 frame imprint",
"placement_resize_reader": "passed; placement replayed after inventory arrival",
"final_screenshots": [
"anchor-model-shaders-front-settled.png",
"anchor-model-shaders-side-settled.png"
]
},
"delivery": {
"date": "2026-10-27",
"receipt": "release-beta298.md",
"source_tag": "fb8705369e3834c66d965108d609ec704b584ec2",
"packwiz_commit": "7fa08625a4fa89391d64b4b4fc0859611ecf0952",
"fresh_check_build_assemble": "passed, 2m50s, 158 tasks, 18 required GameTests; identical JAR to final Vulkan validation"
}
}
+217
View File
@@ -0,0 +1,217 @@
# MEDIA-04 — Un cadre comme ancre, agrandissement gratuit
Branche `codex/media-anchor`, 26 octobre 2026. Suite du
[prototype de synchronisation](media-sync-audio-prototype.md).
Décision de Koka : **un seul cadre est consommé pour poser l'ancre ; aucun
cadre supplémentaire pour agrandir, aucun remboursement quand on réduit**.
Cette décision remplace le coût par bloc envisagé dans MEDIA-01.
L'extension expérimentale `sanctuary_media` passe en **0.3.0-prototype** ;
elle reste séparée du pack beta.293. Aucun compteur Sanctuary, manifeste,
serveur personnel ou installation Prism modifié.
## Contrat de données avant le premier essai
Nouveaux identifiants : bloc, objet et block entity
`sanctuary_media:redstone_frame`. Recette : huit bâtons autour d'une redstone.
Le bloc représente uniquement l'ancre, placée devant un mur, au coin inférieur
gauche vu de face. Une seule block entity et une seule surface Dream par écran.
La block entity utilise **AnchorVersion=1**, avec Width, Height, Revision,
Owner et Display (UUID Dream). Dream conserve la source et sa timeline dans
son propre stockage. Le chargement/déchargement d'un chunk ne détruit pas
l'écran et ne donne aucun objet. Casser l'ancre ou perdre un support chargé
supprime le display une fois ; le loot normal rend un cadre en survie.
La taille n'est pas copiée dans l'objet récupéré.
Le marqueur Dream final `sanctuary_media:anchor_v2` encode 28 octets : version
2, position longue, largeur, hauteur, révision, orientation. Il permet le rendu
et le raycast même sans block entity dans l'index local. Les premiers essais
non livrés utilisaient un marqueur V1 de 24 octets ; au chargement de leur
ancre, `ensureDisplay` reconstruit le V2 depuis le BlockState, vérifie son
enregistrement, puis retire le V1, en conservant UUID, source et géométrie.
Le format de la block entity ne change pas. Cette migration concerne seulement
les mondes expérimentaux créés par ce ticket ; aucun monde personnel n'est ouvert.
Le schéma apparaît seulement dans un **nouveau monde de laboratoire** pour ces
essais. Le redémarrage de ce même laboratoire vérifie la relecture d'AnchorVersion=1 sans
changement de format. Aucun monde personnel ni conversion d'un format existant.
Une future évolution incompatible devra définir sa migration avant utilisation.
## Interaction
- Poser sur une face verticale : ancre 1 × 1, puis menu largeur/hauteur.
- Dimensions entières libres, formats rapides facultatifs 4 × 3, 8 × 4, 16 × 9
et aperçu du ratio. Aucun catalogue de tailles imposées.
- Confirmer modifie le rectangle ; fermer laisse la taille précédente.
- Clic droit sur toute la surface jusqu'à **16 blocs**, depuis les yeux, pour
le lecteur commun. Les murs bloquent le rayon.
- Maj + clic droit ou bouton Taille à portée de construction de l'ancre :
menu de dimensions si les droits de construction l'autorisent.
- Source, lecture, pause et seek sont communs. Volume et muet sont personnels.
Ouvrir le menu ne met pas la séance en pause.
**Il s'agit d'une extension, pas d'un portage ni d'une réécriture du lecteur.**
À la demande de Koka, le petit lecteur Sanctuary provisoire a été retiré :
le clic normal ouvre le véritable `DisplayMenu` de Dream Displays 1.10.4,
avec son champ de recherche/liens, ses cartes, aperçu et commandes existantes.
Seul le menu des dimensions est ajouté, avec un bouton Taille dans l'en-tête
natif. Les commandes restent communes et les modes/access restent fixés sur
Synchronisé/Tout le monde. La suppression se fait via l'ancre ; la double
acoustique Dream est désactivée au profit du pont Minecraft/Sound Physics.
Le cadre visuel dessine les quatre bords dans **le même repère et le même
pipeline Vulkan que l'image**, avec une épaisseur constante d'un seizième de
bloc. Son contour extérieur correspond exactement au rectangle demandé, y
compris avant de charger une source. L'ancien contour du seul bloc 1 × 1 est
invisible. Un petit repère de redstone marque le coin d'ancrage.
Budgets serveur dans `config/sanctuary-media-anchors.json` : par défaut largeur
256, hauteur 256, surface 16 384 blocs ; zéro retire le plafond correspondant.
Les limites du monde et les chunks réellement chargés restent des contraintes.
Le plafond fixe 32 × 18 du premier essai a été retiré après la précision de Koka.
La résolution des textures garde le ratio, avec 4096 pixels par axe et au plus
8 388 608 pixels, pour que la taille physique ne déclenche pas une allocation
vidéo immense. Les cas extrêmes sont vérifiés dans le contrat Java.
Le serveur recalcule cible, visibilité, portée et droits, vérifie chaque cellule
du mur et de l'espace avant, les limites du monde et les autres ancres chargées.
Un rectangle partiellement déchargé est refusé sans charger les chunks.
Révision et UUID protègent contre une ancienne fenêtre. Les paquets natifs
Dream concernant un écran ancré passent par le contrat de l'ancre ; ses API
de géométrie et suppression refusent les appels hors transaction autorisée.
Les écrans Dream ordinaires conservent leur comportement.
Le prototype réutilise la synchro et le réglage personnel d'acoustique de
MEDIA-03. Le filtre 16 pixels par bloc, les sources publiques et les disques
blancs restent des lots distincts.
Un redimensionnement pendant la lecture recrée les textures et recharge le
décodeur aux nouvelles proportions, puis redemande la timeline commune. Cela
évite d'étirer l'ancienne texture ; une brève remise en tampon est attendue.
L'image garde son ratio, avec des bandes noires si celui-ci diffère du cadre.
L'UUID et la source restent identiques.
## Vérification du prototype
Laboratoire `anchor-03`, créé pour ce ticket, deux vrais clients Minecraft
26.3 sous **Vulkan**, serveur dédié local, Dream Displays 1.10.4, Sound Physics
Remastered 1.5.1+26.3 et Sodium 0.9.2+mc26.3, Java 25. Même méthode et même
source synthétique à 30 images/s que MEDIA-03, Apple M1 8 Gio. Le backend libav
embarqué reste indisponible sur ce poste : le chemin natif Dream utilise
FFmpeg externe 8.1.2. Aucun essai OpenGL.
La suite `scripts/anchor_lab_checks.py` a passé ses **14 contrôles** :
consommation unique, agrandissement gratuit, réduction sans remboursement,
même UUID, budget, mur complet, révision périmée, accès natifs protégés,
obstacle/chevauchement/chunk absent, permissions de construction, lecteur
Dream à distance avec un cadre en main, redimensionnement lointain refusé,
mur bloquant le clic et le paquet forgé, second spectateur. Les interactions
passent par les widgets et les paquets du jeu ; le monde n'est pas modifié
hors des gestes explicites du scénario de laboratoire.
Essais complémentaires :
- Recette et loot chargés par le serveur ; calculs des quatre orientations,
raycast et bornes de texture vérifiés par le contrat Java.
- Véritable menu `DisplayMenu` en FR et EN, deux échelles d'interface ; lien
saisi dans sa recherche puis carte sélectionnée, source propagée aux deux
clients, pause/reprise depuis le second spectateur.
- Passage de 7 × 4 à **33 × 7** pendant le live, cadre autour de tout le
rectangle, vidéo centrée sans étirement ; inventaire toujours à trois
après une seule pose depuis une pile de quatre.
- Index local d'ancres retiré : rendu, lecteur et commandes retrouvent la
surface via les métadonnées Dream répliquées.
- Redémarrage du laboratoire : mêmes dimensions 33 × 7, révision, UUID
`111fe5e2-a78e-4541-8d7c-cab51901d326` et source ; un seul display.
- Reconnexion d'un client au même serveur puis réouverture du lecteur.
Le délai anti-spam utilise maintenant une horloge monotone, avec nettoyage
à la déconnexion, au lieu de l'âge du nouveau joueur.
- Pause du live dépassant la fenêtre de segments, puis reprise : chaque
session froide épingle un manifeste récent et son origine PCM. L'essai a
découvert puis corrigé la réutilisation d'une ancienne origine, qui figeait
l'image et vidait l'audio après reprise.
- Option personnelle d'acoustique désactivée sur A pendant le live : ses
appels SPR cessent, ceux de B continuent, audio OpenAL actif sur les deux.
- Hors champ sur A : plus d'uploads GPU, curseur audio toujours en mouvement.
- Retrait d'un support du mur : disparition de l'ancre et du display, un seul
cadre lâché, aucun doublon cinq secondes plus tard.
Les phases anciennes `live-anchor-rejoin-play` et les premiers essais de
redimensionnement sont des diagnostics **avant correction**, pas des tests
réussis. Les séries finales et leurs couvertures sont conservées dans le
[relevé de résultats](media-anchor-results.json). Les traces détaillées et
captures restent dans `build/media-prototype/anchor-03/`, hors Git.
La mesure compare les numéros d'images réellement envoyées au GPU, à la
résolution d'une image à 30 i/s, et les curseurs OpenAL. Elle ne mesure ni le
scanout des moniteurs ni l'écoute des haut-parleurs. Les valeurs après les
quinze premières secondes ne garantissent pas une latence réseau ; les
chargements et pointes restent comptés dans les traces.
| Phase contrôlée | Durée | Paires après 15 s | Médiane | P95 | Maximum |
| --- | ---: | ---: | ---: | ---: | ---: |
| VOD via menu Dream, 7 × 4 | 200 s | 738 | 22 ms | 118 ms | 200 ms |
| Live, reprise après pause froide | 68,5 s | 208 | 15 ms | 249 ms | 579 ms |
| Live final stabilisé, 33 × 7 | 74,6 s | 237 | 14 ms | 33 ms | 242 ms |
Couverture utilisable de la dernière phase : 99,3 % sur A et 100 % sur B,
médiane 30 FPS. Le tout dernier redémarrage des deux JVM n'a que cinq paires
après 15 s (P95 526 ms, couverture 27–28 %) : c'est un échantillon de démarrage
insuffisant pour conclure sur le régime stable. Le relevé le conserve, ainsi
que les pointes de la reprise froide ; la synchro n'est pas instantanée.
Après les tests, les clients, le générateur HLS et le serveur HTTP ont été
arrêtés. Le serveur de laboratoire est resté bloqué plus d'une minute dans
`ServerChunkCache.runDistanceManagerUpdates` pendant `stopServer` ; dump des
threads conservé dans `build/media-fix/anchor-server-stop-threads.log`, puis
arrêt forcé du seul processus identifié. Le test de persistance avait réussi
lors du redémarrage précédent ; cet arrêt forcé n'est pas une validation de
sauvegarde propre. Aucune installation personnelle n'est concernée.
Vérification finale du code :
- `./gradlew check build --max-workers=1 -Dorg.gradle.jvmargs=-Xmx1G
-PsanctuaryFocusedTests=property270,claims272,claims277,claims278
-PsanctuaryAtlasOnly=true --console=plain` : **réussi en 2 min 51 s**, 145
tâches, **18 GameTests requis réussis**. Java 25 via `JAVA_HOME`.
- `python3.14 scripts/media_lab.py test-media` : contrats horloge, timeline,
HLS, isolation d'origine après reprise, géométrie et textures réussis ;
construction du JAR expérimental séparé réussie.
- Sept tests du rapport de mesure et compilation syntaxique Python réussis.
- Aucun changement de distribution, donc pas d'`assemblePack`, publication,
changement de version Beta ou synchronisation Prism.
## Reproduire
```sh
./gradlew :sanctuary-test:exportDuoLaunch
python3.14 scripts/media_lab.py prepare --run anchor-test --anchors
python3.14 scripts/media_lab.py serve --run anchor-test
# Dans d'autres terminaux :
python3.14 scripts/media_lab.py server --run anchor-test
python3.14 scripts/media_lab.py client-a --run anchor-test
python3.14 scripts/media_lab.py client-b --run anchor-test
python3.14 scripts/anchor_lab_checks.py --run anchor-test
python3.14 scripts/media_lab.py test-media
```
La suite interactive attend que les deux joueurs aient rejoint le laboratoire.
Pour vérifier les flux, lancer `live --run anchor-test`, puis saisir l'URL
loopback de `manifest.json` dans le menu Dream ; les médias restent des
fixtures synthétiques locales. Arrêter avec `stop --run anchor-test`, puis
fermer le serveur HTTP du terminal `serve`.
## Limites encore ouvertes
Les dimensions libres désignent des **blocs entiers**, sur un mur complet ;
les budgets configurables du serveur protègent le coût des validations. Les
tailles extrêmes n'ont pas été essayées dans le monde ; seules leurs bornes
de calcul et d'allocation ont été vérifiées. Les quatre orientations ont un
contrat de géométrie, le parcours graphique est orienté sud.
Twitch/YouTube publics, playlists HLS maître, LL-HLS, discontinuités, DRM,
résolution ANI-CLI, filtre 16 pixels/bloc et disques blancs ne sont pas
validés dans ce ticket. Le lecteur et ses réglages restent ceux de Dream.
L'extension expérimentale n'est pas encore distribuée dans Sanctuary Beta.
+489
View File
@@ -0,0 +1,489 @@
{
"ticket": "MEDIA-04",
"date": "2026-10-26",
"branch": "codex/media-anchor",
"version": "0.3.0-prototype",
"environment": {
"minecraft": "26.3",
"java": 25,
"dream_displays": "1.10.4",
"sound_physics_remastered": "1.5.1+26.3",
"backend": "Vulkan",
"machine": "Apple M1, 8 GiB",
"lab": "anchor-03",
"seed": 2602,
"media": "synthetic H264/AAC 320x180, 30fps; dated 1s HLS segments"
},
"method": "16-bit frame code, 30 fps, successful GPU upload, nearest observations within 150 ms; no display-scanout or subjective listening measurement",
"interaction_checks": {
"passed": [
"one frame consumed on placement",
"custom 7x4 and free enlargement",
"shrinking does not refund frames",
"resizing keeps the same display",
"oversize refused",
"incomplete wall refused",
"stale revision refused",
"native delete, overlap, obstacle and unloaded chunks refused",
"building permission required",
"original Dream reader on remote overlay while holding frame",
"forged remote resize refused",
"wall blocks normal interaction",
"wall blocks forged open packet",
"original Dream reader available to second spectator"
]
},
"lifecycle": {
"culling_audio_continues": true,
"support_loss_one_drop": true,
"no_duplicate_drop_after_5s": true,
"final_server": {
"assertions": {
"reloaded": true
},
"server_step": "remove-support",
"anchor": false,
"frames_in_inventory": 3,
"frame_drops": 1,
"displays": 0,
"wall_ns": 1793006462588000000,
"mono_ns": 2229766026712875,
"phase": "anchor-support-loss"
}
},
"phases": {
"final-native-video": {
"duration_seconds": 200.023,
"after_15s_skew_ms": {
"count": 738,
"median": 22.000000000000007,
"p95": 118.00000000000001,
"max": 200.33333333333334
},
"all_pairs_skew_ms": {
"count": 799,
"median": 26.00000000000001,
"p95": 151.66666666666669,
"max": 200.99999999999997
},
"clients": {
"client-a": {
"samples": 800,
"usable_video_samples": 800,
"usable_fraction": 1.0,
"largest_sample_gap_seconds": 0.398,
"fps": {
"count": 800,
"median": 30.0,
"p95": 30,
"max": 30
},
"media_audio_first": {
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 24,
"error_ns": 2222222
},
"media_audio_last": {
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 814,
"error_ns": 7551020
},
"java_sound_active_samples": 0,
"openal_active_samples": 800,
"probe_errors": []
},
"client-b": {
"samples": 801,
"usable_video_samples": 800,
"usable_fraction": 0.9987515605493134,
"largest_sample_gap_seconds": 0.322,
"fps": {
"count": 800,
"median": 30.0,
"p95": 30,
"max": 30
},
"media_audio_first": {
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 181406,
"effects_calls": 24
},
"media_audio_last": {
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.004580499,
"playing": true,
"video_acoustics": true,
"error_ns": 9160998,
"effects_calls": 814
},
"java_sound_active_samples": 0,
"openal_active_samples": 800,
"probe_errors": []
}
}
},
"live-anchor-rejoin": {
"duration_seconds": 23.226,
"after_15s_skew_ms": {
"count": 32,
"median": 12.333333333333334,
"p95": 25.666666666666664,
"max": 29.666666666666668
},
"all_pairs_skew_ms": {
"count": 91,
"median": 38.666666666666664,
"p95": 76.00000000000001,
"max": 105.66666666666666
},
"clients": {
"client-a": {
"samples": 94,
"usable_video_samples": 94,
"usable_fraction": 1.0,
"largest_sample_gap_seconds": 0.534,
"fps": {
"count": 94,
"median": 30.0,
"p95": 30,
"max": 30
},
"media_audio_first": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": -6167800,
"effects_calls": 466,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"media_audio_last": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": -6009070,
"effects_calls": 556,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"java_sound_active_samples": 0,
"openal_active_samples": 94,
"probe_errors": []
},
"client-b": {
"samples": 93,
"usable_video_samples": 93,
"usable_fraction": 1.0,
"largest_sample_gap_seconds": 0.41,
"fps": {
"count": 93,
"median": 29,
"p95": 30,
"max": 30
},
"media_audio_first": {
"al_error": 0,
"backend": "openal",
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 3854875,
"effects_calls": 169,
"resets": 0
},
"media_audio_last": {
"al_error": 0,
"backend": "openal",
"rate": 1.004319728,
"playing": true,
"video_acoustics": true,
"error_ns": 8639456,
"effects_calls": 260,
"resets": 0
},
"java_sound_active_samples": 0,
"openal_active_samples": 93,
"probe_errors": []
}
}
},
"live-fresh-pin-resume": {
"duration_seconds": 68.542,
"after_15s_skew_ms": {
"count": 208,
"median": 15.0,
"p95": 249.33333333333334,
"max": 578.6666666666666
},
"all_pairs_skew_ms": {
"count": 247,
"median": 14.333333333333337,
"p95": 133.66666666666666,
"max": 578.6666666666666
},
"clients": {
"client-a": {
"samples": 274,
"usable_video_samples": 251,
"usable_fraction": 0.916058394160584,
"largest_sample_gap_seconds": 0.526,
"fps": {
"count": 251,
"median": 30,
"p95": 30,
"max": 30
},
"media_audio_first": {},
"media_audio_last": {
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 267,
"error_ns": 6757370,
"video_acoustics": true
},
"java_sound_active_samples": 0,
"openal_active_samples": 251,
"probe_errors": []
},
"client-b": {
"samples": 274,
"usable_video_samples": 251,
"usable_fraction": 0.916058394160584,
"largest_sample_gap_seconds": 1.047,
"fps": {
"count": 251,
"median": 30,
"p95": 30,
"max": 30
},
"media_audio_first": {},
"media_audio_last": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 266,
"error_ns": -8934240,
"video_acoustics": true,
"playing": true,
"rate": 0.99553288
},
"java_sound_active_samples": 0,
"openal_active_samples": 251,
"probe_errors": []
}
}
},
"live-anchor-final-rejoin": {
"duration_seconds": 16.718,
"after_15s_skew_ms": {
"count": 5,
"median": 375.0,
"p95": 526.3333333333334,
"max": 526.3333333333334
},
"all_pairs_skew_ms": {
"count": 15,
"median": 184.33333333333331,
"p95": 375.3333333333333,
"max": 526.3333333333334
},
"clients": {
"client-a": {
"samples": 62,
"usable_video_samples": 17,
"usable_fraction": 0.27419354838709675,
"largest_sample_gap_seconds": 1.865,
"fps": {
"count": 17,
"median": 29,
"p95": 29,
"max": 30
},
"media_audio_first": {},
"media_audio_last": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 36,
"error_ns": 59138322,
"video_acoustics": true,
"playing": true,
"rate": 1.02
},
"java_sound_active_samples": 0,
"openal_active_samples": 17,
"probe_errors": []
},
"client-b": {
"samples": 60,
"usable_video_samples": 17,
"usable_fraction": 0.2833333333333333,
"largest_sample_gap_seconds": 2.436,
"fps": {
"count": 17,
"median": 27,
"p95": 30,
"max": 30
},
"media_audio_first": {},
"media_audio_last": {
"effects_calls": 35,
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.02,
"playing": true,
"video_acoustics": true,
"error_ns": 176575964
},
"java_sound_active_samples": 0,
"openal_active_samples": 18,
"probe_errors": []
}
}
},
"live-anchor-stable-final": {
"duration_seconds": 74.563,
"after_15s_skew_ms": {
"count": 237,
"median": 14.333333333333334,
"p95": 33.0,
"max": 242.33333333333334
},
"all_pairs_skew_ms": {
"count": 297,
"median": 16.0,
"p95": 951.3333333333334,
"max": 1175.6666666666667
},
"clients": {
"client-a": {
"samples": 299,
"usable_video_samples": 297,
"usable_fraction": 0.9933110367892977,
"largest_sample_gap_seconds": 0.756,
"fps": {
"count": 297,
"median": 30,
"p95": 30,
"max": 30
},
"media_audio_first": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 456,
"error_ns": 476190,
"video_acoustics": true,
"playing": true,
"rate": 1.0
},
"media_audio_last": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 459,
"error_ns": -2857143,
"video_acoustics": false,
"playing": true,
"rate": 1.0
},
"java_sound_active_samples": 0,
"openal_active_samples": 298,
"probe_errors": []
},
"client-b": {
"samples": 299,
"usable_video_samples": 299,
"usable_fraction": 1.0,
"largest_sample_gap_seconds": 0.431,
"fps": {
"count": 299,
"median": 30,
"p95": 30,
"max": 30
},
"media_audio_first": {
"effects_calls": 456,
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 2766440
},
"media_audio_last": {
"effects_calls": 750,
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": -1337868
},
"java_sound_active_samples": 0,
"openal_active_samples": 299,
"probe_errors": []
}
}
}
},
"interpretation": {
"vod": "Native Dream search/card/playback at 7x4; measurement through anchor",
"live-anchor-rejoin": "Single client rejoin at 33x7; native menu and shared pause checked; predates cold-pause fix",
"live-fresh-pin-resume": "First live restart after cold-pause fix; includes warmup and scheduling spikes during tools/build; no frozen playback",
"live-anchor-final-rejoin": "Latest code, both JVMs restarted: short startup sample, only five stable pairs, insufficient for steady-state conclusion",
"live-anchor-stable-final": "Latest code after warmup, 33x7; A video acoustics off and B on; occasional upload/scheduling spikes retained"
},
"limits": [
"No monitor scanout or loudspeaker capture",
"Only controlled local VOD/HLS; no public Twitch/YouTube validation",
"Final short reconnect phase has low usable coverage, not an instantaneous reconnect claim"
],
"checks": {
"java_contracts": "passed",
"python_report_tests": 7,
"root_check_build": {
"status": "passed",
"seconds": 171,
"actionable_tasks": 145,
"executed": 120,
"game_tests": 18,
"focused_tests": "property270,claims272,claims277,claims278",
"atlas_only": true,
"command": "JAVA_HOME=$(/usr/libexec/java_home -v 25) ./gradlew check build --max-workers=1 -Dorg.gradle.jvmargs=-Xmx1G -PsanctuaryFocusedTests=property270,claims272,claims277,claims278 -PsanctuaryAtlasOnly=true --console=plain"
}
},
"publication": "none; independent experimental addon, Beta pack unchanged",
"shutdown": {
"server_pid": 44868,
"forced_after_seconds": 63,
"reason": "Server thread blocked in ServerChunkCache.runDistanceManagerUpdates during MinecraftServer.stopServer; shutdown hook waiting",
"thread_dump": "build/media-fix/anchor-server-stop-threads.log",
"clients_live_and_http_stopped": true
}
}
+76
View File
@@ -0,0 +1,76 @@
# MEDIA-05 — livrer les écrans dans Sanctuary beta.296
Demande du 26 octobre 2026 : mettre Sanctuary à jour pour essayer les cadres.
Branche `codex/media-beta296`, intégration de `codex/media-anchor` et du socle
publié beta.295, favori serveur et commandes de propriété conservés.
## Distribution
Le JAR Sanctuary contient maintenant le module Fabric `sanctuary_media`
**0.3.0**, construit par Gradle depuis `mods/sanctuary-media/`. Ses identifiants
et entrées restent ceux du prototype ; aucun deuxième JAR Media à installer.
L'assemblage vérifie la présence d'un seul module, ses dépendances, sa licence
et l'absence de code de sonde. Le module compile contre les classes Sanctuary
pour éviter un cycle avec le JAR qui l'embarque.
Dream Displays **1.10.4**, artefact Modrinth **siUKU04U** pour Minecraft **26.3**,
est une dépendance packwiz commune aux clients et au serveur, vérifiée par
SHA-512. Les profils serveur possèdent désormais cinq mods externes/principaux :
Fabric API, Sanctuary (JEI et Media inclus), Dream Displays, Lithium et Simple
Voice Chat. Sound Physics reste facultatif côté client. Pas de mise à jour de
Minecraft, Fabric, JEI ni des autres dépendances.
Le décodeur reste sur les clients. Sur ce Mac Apple Silicon, le chemin validé
utilise FFmpeg 8.1.2 ; le backend libav embarqué ne se charge pas. Dream peut
télécharger ses outils au premier lancement. L'installation locale réutilise
le FFmpeg système vérifié pour éviter une autre variante du décodeur.
## Contrat des données
L'ajout n'effectue aucune conversion, génération ou modification de blocs
existants. Il enregistre `sanctuary_media:redstone_frame` et ses nouvelles
données **AnchorVersion=1**, seulement quand un joueur pose une ancre. Dream
garde sa propre source et sa timeline ; la surface reçoit le marqueur V2
documenté dans [MEDIA-04](media-anchor-prototype.md).
Sauvegarder l'instance Beta entière, configuration et environnement privé
avant changement du canal. Préserver mondes, joueurs, permissions, admission,
communauté et réglages. Aucun monde personnel n'est ouvert pour la validation
locale. Après utilisation des nouveaux écrans, un retour à beta.295 demande
la restauration de la sauvegarde correspondante ; ne pas lancer l'ancien
binaire sur un monde contenant les nouveaux blocs.
## Essayer en jeu
1. Lancer l'instance Sanctuary Beta habituelle ; packwiz télécharge la mise à
jour. Rejoindre le favori Sanctuary Beta.
2. Fabriquer un **cadre de redstone** : huit bâtons et une redstone au centre.
3. Poser le cadre sur un mur plein : il devient le coin inférieur gauche.
Saisir largeur et hauteur, puis Appliquer. Un seul cadre est consommé et
tout redimensionnement est gratuit.
4. Clic droit sur la surface, jusqu'à 16 blocs : le véritable menu Dream
Displays s'ouvre. Coller un lien, lancer sa recherche puis choisir la carte.
Les commandes de lecture sont communes ; volume et muet sont personnels.
5. Près de l'ancre, utiliser Maj + clic droit ou le bouton Taille pour ajuster
les dimensions. Le mur complet doit rester derrière l'écran.
Le contour correspond exactement au rectangle ; la vidéo conserve son ratio.
Budgets dans `config/sanctuary-media-anchors.json` (256 × 256, surface 16 384
par défaut ; zéro enlève le plafond concerné). Aucun format prédéfini imposé.
Pour garder le son sans réverbération/occlusion : **Options → Sons → Sound
Physics Remastered → Acoustique des vidéos : Non**. Le choix est personnel.
L'audio continue quand l'écran sort du champ de vision.
## Vérifications et limites
Le prototype a été exercé avec deux clients Vulkan : vidéo synthétique, HLS
daté, reconnexion, pause froide, cadre 33 × 7, menu natif FR/EN, droits et
inventaire. [Mesures détaillées et pointes](media-anchor-results.json).
Cette livraison ajoute les contrôles Gradle, des archives et des installations
réelles ; voir le [reçu de livraison](release-beta296.md).
Twitch/YouTube publics ne sont pas une validation obtenue par les fixtures
locales. DRM, HLS maître/LL-HLS, ANI-CLI, pixellisation 16 pixels/bloc et disques
blancs restent hors de cette livraison. La reprise d'un live peut remettre
quelques secondes en tampon pour retrouver le retard commun.
+334
View File
@@ -0,0 +1,334 @@
# MEDIA-01 — Écrans et séances partagées
Étude du **26 octobre 2026**, branche `codex/media-displays-study`, issue du
commit Sanctuary `74dc1265` (**beta.293**). Les modifications beta.294 en cours
dans le checkout `codex/property-command` sont laissées dans leur checkout.
**Statut : cadrage documentaire, aucun mod implémenté ni installé.** Les choix
ci-dessous proviennent de la discussion avec Koka ; les propositions techniques
et les critères d'essai ne constituent pas des résultats mesurés.
Suite de ce cadrage initial : le [prototype MEDIA-02](media-playback-prototype.md)
consigne les essais réels à deux clients Vulkan. Il ajoute uniquement une sonde
de développement et une scène Dream Displays, sans les cadres Sanctuary.
## Choix confirmés
| Sujet | Décision du créateur |
| --- | --- |
| Pose | Une ancre, puis un menu largeur/hauteur |
| Support | Surface murale complète, comme un tableau |
| Fabrication | Recette du tableau avec redstone au centre, à la place de la laine |
| Coût | **Décision révisée : une seule ancre, agrandissement gratuit** — voir [MEDIA-04](media-anchor-prototype.md) |
| Image | Option de pixellisation à **16 × 16 pixels par bloc** |
| Séance | Priorité à la synchronisation du groupe, quitte à retarder le direct |
| Commandes de lecture | Tous les spectateurs peuvent changer la source et mettre en pause |
| Audio initial | Son émis par l'écran ; disques blancs et jukebox ensuite |
| Interaction | Lecteur accessible à 16 blocs en visant ; redimensionnement à proximité |
| Référence animés | **ANI-CLI**, projet GitHub ; aucune dépendance existante identifiée dans Sanctuary |
Volume et muet personnels accompagnent les commandes communes. Les systèmes
utilisés par tous les joueurs restent à inventorier ; Windows, macOS Intel,
macOS Apple Silicon et Linux ne sont pas considérés comme validés par défaut.
Le disque blanc est une intention de la [vision](vision.md), pas une mécanique
trouvée dans le code actuel. L'acoustique existante est **Sound Physics Remastered**,
mod facultatif [documenté ici](../mods/sound-physics-remastered/PROVENANCE.md).
## Options de réalisation
| Option | Ce qu'elle apporte | Travail ou limite déterminante | Avis |
| --- | --- | --- | --- |
| Dream Displays intact | Sources en ligne et lecture multijoueur déjà prévues | Contrat Sanctuary de pose/coût/filtre à adapter ; synchronisation live insuffisante pour ce contrat | Référence et candidat d'essai |
| Extension Sanctuary de Dream Displays | Réutiliser la lecture, ajouter objets, pose et règles de jeu | API expérimentale ; vérifier les points d'extension du filtre, du son et de l'horloge | **Premier chemin à éprouver** |
| Fork ciblé de Dream Displays | Modifier précisément synchronisation, sortie audio et rendu | Entretenir le fork et les mises à jour du résolveur et des composants natifs | Repli si l'extension ne suffit pas |
| Mod original avec moteur natif | Maîtrise du modèle écran/séance et du son Minecraft | Décodage, composants natifs, reprise réseau et maintenance des sources à prendre en charge | Plus coûteux ; réserver aux blocages démontrés |
| Navigateur embarqué, type MCEF | Pages et lecteurs web dans le jeu | Port 26.3/Vulkan non établi, son spatial et horloges peu contrôlables, contraintes des embeds | Mauvais point de départ pour ce besoin |
Ces avis sont une évaluation d'architecture, pas un benchmark. Une extension
qui ne pourrait pas changer la synchronisation ne satisferait pas le besoin
complet, même si la pose fonctionnait. Un fork éventuel doit rester une
dépendance clairement identifiée ; ne pas copier un moteur dans Sanctuary sans
sa provenance et ses notices.
Proposition d'organisation : un module dédié sous `mods/` pour les cadres,
surfaces et séances, un adaptateur pour les claims Sanctuary, et une interface
de moteur média. Le nom et les identifiants restent à fixer. Cette séparation
permet de changer de moteur sans réécrire la fabrication ou les règles de pose ;
elle ne suppose pas que l'API Dream fournisse déjà tous les points nécessaires.
### Dream Displays : compatibilité vérifiée et limites observées
Le candidat exact est [Dream Displays 1.10.4 Fabric 26.3](https://modrinth.com/mod/dreamdisplays/version/siUKU04U),
publié le 25 octobre 2026. Son JAR a été téléchargé **en mémoire seulement**,
son SHA-512 comparé à l'API Modrinth et son `fabric.mod.json` lu :
- fichier `dreamdisplays-fabric-26.3-1.10.4.jar`, **26 809 153 octets** ;
- Loader `>=0.19`, Minecraft `~26.3-`, Java `>=25`, Fabric API requise ;
- points d'entrée client et serveur Fabric ; licence déclarée `LGPL-3.0` ;
- SHA-512 :
`c034f3e890fed144832b27442459d254ad553cbaec592d2da50162711e0f71f2313ec52639c6b1a576890b909b935c98f3699da296801dde7db81ced6d9d9eca`.
Cela satisfait les versions déclarées du socle **26.3 / Loader 0.19.5 /
Fabric API 0.160.5+26.3 / Java 25**. Cela ne valide ni son démarrage avec le
pack, ni son affichage, ni ses performances sous Vulkan et Sodium.
Les sources consultées sont figées au
[commit `0d13cb8`](https://github.com/arnodoelinger/dreamdisplays/tree/0d13cb865ac4d4d6783f556b6e8130291056ccef).
Constats distincts des annonces du projet :
1. Le [serveur expose création et redimensionnement](https://github.com/arnodoelinger/dreamdisplays/blob/0d13cb865ac4d4d6783f556b6e8130291056ccef/api/src/main/kotlin/com/dreamdisplays/api/server/ServerDisplays.kt)
par deux coins et orientation. L'appelant doit vérifier le mur. Ces API sont
marquées `@Unstable` : épingler la version et tester les refus côté serveur.
2. Le [rendu détecte Vulkan](https://github.com/arnodoelinger/dreamdisplays/blob/0d13cb865ac4d4d6783f556b6e8130291056ccef/platform/client/common/src/main/kotlin/com/dreamdisplays/platform/client/render/RenderBackendCompat.kt)
et prévoit l'envoi des textures par l'encodeur de commandes Minecraft.
Un essai Vulkan réel reste nécessaire, y compris pour le filtre pixel.
3. Le [suivi de timeline](https://github.com/arnodoelinger/dreamdisplays/blob/0d13cb865ac4d4d6783f556b6e8130291056ccef/platform/client/common/src/main/kotlin/com/dreamdisplays/platform/client/displays/TimelineFollower.kt)
abandonne la correction de position lorsque `screen.isLive` est vrai.
Pour les VOD, les tolérances initiales sont de **1 500 ms de retard** et
**3 500 ms d'avance**, avec élargissement possible du retard toléré.
Ce code ne démontre donc pas la synchronisation fine demandée.
4. La [sortie audio effective](https://github.com/arnodoelinger/dreamdisplays/blob/0d13cb865ac4d4d6783f556b6e8130291056ccef/media/player/src/main/kotlin/com/dreamdisplays/media/player/pipeline/AudioSink.kt)
utilise Java Sound (`SourceDataLine`). Le projet possède sa propre acoustique,
mais cette sortie ne traverse pas automatiquement celle de Minecraft.
L'interface publique `AudioSink` ne prouve pas qu'un remplacement soit câblable.
5. Le [code des écrans](https://github.com/arnodoelinger/dreamdisplays/blob/0d13cb865ac4d4d6783f556b6e8130291056ccef/platform/client/common/src/main/kotlin/com/dreamdisplays/platform/client/displays/DisplayScreen.kt)
prévoit déjà un état masqué sans upload vidéo, en maintenant le décodeur.
Il faudra distinguer ce gain GPU d'un véritable arrêt du décodage vidéo.
### Autres moteurs
[WATERMeDIA v3](https://github.com/WaterMediaTeam/watermedia-v3) décrit des
moteurs Vulkan et OpenAL séparés. C'est une piste technique réelle, mais le
[commit consulté `2c3dc07`](https://github.com/WaterMediaTeam/watermedia-v3/tree/2c3dc07148a3a16d99d4b9b530e76e0e2c066828)
ne déclare pas 26.3 dans ses propriétés, et l'API Modrinth ne renvoie aucune
version Fabric 26.3 pour `watermedia` ou `waterframes` lors de cette étude.
Son [texte de licence](https://github.com/WaterMediaTeam/watermedia-v3/blob/2c3dc07148a3a16d99d4b9b530e76e0e2c066828/LICENSE.md)
est **Defensive Public Source (Non-Commercial) v1.0.1** : ne pas le traiter
comme une bibliothèque librement interchangeable avec le socle GPL.
Un décodeur FFmpeg ou libVLC peut produire des images CPU et du PCM, puis
Sanctuary peut les envoyer à ses moteurs graphique et audio. C'est réalisable
en architecture ; cela laisse à éprouver les copies mémoire, les composants
natifs par système et la tenue des horloges. Aucun gain matériel ni absence
de copie ne doit être promis sans mesure. Pour
[MCEF](https://github.com/CinemaMod/mcef), aucune version Fabric 26.3 n'est
retournée par la même requête Modrinth ; cela ne prouve pas l'absence d'un port
sur un autre canal, mais ne permet aucune intégration immédiate vérifiée.
## Pose et interactions proposées à partir des décisions
Fabriquer un **cadre de redstone** avec huit bâtons et une redstone centrale.
Poser le cadre sur un mur crée une ancre 1 × 1 et ouvre le menu. L'ancre reste
le coin **inférieur gauche vu de face** ; le choix du mur fixe l'orientation.
Le menu donne largeur, hauteur, aperçu dans le monde et coût restant.
Annuler conserve le cadre 1 × 1 déjà posé ; confirmer applique l'agrandissement.
Les dimensions sont entières, sans fusion automatique avec les écrans voisins.
Des boutons 4 × 3, 8 × 4 et 16 × 9 peuvent accompagner la saisie libre. Une
limite initiale **proposée**, à mesurer, serait 32 × 18 blocs : la taille dans
le monde ne doit pas imposer le décodage d'une vidéo 4K.
L'image conserve son ratio par défaut, avec bandes si nécessaire.
Le coût a été révisé par Koka après les essais du moteur : **un cadre pour
l'ancre, aucun coût pour agrandir**. Réduire ne rend aucun objet ; casser
l'ancre rend un seul cadre en survie. Le [prototype MEDIA-04](media-anchor-prototype.md)
conserve le menu Dream d'origine pour les flux et dessine le cadre sur toute
la surface, avec dimensions libres et budgets serveur configurables.
Avant confirmation, vérifier tout le rectangle : support mural, espace devant,
absence de chevauchement, limites du monde, inventaire et droits de construction
sur chaque chunk traversé. La propriété des commandes de lecture reste distincte
du droit de déplacer ou casser une construction. Perdre un support doit déposer
l'écran une seule fois ; un chunk déchargé ne constitue pas un support détruit.
Le changement de dimensions ne charge pas de chunks de force.
Le rectangle entier est interactif. Le rayon part **des yeux du joueur**, dans
la direction du viseur ; il rencontre le premier obstacle ou écran admissible.
Le serveur recalcule portée, visibilité, dimension et cible pour chaque action :
un paquet client ne suffit pas à autoriser l'interaction.
- **Clic droit jusqu'à 16 blocs** : ouvrir le lecteur ; changer la vidéo,
lecture/pause et déplacement dans une VOD agissent sur la séance commune.
- **Volume, muet, qualité et participation** : réglages personnels.
- **Maj + clic droit à portée habituelle de construction** : dimensions et
entretien pour les joueurs ayant les droits de construction. À distance,
présenter le lecteur sans accorder la modification de géométrie.
- Une action explicite du lecteur modifie la séance ; ouvrir le menu seul
ne met pas tous les joueurs en pause. Afficher qui a déclenché une action
et borner sa fréquence pour éviter les répétitions accidentelles.
Une seule ancre logique et un seul rectangle sont préférables à une entité
et un lecteur par bloc. L'index spatial doit couvrir toute la surface : un
grand écran ne doit pas disparaître parce que son ancre est hors du champ.
Prévoir les libellés FR/EN, par exemple « Cadre de redstone / Redstone frame »,
« Largeur / Width », « Hauteur / Height » et « Séance partagée / Shared session ».
Les identifiants de nouveaux objets seront fixés avant leur premier enregistrement.
## Synchronisation et charge
Le serveur garde l'identité du média, l'identifiant de séance, la révision,
l'état lecture/pause, une position de référence et une horloge. Les clients
récupèrent le média directement auprès de sa source, le décodent et l'affichent.
Les images et les échantillons audio ne transitent pas par les paquets Minecraft.
Cela épargne le trafic vidéo au serveur ; chaque spectateur utilise néanmoins
sa propre bande passante. « Sans télécharger » signifie sans télécharger
préalablement tout le fichier : les données doivent toujours arriver chez lui.
Pour une VOD, estimer le décalage d'horloge avec plusieurs échanges réseau,
programmer le démarrage après une prélecture et calculer la position attendue
depuis une horloge monotone, indépendante du temps du monde et des TPS.
Corriger progressivement les petits écarts si le lecteur le permet ; réserver
les sauts aux écarts importants. Les événements lecture/pause/source sont
immédiatement annoncés avec leur instant d'effet ; les états périodiques sont
espacés. Les révisions empêchent un ancien paquet de rétablir une ancienne vidéo.
Un entrant rejoint la position commune. Un client lent rebufférise puis rejoint
la séance ; proposition : il ne met pas automatiquement tous les autres en pause.
Si l'API amont ne permet pas cette horloge et ces corrections, un fork ou un
autre moteur devient nécessaire. Diminuer ses seuils de seek ne suffit pas à
prouver une synchronisation plus stable.
Pour le direct, lancer la même URL simultanément ne garantit pas le même contenu
au même instant. Il faut une référence temporelle commune dans le média, puis
viser cette référence avec un retard partagé. Les dates de segments HLS
[`EXT-X-PROGRAM-DATE-TIME`](https://datatracker.ietf.org/doc/html/rfc8216#section-4.3.2.6)
peuvent aider lorsqu'elles existent ; les discontinuités et variantes doivent
être traitées. Sans timeline comparable ou fenêtre de reprise suffisante,
signaler une synchronisation approximative ou refuser le mode strict.
L'[embed officiel Twitch](https://dev.twitch.tv/docs/embed/video-and-clips/)
ne fournit pas de seek live et réserve `getCurrentTime` aux VOD : un navigateur
ne résout donc pas à lui seul la contrainte. Publicités individualisées,
buffering, restrictions d'accès ou variantes différentes peuvent séparer les
spectateurs. Une source commune contrôlée ou un relais média **distinct**
pourrait améliorer la maîtrise, mais ajouterait exploitation et bande passante ;
ce serait un choix séparé, jamais une charge vidéo implicite du serveur Minecraft.
Objectifs de prototype proposés, **non mesurés** : écart entre clients ≤250 ms
pour une VOD stable et ≤500 ms pour un live offrant une référence commune,
au 95e percentile sur dix minutes. Mesurer séparément retard sur le direct,
écart entre spectateurs et désynchronisation audio/vidéo. Un tampon de plusieurs
secondes est envisageable ; sa valeur dépend de la source et des connexions.
## Pixellisation et culling
Un écran `W × H` blocs a une grille de `16W × 16H` pixels :
8 × 4 → 128 × 64 ; 16 × 9 → 256 × 144. Réduire l'image avec préfiltrage,
puis agrandir sans lissage pour conserver des pixels nets. Un simple
échantillonnage nearest d'une vidéo haute résolution peut scintiller ; comparer
le résultat sur du mouvement. Le filtre reste une option par écran ; un réglage
personnel de qualité peut limiter la charge sans changer la séance.
Ce filtre réduit le coût d'affichage et de transfert si la réduction est faite
avant l'upload. Il ne réduit pas automatiquement le débit ou le coût du décodage
d'une source 1080p. Sélectionner aussi une variante adaptée et borner cadence,
mémoire et nombre de séances actives. Partager un décodeur entre plusieurs
surfaces **de la même séance**, pas simplement entre deux URLs identiques
qui pourraient être lues à des positions différentes.
| État local | Vidéo | Audio |
| --- | --- | --- |
| Surface visible | Décodage et upload dans les budgets fixés | Son spatial |
| Hors champ ou derrière le joueur, son audible | Aucun dessin ni upload ; supprimer le décodage vidéo si le moteur le permet | Continue |
| Masqué par un mur | Même politique de visibilité, sans confondre masquage et mute | Propagation et absorption acoustiques |
| Hors portée visuelle et auditive, sans aperçu ouvert | Libérer le lecteur après une courte temporisation | Arrêt local |
| Retour dans la zone | Reprendre la position de séance actuelle | Reprendre synchronisé |
L'occlusion visuelle ne prouve pas l'inaudibilité. L'abonnement à l'audio doit
rester indépendant de la visibilité et du suivi des entités Minecraft.
Éviter les changements incessants à la limite de portée. Le déchargement d'un
lecteur local ne met pas la séance serveur en pause et ne force aucun chunk.
## Audio, disques et sources
Le premier écran émet son propre son à un point de sa surface, avec atténuation
spatiale, volume personnel et catégorie dédiée. Pour que Sound Physics
l'affecte, il faut fournir le PCM au moteur audio Minecraft ou appeler une
intégration explicite sur une source compatible. Son
[code `processSound`](https://github.com/henkelmax/sound-physics-remastered/blob/06368ea194f056097201f8395ea418c831d562da/common/src/main/java/com/sonicether/soundphysics/SoundPhysics.java)
travaille sur des sources OpenAL : Java Sound seul ne suffit pas. Même une
source OpenAL extérieure doit partager le contexte et les hooks appropriés.
Éviter d'appliquer simultanément l'acoustique Dream et celle de Sound Physics.
Le son spatial de base doit fonctionner lorsque ce dernier est absent ou éteint.
Le disque blanc pourra porter une référence stable validée, jamais un fichier
audio complet ni une URL signée expirante sauvegardée comme identité. Proposition :
renommer avec une référence YouTube reconnue permet son inscription ; un petit
menu de collage évite les limites pratiques d'une longue URL dans un nom.
Le jukebox créera ensuite une séance audio avec le même modèle de serveur et
les mêmes contrôles personnels. Enceintes liées et mixeur spatial restent un
lot ultérieur, pour ne pas multiplier les décodages ni faire doubler le son
de l'écran et du jukebox.
| Source | Faisabilité et périmètre proposé |
| --- | --- |
| Fichier vidéo/audio HTTP(S), flux HLS compatible | Première preuve du lecteur, du son et de l'horloge ; vérifier les codecs exacts |
| YouTube VOD puis live | Connecteur de résolution ; revalider les liens expirants et les erreurs de lecture |
| Twitch | Connecteur live spécifique et preuve de timeline commune ; aucune promesse de synchro stricte par simple URL |
| Page contenant un lecteur HTML5 | Une page n'est pas une URL média ; connecteur nécessaire si elle cache son manifeste ou dépend de scripts/authentification |
| ANI-CLI | Référence de recherche/résolution de sources, à traiter séparément du lecteur Minecraft |
| Spotify | Ne pas annoncer la lecture de morceaux complets comme une simple URL audio |
[ANI-CLI](https://github.com/pystardust/ani-cli/tree/0301d67d5768d332b049821a30082ad43d9a215a)
est un outil shell qui résout des liens et lance un lecteur externe. Une
intégration éventuelle doit séparer catalogue, sélection d'épisode, résolution,
pistes audio/sous-titres et lecture. Le lien peut nécessiter des métadonnées
de requête et expirer ; il ne devient pas une source universelle parce qu'il
fonctionne dans mpv. Ne pas imposer Bash et ANI-CLI à tous les clients avant
d'avoir défini et éprouvé ce connecteur sur leurs systèmes.
La [politique Spotify](https://developer.spotify.com/policy) réserve le streaming
aux abonnés Premium et exclut notamment les jeux et certains usages simultanés.
Ce scénario n'a donc pas de voie officielle simple identifiée. Une référence
Spotify pourrait servir à identifier un titre et proposer une autre source
explicitement choisie ; cela ne constitue pas une prise en charge audio Spotify.
Les URLs média doivent être validées côté serveur et client : HTTP(S), limites
de taille et de redirections, pas de fichier local ni d'accès réseau privé
déclenché par un autre joueur. Les liens autorisés et la participation restent
configurables ; aucun cookie personnel partagé ni URL à jeton dans les journaux.
## Lots vérifiables proposés
1. **MEDIA-02 — Faisabilité du moteur.** Monde neuf de développement, serveur et
deux clients 26.3 ; vidéo de test horodatée et flux live contrôlé, Vulkan
avec Sodium puis sans. Vérifier image, son, dérive, retour dans la zone,
mémoire et arrêt propre. Produire une décision extension/fork/moteur original.
2. **MEDIA-03 — Cadre et surface.** Recette, menu FR/EN, aperçu, coût par bloc,
restitution, mur et claims, raycast 16 blocs, clics sur toute la surface,
concurrence et rechargement. Source contrôlée seulement, puis filtre 16 pixels.
3. **MEDIA-04 — Séances et sources publiques.** Contrôles communs à tous les
spectateurs, arrivée tardive, buffering et déconnexion ; YouTube puis Twitch,
avec métriques et limites annoncées pour chaque source.
4. **MEDIA-05 — Disque blanc.** Inscription, lecture audio par jukebox, éjection,
sauvegarde et reconnexion ; réutilisation du lecteur et de l'horloge.
5. **MEDIA-06 — Sources complémentaires.** ANI-CLI/catalogue et sous-titres,
puis éventuellement enceintes et mixeur selon les besoins constatés.
Pour chaque lot de code : branche dédiée, prochain compteur beta libre,
`./gradlew check build`, tests ciblés du comportement ; `assemblePack` lorsque
la distribution change. Vérifier les composants natifs par OS/architecture,
leurs licences, leur intégrité et les téléchargements du premier lancement.
Épingler les artefacts packwiz avant une livraison demandée. Aucun décodeur
ni navigateur ne doit être chargé par erreur côté serveur dédié.
Toute donnée persistante nouvelle doit avoir son contrat de version avant
son premier usage dans un monde existant.
## Vérifications de cette étude et limites
- État Git initial lu ; travail isolé depuis beta.293 et changements beta.294
conservés dans leur checkout.
- Requêtes Modrinth filtrées exactement par `game_versions=["26.3"]` et
`loaders=["fabric"]` : huit versions Dream, zéro pour chacun des projets
`watermedia`, `waterframes`, `mcef` et `webdisplays` au moment de la lecture.
- Intégrité et métadonnées du JAR Dream 1.10.4 vérifiées sans l'installer.
- Sources amont et contrats d'API lus aux références précisées dans ce document.
- Aucune compilation, mesure de performances, lecture audible, synchronisation
réelle à deux clients ou validation graphique n'a été réalisée pour ce ticket
documentaire. Aucun essai OpenGL ne fait partie du plan de validation.
- Les plafonds de taille et de lecteurs, le comportement d'un client lent,
les restitutions et l'inventaire des systèmes clients restent des propositions
à préciser dans les lots de réalisation.
Le choix d'implémentation reste conditionné par MEDIA-02. Aucun artefact pack,
serveur Beta, canal stable, installation Prism ou monde personnel n'est modifié.
+88
View File
@@ -0,0 +1,88 @@
# MEDIA-06 — interaction et épaisseur des cadres
Retours du 26 octobre 2026 après essai de beta.296. Branche
`codex/media-frame-fixes`, **beta.297**, module Media **0.3.1**.
[Livraison complète du 27 octobre 2026](release-beta297.md).
## Comportement demandé
Le menu largeur/hauteur s'ouvre automatiquement seulement à la pose. Ensuite,
clic droit et **Maj + clic droit** ouvrent le lecteur Dream. Le bouton
**Taille / Size** de ce lecteur reste le point d'entrée pour redimensionner,
avec les mêmes vérifications serveur de proximité et de construction.
Appliquer une taille garde le menu ouvert pour l'ajuster ; aucune modification
du coût, de la recette ou des tailles autorisées.
Les trois chemins sont alignés : raycast client, paquet d'ouverture serveur
et interaction directe avec le bloc. La pose initiale conserve sa demande
explicite du menu de taille.
## Rendu
Le pixel rouge était un repère d'ancrage ajouté par Sanctuary. Il est retiré
du cadre du monde et de l'aperçu de taille.
Le cadre précédent utilisait le repère vidéo Dream. Celui-ci applique une
échelle Z nulle : c'est un dessin plat, sans faces latérales. Le nouveau
maillage est un anneau fermé en unités de blocs : quatre bandes avant,
quatre arrière, quatre côtés extérieurs et quatre faces de feuillure.
Épaisseur et largeur du bois : **1/16 de bloc**, indépendamment de la taille.
Le contour extérieur est exactement celui de l'écran, au contact du mur.
La vidéo conserve son plan et ses proportions, en retrait du bois.
Les sommets sont calculés depuis la géométrie de l'ancre et ramenés dans le
repère du renderer Dream sans passer par sa transformation vidéo aplatie.
Ils gardent les mêmes positions dans les passes normale et de reprise :
aucune deuxième bordure décalée. Le pipeline Vulkan Dream et sa profondeur
restent utilisés, sans nouveau shader.
La vidéo et les sous-titres sont masqués depuis l'arrière du plan, et depuis
les côtés lorsque l'observateur est derrière la face avant du bois et hors
de l'ouverture. Cela évite un liseré vidéo en vue rasante ; une caméra située
dans l'ouverture conserve l'image. Le cadre en volume reste visible.
Le son reste actif, et les uploads vidéo
sont suspendus comme pour un écran hors champ. Les écrans Dream ordinaires
gardent leur rendu.
L'ancre invisible ne dessine plus son contour de sélection vanilla 1 × 1 à
l'intérieur d'un grand écran. Sa forme d'occlusion est explicitement vide ;
sa forme de ciblage reste disponible pour casser le bloc. Les validations
du mur et le retrait de l'écran côté serveur sont conservés.
## Données et livraison
Aucun identifiant, paquet ou format de sauvegarde ne change. Les écrans posés
en beta.296 retrouvent le nouveau rendu à partir de leurs données existantes,
sans remplacement de blocs ni conversion de monde. Aucun monde personnel
ou serveur personnel n'est utilisé pour la validation.
Le correctif est publié en beta.297 et installé sur la Beta, le site et la
même instance Prism. Les essais de développement ont précédé cette livraison.
## Validation
- `check build assemblePack assembleServerPack` : **réussi en 4 min 17 s**,
158 tâches, **18 GameTests requis** (`property270,claims272,claims277,claims278`).
- Contrat Java du maillage : 16 faces non dégénérées, bornes exactes et
épaisseur constante sur quatre tailles et les quatre orientations ; vidéo
visible dans l'ouverture et masquée derrière le bois depuis les côtés.
- **17 contrôles interactifs** réussis : nouvelle pose, réouverture normale,
Maj réellement maintenue, bouton Taille et protections/inventaire existants.
- Après correction du dernier liseré vidéo : contrats Media et assemblages
ciblés réussis en **21 s**, puis nouvel essai avec le JAR final embarqué.
- Deux clients **Vulkan**, Sodium et Sound Physics, vidéo synthétique sur
écran **9 × 5**. Captures inspectées de face, de droite, de gauche, du haut
et de l'arrière : côtés présents, aucun repère rouge ni fente colorée.
- Depuis droite/gauche/haut/arrière : uploads de l'image arrêtés et curseur
OpenAL toujours en mouvement ; retour devant : uploads repris.
- Sept tests du rapport et compilation syntaxique Python réussis.
Le premier laboratoire `frame-fixes-01` valide l'interaction ; ses premières
vues rasantes ont révélé le liseré restant. Seules les captures de
`build/media-prototype/frame-fixes-02/` valident son retrait final. Le maillage
est testé numériquement sur quatre orientations ; le parcours graphique est
orienté sud. Aucune nouvelle validation de live public ou d'écoute subjective.
[Relevé structuré](media-frame-fixes-results.json). Le
[reçu de livraison](release-beta297.md) distingue ces essais du déploiement
et de ses vérifications opérationnelles.
+77
View File
@@ -0,0 +1,77 @@
{
"ticket": "MEDIA-06",
"version": "beta.297",
"media_version": "0.3.1",
"state": "published and installed on Beta server, Web distribution and existing Prism instance",
"delivery": {
"date": "2026-10-27",
"receipt": "release-beta297.md",
"source_tag": "bad2bdb0d12295a736aee64e08b9f6f5a8ae81d3",
"packwiz_commit": "e40b0d372af9fa43a301b842661c131f4e69f7c7",
"fresh_check_build_assemble": "passed, 2m57s, 158 tasks, 18 required GameTests; identical JAR to final Vulkan validation"
},
"branch": "codex/media-frame-fixes",
"artifact_sha256": "f9bfffb0198abb8a4eae8a6d76a1ad3f1190edda7ce33f719bd47f0f4da27d9d",
"interaction_suite": {
"passed": [
"one frame consumed on placement",
"first placement opens dimensions",
"reopening near the anchor opens native player",
"Shift-right-click also opens native player",
"custom 7x4 and free enlargement",
"shrinking does not refund frames",
"resizing keeps the same display",
"oversize refused",
"incomplete wall refused",
"stale revision refused",
"native delete, overlap, obstacle and unloaded chunks refused",
"building permission required",
"original Dream reader on remote overlay while holding frame",
"forged remote resize refused",
"wall blocks normal interaction",
"wall blocks forged open packet",
"original Dream reader available to second spectator"
]
},
"final_graphics_checks": {
"placement_opens_dimensions": true,
"ordinary_click_player": true,
"shift_click_player": true,
"right_video_hidden_audio_continues": true,
"left_video_hidden_audio_continues": true,
"top_video_hidden_audio_continues": true,
"back_video_hidden_audio_continues": true,
"front_picture_resumes": true
},
"environment": {
"minecraft": "26.3",
"backend": "Vulkan",
"clients": 2,
"dream": "1.10.4",
"sound_physics": "1.5.1+26.3",
"screen_blocks": [
9,
5
],
"camera_views": [
"front",
"right grazing",
"left grazing",
"top grazing",
"back",
"front after hidden"
]
},
"validation": {
"full_check_build_assemble": "passed, 4m17s, 158 tasks, 18 required GameTests",
"final_client_visibility_contracts_and_assembly": "passed, 21s, 27 tasks",
"image_inspection": "five final views inspected; no red marker, no colored video slit through sides",
"python_report_tests": 7
},
"diagnostic": "frame-fixes-01 grazing images precede the final video visibility fix; final images are frame-fixes-02",
"limits": [
"No new public streaming or audio listening validation",
"Graphical wall faces south; all four orientations checked numerically",
"Graphical tests used development instances; deployment to the existing personal installation is documented in the delivery receipt, no personal world opened"
]
}
+232
View File
@@ -0,0 +1,232 @@
# MEDIA-02 — Prototype de lecture à deux clients Vulkan
Suite : [MEDIA-03 — correction de synchronisation et pont audio](media-sync-audio-prototype.md).
Les mesures ci-dessous décrivent Dream Displays intact, avant cette extension.
Branche `codex/media-playback-prototype`, **26 octobre 2026**, base Sanctuary
**beta.293**, à la suite de [MEDIA-01](media-displays-study.md).
Le prototype utilise de vrais clients Minecraft réseau et un serveur dédié
local. Aucun cadre Sanctuary n'est développé. Le module de mesure
[`mods/media-probe`](../mods/media-probe/README.md) est compilé séparément et
n'entre dans aucun pack : aucune livraison du mod Sanctuary, aucun compteur
beta ni manifeste packwiz modifié.
## Décision issue de l'essai
**Dream Displays constitue une base de rendu et de lecture utilisable sous
Vulkan, mais son comportement intact ne satisfait pas la synchronisation fine
du groupe et ne fait pas passer le son vidéo dans Sound Physics.** La prochaine
preuve doit porter sur l'horloge commune du live et une sortie PCM compatible
avec le moteur audio Minecraft, avant les cadres.
Les premières tentatives avaient un défaut du laboratoire : les deux clients
choisissaient la même couleur dans Hello World. L'un restait dans le formulaire,
pendant que l'autre commençait à lire. Koka l'a observé et signalé. Le lancement
retenu utilise des couleurs distinctes et attend **les deux joueurs admis,
dans le monde, sans menu bloquant**, avant de transmettre la nouvelle source.
Le départ décalé de cette première tentative n'est pas une mesure de la dérive
du lecteur. Les résultats ci-dessous viennent de la relance `review-05` corrigée.
## Environnement et méthode
- Minecraft **26.3**, Fabric Loader **0.19.5**, API **0.160.5+26.3**, Java **25**.
- Dream Displays **1.10.4**, JAR exact `siUKU04U`, SHA-512 vérifié par le lanceur.
- Sound Physics Remastered **1.5.1+26.3** ; activé et désactivé uniquement dans
les configurations des clients de laboratoire.
- Série principale : Sodium **0.9.2+mc26.3**, backend **Vulkan**, MoltenVK **1.4.2**,
Apple M1 et **8 Gio de RAM système**. Serveur et deux clients sur le même Mac.
- Tas plafonnés à 768 Mio serveur et 1 536 Mio par client. Vue de trois chunks,
deux joueurs créatifs dans un monde plat neuf, graine **2602**, écran Dream
de béton noir de 9 × 5 blocs. Shaders Sanctuary éteints.
- Source synthétique H.264/AAC de **320 × 180 à 30 images/s**, durée **660 s**,
motif animé et numéro d'image encodé en 16 bandes noires/blanches. Le live HLS
répète cette source, avec segments d'une seconde, fenêtre de douze segments
et `EXT-X-PROGRAM-DATE-TIME`. Source desservie sur loopback avec HTTP Range.
- FFmpeg système **8.1.2**, sélectionné par le cache amont isolé. La bibliothèque
libav embarquée ne s'ouvre pas sur cette machine ; Dream utilise son chemin
natif de tuyauterie avec processus FFmpeg. Ce repli fait partie du résultat.
Des logs montrent des sorties de décodage redimensionnées à 1296 × 720 :
la petite source ne signifie donc pas que toutes les copies internes sont petites.
Le code temporel est vérifié après encodage aux secondes 1, 10 et 25 : images
30, 300 et 750 retrouvées. La sonde lit ensuite ce code et note les **uploads
GPU réussis** dans chaque client, avec leur heure. Le rapport aligne les
observations distantes d'au plus 150 ms, corrige leur décalage d'observation
et sépare les quinze premières secondes de chaque phase. Le bouclage de la
source est pris en compte. Résolution temporelle du média : environ 33 ms.
Ce sont des mesures d'envoi d'images au GPU, **pas du balayage physique de
l'écran**. Les captures Minecraft vérifient que les surfaces sont réellement
visibles. Le rapport expose aussi les échantillons manquants et les erreurs
de sonde ; une absence de données n'est jamais un succès.
## Résultats de la série avec Sodium
Écarts absolus entre les deux clients, après les quinze premières secondes :
| Phase | Durée observée | Paires | Médiane | 95e percentile | Maximum |
| --- | ---: | ---: | ---: | ---: | ---: |
| VOD, départ avec les deux clients prêts | 142 s | 504 | 181 ms | **337 ms** | 368 ms |
| Même VOD, Sound Physics activé | 126 s | 443 | 242 ms | **332 ms** | 335 ms |
| Live, départ commun | 175 s | 640 | 25 ms | **57 ms** | 75 ms |
| Live, Sound Physics activé | 90 s | 299 | 49 ms | **128 ms** | 134 ms |
| Live, après arrêt puis retour du client B | 139 s | 374 | 549 ms | **580 ms** | 592 ms |
| Retour des caméras vers l'écran | 35 s | 80 | 611 ms | **636 ms** | 639 ms |
| Fin du live après le retour | 91 s | 304 | 721 ms | **741 ms** | 745 ms |
Les durées incluent les transitions et, pour la reconnexion, l'absence du client ;
le nombre de paires indique ce qui a effectivement été comparable. Le client B
est arrêté, attendu vingt secondes, puis relancé dans le live en cours.
Il ne s'agit pas d'un simple joueur simulé sur le serveur.
Les deux clients tiennent une médiane de **30 FPS** dans les phases de lecture
stable de cette scène. Aucun échec de sonde n'est enregistré dans la série.
Cela ne constitue pas une validation de plusieurs écrans, de contenu 1080p/4K
ou de machines différentes.
Les cibles exploratoires de MEDIA-01 étaient 250 ms pour une VOD et 500 ms
pour un live. La VOD dépasse sa cible et le live la dépasse après reconnexion.
Le bon résultat du départ live reflète ici une source et un réseau locaux
communs ; il ne prouve pas une correction serveur de la position live.
Les sources amont examinées dans MEDIA-01 ignorent justement cette correction
pour les médias live. Les résultats ne démontrent pas une causalité de Sound
Physics sur la dérive : l'ordre des phases et le temps écoulé diffèrent.
## Audio et visibilité
L'activité réelle de la ligne **Java Sound** est observée dans les deux clients.
Sound Physics initialise ses effets EFX et la sonde voit notamment ses appels
pour les sons témoins `minecraft:block.note_block.pling`, joués toutes les cinq
secondes. La ligne vidéo continue à avancer pendant l'activation de Sound Physics
et le rechargement du moteur audio Minecraft.
**Coexistence observée ; intégration acoustique vidéo absente.** Le son vidéo
sort par `SourceDataLine`, tandis que Sound Physics traite les sources OpenAL
Minecraft. Aucun nouvel appel Sound Physics correspondant à la source vidéo
n'apparaît. Le traitement spatial propre de Dream est désactivé pour cet essai,
afin de ne pas lui attribuer les effets de Sound Physics. Une passerelle PCM
ou une autre sortie audio est donc requise. Aucune écoute subjective de
réverbération, mesure de sortie physique ou capture du microphone n'est revendiquée.
Pendant la phase hors champ de 35 secondes, les caméras regardent à l'opposé :
| Client | Intervalle comparable | Nouveaux uploads GPU | Trames PCM jouées |
| --- | ---: | ---: | ---: |
| A | 34,25 s | **0** | **1 510 454** |
| B | 34,00 s | **0** | **1 499 165** |
L'audio continue donc quand l'image n'est plus envoyée au GPU. Au retour,
les uploads reprennent. Le décodeur reste actif : ce résultat valide le masquage
des uploads, pas une économie complète de décodage. Le coût de plusieurs sources
et l'occlusion par un mur restent à tester séparément.
## Reproduire dans un nouveau laboratoire
Java 25, Python **3.11 ou plus récent**, FFmpeg avec encodeur H.264 et un poste
graphique Vulkan sont requis. Garder de l'espace disque pour les dépendances,
le swap du système et les mondes de test ; la saturation observée lors d'une
première tentative a été exclue de la série retenue. Seuls des doublons de
médias et binaires générés par ce laboratoire ont été supprimés ou dédupliqués.
```sh
JAVA_HOME=$(/usr/libexec/java_home -v 25) ./gradlew \
:sanctuary-test:exportDuoLaunch --max-workers=1 \
-Dorg.gradle.jvmargs=-Xmx1G
python3.14 scripts/media_lab.py prepare --run essai-neuf
python3.14 scripts/media_lab.py server --run essai-neuf
# Attendre MEDIA_PROBE_SERVER_READY, puis lancer les deux clients :
python3.14 scripts/media_lab.py client-a --run essai-neuf
python3.14 scripts/media_lab.py client-b --run essai-neuf
# Dans un terminal distinct ; cette commande reste active :
python3.14 scripts/media_lab.py serve --run essai-neuf
```
Dans un autre terminal, conserver chaque phase de lecture deux à trois minutes
avant la transition suivante. Les commandes ci-dessous décrivent les transitions,
pas un scénario à exécuter sans attente :
```sh
python3.14 scripts/media_lab.py control --run essai-neuf \
--phase vod --source vod
# L'URL n'est appliquée qu'après admission effective des deux clients.
python3.14 scripts/media_lab.py control --run essai-neuf \
--phase vod-spr --sound-physics
python3.14 scripts/media_lab.py live --run essai-neuf
python3.14 scripts/media_lab.py control --run essai-neuf \
--phase live --source live --sound-physics
# Tester aussi une arrivée tardive : arrêter seulement B, attendre, puis relancer.
python3.14 scripts/media_lab.py stop --run essai-neuf --target client-b
sleep 20
python3.14 scripts/media_lab.py client-b --run essai-neuf
python3.14 scripts/media_lab.py control --run essai-neuf \
--phase live-hidden --sound-physics --look-away
python3.14 scripts/media_lab.py control --run essai-neuf \
--phase live-visible --sound-physics
python3.14 scripts/media_lab_report.py build/media-prototype/essai-neuf
python3.14 scripts/media_lab.py stop --run essai-neuf
# Arrêter aussi le terminal « serve » avec Ctrl-C.
```
Un nom de session existant est refusé par `prepare`. Les sources, paramètres,
PID, scènes et configurations résident exclusivement sous `build/media-prototype/`.
Le mode hors ligne et l'autorisation d'URL privées concernent uniquement ces
processus sur `127.0.0.1`. Ne pas transposer ces réglages au pack ou à la Beta.
Pour le parcours sans Sodium, ajouter `--without-sodium` à `prepare`.
## Preuves locales et vérifications
- Série principale : `build/media-prototype/review-05/report.json`, journaux
`server.log`, `client-a.log`, `client-b.log`, mesures `*.jsonl` et manifeste.
- Captures de contrôle :
[client A](../build/media-prototype/review-05/client-a/screenshots/media-live-final-proof.png),
[client B](../build/media-prototype/review-05/client-b/screenshots/media-live-final-proof.png).
- Six tests du calcul de mesure : observation décalée sans dérive, décalage réel
de 300 ms, image ancienne, deuxième client absent, observations trop éloignées
et passage au bouclage de la source. `python3 -m unittest discover -s scripts
-p test_media_lab_report.py` réussi.
- Les sources de la sonde sont compilées par `javac --release 25` dans le
lanceur. L'intégrité des artefacts Dream et Sodium est vérifiée avant usage ;
le profil Loom conserve la vérification SPR du dépôt.
Le parcours **sans Sodium** utilise `build/media-prototype/without-sodium-01/`,
deux vrais clients Vulkan et Sound Physics activé. Sur **162 s** de VOD,
588 paires après quinze secondes : médiane **172 ms**, 95e percentile **242 ms**,
maximum **265 ms**, médiane de 30 FPS. Le rendu est aussi vérifié par les captures
et les compteurs d'upload. Ce parcours court ne démontre pas que Sodium explique
la différence avec la première série, et ne valide pas le live sans Sodium.
`check build` réussit en **3 min 4 s**, 145 tâches, avec les **18 GameTests serveur
requis réussis** et les autres contrôles du dépôt. Commande exacte :
```sh
JAVA_HOME=$(/usr/libexec/java_home -v 25) ./gradlew check build \
--max-workers=1 -Dorg.gradle.jvmargs=-Xmx1G \
-PsanctuaryFocusedTests=property270,claims272,claims277,claims278 \
-PsanctuaryAtlasOnly=true --console=plain
```
Journal : `build/media-prototype/check-build-retry.log`. La première invocation
échouait dans la préparation du cache Loom, avant les tests, faute d'espace.
Seul le cache régénérable de ce worktree et un téléchargement du laboratoire
ont été retirés avant la relance. Les mesures des deux séries retenues ne
contiennent pas d'erreur de disque plein. Aucun `assemblePack` n'est nécessaire
pour cette sonde séparée ; la distribution est inchangée.
Les processus Minecraft et FFmpeg des deux séries, ainsi que leurs serveurs
HTTP, sont arrêtés après les mesures. Les fichiers de preuve restent présents.
Aucune installation personnelle, aucun monde de joueur,
serveur Beta, canal packwiz ou instance Prism n'a été modifié.
## Limites et suite
Les phases sont exploratoires et durent quelques minutes, pas dix minutes
chacune. Les clients partagent le même Mac et le même réseau loopback ; les
résultats ne prouvent pas une tenue à distance, sous pertes réseau ou sur Windows
et Linux. YouTube et Twitch n'ont pas été utilisés comme sources pendant ces
mesures : leur résolution, leurs variantes et leurs publicités restent ouverts.
Avant les cadres, réaliser une preuve ciblée de suivi live par référence de
média commune, y compris après reconnexion, et une preuve de sortie PCM vers
Minecraft/OpenAL avec Sound Physics. Éviter de diminuer seulement les seuils
de seek VOD : ce prototype ne montre pas que cela corrigerait le live.
+175
View File
@@ -0,0 +1,175 @@
# MEDIA-03 — Synchronisation et acoustique des vidéos
Suite : [MEDIA-04 — ancre unique, cadre complet et menu Dream d'origine](media-anchor-prototype.md).
Branche `codex/media-sync-audio`, **26 octobre 2026**, base Sanctuary **beta.293**.
Suite de [MEDIA-02](media-playback-prototype.md). Le module séparé
[`sanctuary-media`](../mods/sanctuary-media/README.md), **0.2.0-prototype**, corrige
le lecteur expérimental ; aucun cadre n'est développé, aucun pack ni monde
personnel modifié. Ce n'est pas une nouvelle livraison des binaires Sanctuary :
les compteurs beta et le canal stable restent inchangés.
## Comportement
Chaque client estime l'heure du serveur avec des échanges ping/réponse et remet
son estimation à zéro après déconnexion. Le serveur garde la timeline, sans
décoder, télécharger ou retransmettre la vidéo. L'estimation retient le plus
petit aller-retour récent ; son évolution est bornée et monotone.
La VOD utilise cette timeline dès le démarrage des décodeurs audio **et vidéo**.
Avancer seulement le curseur audio était insuffisant : lors d'une première
tentative de reconnexion, FFmpeg redécodait la vidéo depuis zéro. Le correctif
`SessionStartMixin` donne maintenant l'offset serveur à la session de décodage.
Les commandes FFmpeg de la reprise vérifiée contiennent `-ss 96.593000` pour
les deux pistes. Les petites corrections suivent le nombre d'échantillons
effectivement consommés par OpenAL, avec une vitesse limitée à ±2 %. Un retard
de plus de 200 ms supprime le PCM en retard. Le rattrapage ne dépend pas du motif
de la vidéo de test. L'avance empirique de 2,5 secondes de Dream est retirée.
Pour le live **HLS média avec `EXT-X-PROGRAM-DATE-TIME`**, un service loopback
propre à chaque client fixe les trois premiers segments et leurs origines
audio/vidéo. Il réécrit les manifestes, pas les médias : les segments restent
téléchargés directement par le client. Les deux lecteurs suivent la même heure
avec **huit secondes de retard commun**. L'origine vidéo et l'origine audio
peuvent différer ; le pont compense cet écart. Les nouvelles images restent
masquées tant que leur origine est dans le futur par rapport à ce retard.
Le PCM Dream passe dans une source **OpenAL mono spatialisée**, dans le contexte
audio de Minecraft, au centre de l'écran. Le curseur de volume **Jukebox / blocs
musicaux** reste applicable. Dream conserve son atténuation de distance ; son
DSP acoustique est désactivé pour éviter l'empilement. Sound Physics évalue la
source fixe quatre fois par seconde. L'évaluation utilise la catégorie interne
BLOCKS, car SPR ignore RECORDS quand `update_moving_sounds=false` ; le volume
reste celui des disques. Le pont ne possède ni ne ferme le contexte Minecraft.
## Réglage demandé : exclure les vidéos de Sound Physics
Dans **Options → Sons → Sound Physics Remastered → Acoustique des vidéos** :
- **Oui**, par défaut : réverbération, occlusion et absorption Sound Physics.
- **Non** : détache le filtre direct et les quatre envois de réverbération,
remet l'absorption de l'air à zéro ; son positionnel, volume et synchro conservés.
Le choix est propre au client, persiste dans `config/sanctuary-media.json` sous
`videoAcoustics` et prend effet pendant la lecture, sans recharger tout le son.
Libellés et infobulle FR/EN. L'autre joueur et les sons Minecraft conservent leur
propre acoustique. Le module de test actionne le vrai bouton dans l'interface.
## Méthode et preuves
Même environnement contrôlé que MEDIA-02 : Minecraft **26.3**, Java **25**,
Dream **1.10.4** exact, SPR **1.5.1+26.3**, Sodium **0.9.2+mc26.3**, deux JVM
clientes et serveur dédié local, **Vulkan / MoltenVK 1.4.2 / Apple M1 8 Gio**.
Monde plat neuf, graine **2602**, joueurs admis avec couleurs Hello World
distinctes avant transmission de la source. VOD synthétique H.264/AAC 30 i/s,
660 secondes ; live généré à partir de cette source, segments d'une seconde
avec date UTC. Chemin natif Dream avec processus FFmpeg système **8.1.2** ;
le backend libav embarqué ne se charge pas sur ce poste.
La sonde lit le numéro d'image sur les uploads GPU réussis et compare les
clients avec correction de l'instant d'observation. Résolution d'une image
à 30 i/s, pas une mesure de scanout des moniteurs. Les observations distantes
de plus de 150 ms, les images figées depuis 500 ms, les clients déconnectés
et les sorties OpenAL en attente sont exclues du calcul de dérive ; leur
couverture reste comptée. Aucune mesure d'écoute subjective ni de sortie
haut-parleur : la preuve audio porte sur les curseurs PCM et filtres appliqués.
Traces et captures conservées sous `build/media-prototype/sync-audio-04/`.
Les séries `sync-audio-01/02/03` sont des diagnostics intermédiaires, pas la
validation finale. Dans `04`, la phase `vod-rejoin` reproduit le défaut de
décodage avant `SessionStartMixin` ; seules les phases `vod-final-*` valident
sa correction. Les phases finales chargent la même extension sur les deux
clients. Le JAR et les dépendances restent ignorés par Git.
Résultats finaux de synchronisation, après les quinze premières secondes de
chaque phase ; la durée comprend le chargement et la reconnexion :
| Phase | Durée | Paires | Médiane | P95 | Maximum |
| --- | ---: | ---: | ---: | ---: | ---: |
| VOD, départ | 83,6 s | 260 | 70 ms | **140 ms** | 278 ms |
| VOD, reconnexion à environ 1 min 40 | 49,6 s | 88 | 19 ms | **55 ms** | 87 ms |
| Live, départ | 85,6 s | 266 | 9 ms | **38 ms** | 322 ms |
| Live, reconnexion | 55,5 s | 97 | 11 ms | **96 ms** | 156 ms |
Médiane de **30 FPS** dans les deux clients pour ces phases. Les couvertures
de vidéo utilisable au départ sont 84,5/83,3 % en VOD et 90,1/91,2 % en live.
La reconnexion froide inclut le redémarrage complet d'une JVM et de Minecraft :
ce n'est pas une reprise réseau instantanée. Les durées sans image et les pics
restent dans les traces ; les P95 ne constituent pas une garantie de latence.
Dream intact donnait environ 337 ms en VOD et 580 à 741 ms après reprise live.
Preuves acoustiques : avec le mur de pierre, le filtre de la vidéo passe à
`cutoff=0.049787067`, `gain=0.7408182` contre `1/1` sans mur, avec envois de
réverbération non nuls. Quand A désactive son option, ses appels vidéo se
stabilisent à 312 tandis que ceux de B continuent ; les notes Minecraft de A
progressent encore de 23 à 26. Le fichier de préférence est relu après redémarrage
avec la valeur désactivée. Les captures montrent les boutons FR Oui et Non.
Hors champ, après deux secondes de transition, **zéro upload vidéo pendant
environ 69 secondes**, mais **3 042 629 / 3 064 928 échantillons PCM** joués.
Les erreurs OpenAL rapportées par la sortie sont nulles dans ces phases.
Le rechargement global de Sound Physics a révélé une réutilisation du même
pointeur natif OpenAL après destruction : le pont distingue désormais les
générations du contexte, puis recrée ses sources et abandonne le PCM devenu
périmé. Les phases `live-global-off/on` reproduisent l'ancien blocage et sont
des diagnostics, comme `live-context-*` qui a permis de trouver un second cas :
une tâche annulée par l'ancien exécuteur laissait le verrou de pompe occupé.
Le nouveau contexte libère aussi ce verrou. La série `live-reload-*` vérifie
quatre remplacements successifs, désactivation/réactivation deux fois.
Les deux clients terminent avec `resets=4`, PCM et uploads en progression,
30 FPS, `al_error=0`. Cette dernière modification ne touche que le cycle de vie
du moteur audio ; elle est testée dans `live-reload-*`, après les mesures VOD
et live du tableau. [Résumé JSON conservé](media-sync-audio-results.json).
Construction du prototype et contrôles dédiés :
```sh
./gradlew :sanctuary-test:exportDuoLaunch
python3.14 scripts/media_lab.py prepare --run mon-essai --media-fix
python3.14 scripts/media_lab.py test-media
python3.14 -m unittest discover -s scripts -p 'test_media_lab_report.py'
```
Le contrat Java vérifie l'estimation de l'heure face aux réponses retardées,
la monotonie, une reconnexion avec changement d'époque, pause/boucle, le bornage
de vitesse et les manifestes HLS relatifs/datés/discontinus. Les **sept tests
du rapport** empêchent les fausses réussites avec image périmée, client manquant,
observations trop éloignées ou sortie audio en attente. Ils ne remplacent pas
les vrais clients. Les formats HLS refusés reprennent le chemin amont.
La suite du dépôt se lance séparément, le module expérimental étant construit
par `test-media` plutôt qu'inclus dans les sous-projets Gradle :
```sh
JAVA_HOME=$(/usr/libexec/java_home -v 25) ./gradlew check build \
--max-workers=1 -Dorg.gradle.jvmargs=-Xmx1G \
-PsanctuaryFocusedTests=property270,claims272,claims277,claims278 \
-PsanctuaryAtlasOnly=true --console=plain
```
`check build` réussit en **2 min 55 s**, 145 tâches, dont **18 GameTests serveur
réussis**. Compilation du prototype et contrat Java réussis, sept tests du
rapport réussis. Journal : `build/media-fix/check-build.log`. Pas d'`assemblePack`, puisque la
distribution n'est pas modifiée. Les JVM de jeu, FFmpeg et le service HTTP du
laboratoire sont arrêtés après les mesures. Deux serveurs des premiers diagnostics
se sont bloqués à l'arrêt et ont été forcés après capture de leurs threads ;
la dernière série s'est fermée. Aucun processus de jeu personnel n'est arrêté.
## Limites
Cette preuve locale ne valide pas Twitch/YouTube publics, des liens résolus par
ANI-CLI, Spotify, des sessions authentifiées, DRM, publicités personnalisées,
playlists maîtres, LL-HLS, byte ranges ou changements de timeline. Une playlist
sans date exploitable reprend le chemin Dream d'origine et ne bénéficie pas
de la synchronisation live précise. Les horloges UTC du fournisseur et du
serveur doivent être cohérentes ; la fenêtre HLS doit contenir le retard choisi.
Le réglage de huit secondes est fixé pour le prototype, pas encore une option
de séance. La correction ±2 % change temporairement la hauteur audio. Mono
positionnel, huit sources simultanées au maximum ; Windows et Linux restent
à tester. Les mixins visent les versions exactes ; pas de compatibilité déduite.
Les tests ciblent Vulkan avec Sodium. Aucun nouveau test OpenGL, aucune
promesse de publication ou de prise en charge des autres profils. Les cadres,
le dimensionnement, le filtre 16 pixels par bloc et les disques blancs restent
les étapes suivantes après validation de cette base.
+815
View File
@@ -0,0 +1,815 @@
{
"lab": "sync-audio-04",
"backend": "Vulkan",
"date": "2026-10-26",
"minecraft": "26.3",
"dream": "1.10.4",
"sound_physics": "1.5.1+26.3",
"sodium": "0.9.2+mc26.3",
"measurement": "16-bit frame code, 30 fps, successful GPU upload, nearest observations within 150 ms; no display-scanout or subjective listening measurement",
"final_addon_sha256": "cbc0ebca949acb87b5c4afe13e61910685354285cb93033d06342ea577a22daf",
"phases": {
"vod-final-start": {
"duration_seconds": 83.603,
"all_pairs_skew_ms": {
"count": 263,
"median": 70.33333333333333,
"p95": 140.0,
"max": 278.0
},
"after_15s_skew_ms": {
"count": 260,
"median": 70.33333333333333,
"p95": 140.0,
"max": 278.0
},
"clients": {
"client-a": {
"samples": 329,
"usable_video_samples": 278,
"usable_fraction": 0.8449848024316109,
"fps": {
"count": 278,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 278,
"median": 8.114512499997062,
"p95": 21.84807333333305,
"max": 37.15192766666675
},
"openal_active_samples": 278,
"media_audio_first": {},
"media_audio_last": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 7845805,
"effects_calls": 296,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"probe_errors": []
},
"client-b": {
"samples": 317,
"usable_video_samples": 264,
"usable_fraction": 0.832807570977918,
"fps": {
"count": 264,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 264,
"median": 31.379819166666323,
"p95": 47.10430866666826,
"max": 194.07936433333361
},
"openal_active_samples": 264,
"media_audio_first": {},
"media_audio_last": {
"effects_calls": 281,
"resets": 0,
"al_error": 0,
"backend": "openal",
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": -3900227
},
"probe_errors": []
}
}
},
"vod-final-rejoin": {
"duration_seconds": 49.611,
"all_pairs_skew_ms": {
"count": 88,
"median": 18.99999999999999,
"p95": 54.66666666666666,
"max": 87.33333333333333
},
"after_15s_skew_ms": {
"count": 88,
"median": 18.99999999999999,
"p95": 54.66666666666666,
"max": 87.33333333333333
},
"clients": {
"client-a": {
"samples": 199,
"usable_video_samples": 199,
"usable_fraction": 1.0,
"fps": {
"count": 199,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 199,
"median": 6.954647999990016,
"p95": 18.23582666665402,
"max": 44.9251706666729
},
"openal_active_samples": 199,
"media_audio_first": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": -1541950,
"effects_calls": 297,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"media_audio_last": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 204082,
"effects_calls": 492,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"probe_errors": []
},
"client-b": {
"samples": 116,
"usable_video_samples": 88,
"usable_fraction": 0.7586206896551724,
"fps": {
"count": 88,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 88,
"median": 10.12811800000435,
"p95": 23.564625999995314,
"max": 37.9297059999999
},
"openal_active_samples": 88,
"media_audio_first": {},
"media_audio_last": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 91,
"error_ns": 3242630,
"video_acoustics": true,
"playing": true,
"rate": 1.0
},
"probe_errors": []
}
}
},
"live-final": {
"duration_seconds": 85.586,
"all_pairs_skew_ms": {
"count": 296,
"median": 9.66666666666666,
"p95": 37.666666666666664,
"max": 650.6666666666667
},
"after_15s_skew_ms": {
"count": 266,
"median": 8.999999999999995,
"p95": 37.666666666666664,
"max": 322.0
},
"clients": {
"client-a": {
"samples": 342,
"usable_video_samples": 308,
"usable_fraction": 0.9005847953216374,
"fps": {
"count": 308,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 311,
"media_audio_first": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 6553288,
"effects_calls": 493,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"media_audio_last": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 5895692,
"effects_calls": 309,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"probe_errors": []
},
"client-b": {
"samples": 331,
"usable_video_samples": 302,
"usable_fraction": 0.9123867069486404,
"fps": {
"count": 302,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 304,
"media_audio_first": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 92,
"error_ns": 952381,
"video_acoustics": true,
"playing": true,
"rate": 1.0
},
"media_audio_last": {
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 301,
"error_ns": -90703,
"video_acoustics": true,
"playing": true,
"rate": 1.0
},
"probe_errors": []
}
}
},
"live-final-rejoin": {
"duration_seconds": 55.501,
"all_pairs_skew_ms": {
"count": 97,
"median": 11.333333333333334,
"p95": 95.66666666666666,
"max": 155.66666666666666
},
"after_15s_skew_ms": {
"count": 97,
"median": 11.333333333333334,
"p95": 95.66666666666666,
"max": 155.66666666666666
},
"clients": {
"client-a": {
"samples": 223,
"usable_video_samples": 223,
"usable_fraction": 1.0,
"fps": {
"count": 223,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 223,
"media_audio_first": {
"rate": 1.0,
"playing": true,
"video_acoustics": true,
"error_ns": 4693878,
"effects_calls": 310,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"media_audio_last": {
"rate": 1.02,
"playing": true,
"video_acoustics": true,
"error_ns": 63560091,
"effects_calls": 528,
"resets": 0,
"al_error": 0,
"backend": "openal"
},
"probe_errors": []
},
"client-b": {
"samples": 142,
"usable_video_samples": 97,
"usable_fraction": 0.6830985915492958,
"fps": {
"count": 97,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 102,
"media_audio_first": {},
"media_audio_last": {
"backend": "openal",
"rate": 1.0045351475,
"playing": true,
"video_acoustics": true,
"error_ns": 9070295,
"effects_calls": 117,
"resets": 0,
"al_error": 0
},
"probe_errors": []
}
}
},
"live-reload-ready": {
"duration_seconds": 16.169,
"all_pairs_skew_ms": {
"count": 20,
"median": 21.33333333333333,
"p95": 174.66666666666666,
"max": 284.3333333333333
},
"after_15s_skew_ms": {
"count": 5,
"median": 174.0,
"p95": 284.3333333333333,
"max": 284.3333333333333
},
"clients": {
"client-a": {
"samples": 60,
"usable_video_samples": 20,
"usable_fraction": 0.3333333333333333,
"fps": {
"count": 20,
"median": 29.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 20,
"media_audio_first": {},
"media_audio_last": {
"error_ns": 7165533,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 38
},
"probe_errors": []
},
"client-b": {
"samples": 60,
"usable_video_samples": 19,
"usable_fraction": 0.31666666666666665,
"fps": {
"count": 19,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 19,
"media_audio_first": {},
"media_audio_last": {
"error_ns": 152630385,
"video_acoustics": true,
"playing": true,
"rate": 1.02,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 35
},
"probe_errors": []
}
}
},
"live-reload-off-1": {
"duration_seconds": 11.816,
"all_pairs_skew_ms": {
"count": 47,
"median": 20.33333333333333,
"p95": 54.33333333333333,
"max": 108.00000000000001
},
"after_15s_skew_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"clients": {
"client-a": {
"samples": 48,
"usable_video_samples": 48,
"usable_fraction": 1.0,
"fps": {
"count": 48,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 48,
"media_audio_first": {
"error_ns": 12471655,
"video_acoustics": true,
"playing": true,
"rate": 1.0062358275,
"backend": "openal",
"al_error": 0,
"resets": 0,
"effects_calls": 39
},
"media_audio_last": {
"error_ns": 6167800,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 1,
"effects_calls": 39
},
"probe_errors": []
},
"client-b": {
"samples": 48,
"usable_video_samples": 46,
"usable_fraction": 0.9583333333333334,
"fps": {
"count": 46,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 46,
"media_audio_first": {
"error_ns": 408163,
"video_acoustics": true,
"playing": false,
"rate": 1.0,
"backend": "openal",
"al_error": 40964,
"resets": 0,
"effects_calls": 36
},
"media_audio_last": {
"error_ns": 8866213,
"video_acoustics": true,
"playing": true,
"rate": 1.0044331065,
"backend": "openal",
"al_error": 0,
"resets": 1,
"effects_calls": 36
},
"probe_errors": []
}
}
},
"live-reload-on-1": {
"duration_seconds": 11.776,
"all_pairs_skew_ms": {
"count": 47,
"median": 32.0,
"p95": 41.66666666666666,
"max": 47.666666666666664
},
"after_15s_skew_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"clients": {
"client-a": {
"samples": 48,
"usable_video_samples": 48,
"usable_fraction": 1.0,
"fps": {
"count": 48,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 48,
"media_audio_first": {
"error_ns": 54126984,
"video_acoustics": true,
"playing": true,
"rate": 1.02,
"backend": "openal",
"al_error": 40964,
"resets": 1,
"effects_calls": 40
},
"media_audio_last": {
"error_ns": -634921,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 2,
"effects_calls": 87
},
"probe_errors": []
},
"client-b": {
"samples": 48,
"usable_video_samples": 47,
"usable_fraction": 0.9791666666666666,
"fps": {
"count": 47,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 47,
"media_audio_first": {
"error_ns": 92607710,
"video_acoustics": true,
"playing": true,
"rate": 1.02,
"backend": "openal",
"al_error": 40964,
"resets": 1,
"effects_calls": 37
},
"media_audio_last": {
"error_ns": -566893,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 2,
"effects_calls": 84
},
"probe_errors": []
}
}
},
"live-reload-off-2": {
"duration_seconds": 11.868,
"all_pairs_skew_ms": {
"count": 44,
"median": 12.50000000000001,
"p95": 25.999999999999996,
"max": 59.333333333333336
},
"after_15s_skew_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"clients": {
"client-a": {
"samples": 48,
"usable_video_samples": 45,
"usable_fraction": 0.9375,
"fps": {
"count": 45,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 47,
"media_audio_first": {
"error_ns": 2630385,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 3,
"effects_calls": 88
},
"media_audio_last": {
"error_ns": -136054,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 3,
"effects_calls": 88
},
"probe_errors": []
},
"client-b": {
"samples": 48,
"usable_video_samples": 47,
"usable_fraction": 0.9791666666666666,
"fps": {
"count": 47,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 47,
"media_audio_first": {
"error_ns": 340136,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 2,
"effects_calls": 84
},
"media_audio_last": {
"error_ns": 7324263,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 3,
"effects_calls": 84
},
"probe_errors": []
}
}
},
"live-reload-on-2": {
"duration_seconds": 38.686,
"all_pairs_skew_ms": {
"count": 154,
"median": 16.0,
"p95": 30.333333333333336,
"max": 92.33333333333333
},
"after_15s_skew_ms": {
"count": 95,
"median": 18.333333333333325,
"p95": 29.333333333333336,
"max": 92.33333333333333
},
"clients": {
"client-a": {
"samples": 155,
"usable_video_samples": 154,
"usable_fraction": 0.9935483870967742,
"fps": {
"count": 154,
"median": 30.0,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 154,
"media_audio_first": {
"error_ns": 52811791,
"video_acoustics": true,
"playing": true,
"rate": 1.02,
"backend": "openal",
"al_error": 40964,
"resets": 3,
"effects_calls": 89
},
"media_audio_last": {
"error_ns": 7074830,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 4,
"effects_calls": 242
},
"probe_errors": []
},
"client-b": {
"samples": 156,
"usable_video_samples": 155,
"usable_fraction": 0.9935897435897436,
"fps": {
"count": 155,
"median": 30,
"p95": 30,
"max": 30
},
"av_clock_error_ms": {
"count": 0,
"median": null,
"p95": null,
"max": null
},
"openal_active_samples": 155,
"media_audio_first": {
"error_ns": 63900227,
"video_acoustics": true,
"playing": true,
"rate": 1.02,
"backend": "openal",
"al_error": 40964,
"resets": 4,
"effects_calls": 85
},
"media_audio_last": {
"error_ns": -634921,
"video_acoustics": true,
"playing": true,
"rate": 1.0,
"backend": "openal",
"al_error": 0,
"resets": 4,
"effects_calls": 238
},
"probe_errors": []
}
}
}
},
"artifact_scope": "Final SHA-256 is for live-reload-* after the audio lifecycle-only correction; prior named phases measure the VOD/live sync implementation."
}
+10
View File
@@ -1,5 +1,15 @@
# Menus Sanctuary — organisation
Évolution courante du 24 octobre 2026 : [Habitant et Pause beta.275](menu-atlas-beta275.md).
La fiche ne contient plus que Factions/Familier en navigation, avec statistiques,
personnage et biographie en trois colonnes. Une fois Carte débloquée, Pause garde
Aventure à gauche, Communauté à droite et Partie sous la carte centrale ; Gazette
et Tableau conservent les colonnes latérales. Les descriptions historiques
ci-dessous et la [première fiche beta.271](inhabitant-menu-beta271.md) restent des références.
Évolution du 24 octobre 2026 : [fiche Habitant et Pause beta.271](inhabitant-menu-beta271.md).
Le cadrage ci-dessous conserve l’organisation historique de beta.083.
Cadrage du 15 septembre 2026, à partir de beta.077.
Branche documentaire initiale : `codex/menu-architecture`.
**Statut : organisation appliquée en [beta.083](menu-organization-beta083.md).
+64
View File
@@ -0,0 +1,64 @@
# MENU-275 — Habitant et Pause autour de la carte
Branche `codex/inhabitant-property`, demande du 24 octobre 2026.
- Retirer le conseil d’arrivée sur la première propriété gratuite.
- Habitant : Factions et Familier en haut, statistiques transparentes à gauche,
personnage au centre avec de l’air, biographie à droite. Retirer le panneau
d’activité et son bouton Historique de cette fiche ; conserver les données.
- Temps joué en jours, heures, minutes et secondes entières, à partir des ticks
Minecraft. Aucune minute décimale. Retour à la ligne en petit format.
- Les propriétés exigent l’aptitude Carte achetée et active. Aucun bouton dans
Habitant ; accès depuis le clic droit sur l’Atlas ou la commande après déblocage.
Le serveur applique cette condition aux commandes, actions et ancien paquet
de carte locale. Les données et protections acquises restent conservées.
- Avant Carte : conserver la disposition actuelle du menu Pause.
- Après Carte : Gazette à gauche, Tableau à droite ; dans la colonne centrale,
Découvertes, Progression, Habitant et Combats au-dessus de la carte, puis Options,
Options du monde et Sauvegarder/quitter ou Déconnexion sous la carte.
Les rubriques restent visibles : **Aventure** forme toujours la colonne de
gauche (Découvertes puis Progression), **Communauté** celle de droite
(Habitant puis Combats), même en grande vue. **Partie / Game** reste au-dessus
des options. Le rectangle de carte remplit l’espace restant, réduit pour
conserver ces titres. Reprendre reste dans le pied natif.
Aucun format de sauvegarde ni génération ne change. Les nouveaux prérequis
n’attribuent ni ne retirent de propriété. Les protections existantes et leur
prédiction de minage s’appliquent aussi aux joueurs sans Carte ; seul l’accès
à leur gestion est verrouillé. La refonte habitation/duels/prix reste en attente.
## Vérification
`check build assemblePack` réussit en **2 min 45 s**, avec **30 tests serveur
ciblés**. Les prérequis de Carte sont testés avant achat, après achat et après
désactivation ; refus sans débit, conservation du claim et des protections,
réactivation et multiplicateurs de minage pour les joueurs sans Carte.
Le format de durée couvre dix limites de ticks et un compteur long.
Le parcours **Vulkan FR/EN GUI 2/3/4** réussit en **56 s**, avec **18 captures**.
Il passe par Hello World réel, vérifie l’absence du conseil de propriété,
la commande bloquée et le paquet de carte locale forgé, puis les trois colonnes
d’Habitant, les unités de temps, la transparence et l’absence d’activité.
Factions et Familier reviennent à la fiche. Les vues Pause avant/après Carte,
les deux colonnes Aventure/Communauté même en grande vue, la rubrique Partie,
les côtés Gazette/Tableau, la disposition des options, leur retour natif et la
mise à jour après désactivation de Carte sont contrôlés. Les textes longs
conservent les défilements et infobulles natifs dans les petits formats.
Captures dans `build/menu275-screenshots/`, avec inspections FR GUI 2/4 de
Pause, FR GUI 4 d’Habitant. Le MRpack beta.275 est exporté et vérifié : ZIP,
Minecraft 26.3, Loader 0.19.5 et octets des deux JAR locaux identiques aux builds.
Les archives beta.270 à beta.274 restent identiques. Reçu :
`build/menu275-validation.json`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=menu275,claims273,claims272,property270,mining,overview271,menus,map,demeure \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryMenu275ClientTests=true -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true
```
Aucune publication de canal ni synchronisation d’instance personnelle.
+23
View File
@@ -0,0 +1,23 @@
{
"version": "beta.306",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.306.jar",
"sha256": "a58ddb731719b5bcd975ac86acb95941f0f1bfe49cbefab429b01d47e847af60",
"generated_json": {
"cuisine": 432,
"kitchen": 192,
"agriculture": 376
},
"culinary_classes": 44,
"server_required": 52,
"manual_mill_scenarios": 10,
"manual_mill_recipes": 9,
"physical_recipes": 80,
"device_blueprints": 90,
"client_vulkan": {
"manual_mill": "build/mill306-client.log",
"screenshots": "build/mill306-screenshots",
"backend": "Vulkan",
"sodium": "0.9.2+mc26.3",
"world_seed": 306
}
}
+118
View File
@@ -0,0 +1,118 @@
# CUI-306 — moulin manuel, sans combustible
> Suite locale : [beta.307 adapte aussi la recette de fabrication, sans
> redstone](mill-recipe-beta307.md). Cette page conserve le résultat de beta.306.
Choix du créateur du 28 octobre 2026 : **manuel, comme le tailleur de pierre**.
Préparation **beta.306** sur la même branche `codex/itsalive-26-3`, après
beta.305. Travail local, sans publication, installation dans Prism, mise à
jour de canal ou déploiement serveur.
## Résultat jouable
Le bloc, l'objet, le titre de menu et la catégorie JEI s'appellent désormais
**Moulin / Mill**. L'interface propose une entrée et un résultat immédiat.
Chaque joueur possède sa propre surface de travail, comme dans un menu de
fabrication vanilla.
L'aperçu ne consomme rien. Prendre le résultat paie **un ingrédient** et donne
le rendement prévu par la recette. Par exemple, un blé donne deux farines de
blé, y compris au clic droit qui prend le lot entier. Le Maj-clic traite les
lots disponibles dans la limite de l'inventaire.
Si seul un morceau du dernier lot tient, le surplus payé tombe au sol, selon
le comportement natif du tailleur de pierre. Un inventaire plein ne consomme
pas d'ingrédient. Les récipients réellement payés sont rendus une seule fois.
Fermer le menu ou casser le moulin rend les ingrédients inutilisés ; aucun
aperçu n'est sauvegardé ou lâché comme objet.
Le moulin ne consomme **aucun combustible**, n'attend pas un délai, ne produit
pas passivement et n'accorde pas d'XP de cuisson. Il ne demande aucun signal
redstone. Les entonnoirs n'ont pas accès à cette fabrication manuelle.
Le feu et les commandes de combustible disparaissent du menu. Les deux
sprites historiques conservent un bref mouvement mécanique descendant puis
ascendant, de **12 ticks**, après une prise de résultat. Le son réutilise
celui du tailleur de pierre. L'ancien état `lit` sert uniquement à afficher
brièvement la face active du bloc, sans chaleur ni combustion.
Les **neuf recettes**, leurs rendements, les ingrédients reconnus et la
recette de fabrication du moulin sont conservés. JEI affiche « Mouture
manuelle / Manual milling » au lieu d'une durée. Le champ historique
`processing_time` reste accepté dans les données pour garder les recettes
compatibles ; il ne pilote plus le moulin.
## Continuité des objets déjà stockés
Les identifiants `sanctuary:redstone_mill` du bloc, de l'objet, du menu et du
bloc entité restent stables. Les trois anciennes cases gardent leur encodage
natif et leur version de stockage 2. La lecture historique de version 1 est
conservée. Aucun monde existant n'est ouvert, modifié ou converti par ce lot.
À la première ouverture d'un ancien moulin, son entrée stockée rejoint la
surface de travail du joueur. L'ancien combustible et l'ancien résultat
restent visibles dans deux cases **de récupération uniquement**, affichées
tant qu'elles contiennent un objet. Ils peuvent être retirés par clic ou
Maj-clic. Ils sont aussi conservés à la casse du bloc. Ces cases n'acceptent
aucun nouvel apport et disparaissent de l'affichage une fois vidées.
Les anciens compteurs de chauffe et de progression sont ignorés. Ils ne
consomment pas le combustible restant, ne créent pas de résultat et ne
remboursent pas un combustible déjà brûlé. Les objets réellement stockés
restent récupérables, sans conversion automatique en farine.
## Vérifications
Minecraft **26.3**, Fabric API **0.160.5+26.3**, Java 25. Les tests graphiques
ciblent uniquement **Vulkan avec Sodium 0.9.2**, dans un monde de développement
neuf de graine **306**, ignoré par Git.
`check build assemblePack` passe en **3 min 11 s**, avec **52 tests serveur
requis réussis**, dont les dix scénarios du moulin et les régressions
appareils, cuisine, recettes, progression et connaissances alimentaires.
Les dix nouveaux tests serveur couvrent l'aperçu sans paiement, le clic droit,
les prises et Maj-clics natifs, l'inventaire plein ou presque plein, la
fermeture/casse, deux joueurs indépendants, les anciens stocks et compteurs, l'absence de
combustible et d'accès par entonnoir, ainsi que les récipients payés. La
régression des appareils exécute les neuf recettes réelles du moulin.
Le parcours client Vulkan passe en **1 min 8 s** : vrais paquets
d'insertion, prise, Maj-clic et fermeture, mouvement mécanique sans feu,
deux cases de travail, noms FR/EN aux échelles GUI 2/3/4 et neuf recettes
dans JEI. Une fermeture/réouverture réelle du monde conserve les anciens
stocks ; leur extraction rend exactement sept charbons, cinq blés et trois
farines, en plus des objets déjà possédés. Les dix captures sont archivées
dans `build/mill306-screenshots/` ; journal `build/mill306-client.log`.
Le JAR contient les **432 JSON culinaires**, **192 JSON d'appareils** et
**376 JSON agricoles**, identiques aux générateurs, ainsi que les 44 classes
culinaires et les libellés FR/EN. Les trois classes du moulin sont identiques
aux fichiers compilés ; les neuf recettes sont présentes. Les **343 PNG
importés** restent identiques, dont les 38 fournis ; les 13 PNG de vanille
restent en 16 × 16. Les copies packwiz client et serveur sont identiques au
JAR contrôlé. Le template conserve les mêmes textures et les notices à jour.
SHA-256 de `sanctuary-beta.306.jar` :
```text
a58ddb731719b5bcd975ac86acb95941f0f1bfe49cbefab429b01d47e847af60
```
[Reçu de validation](mill-beta306-verification.json), journaux de build et
d'archives dans `build/mill306-build.log` et `build/mill306-artifacts.log`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryMill306ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=mill306 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
La recette de fabrication du moulin et les autres appareils culinaires
sont conservés. L'automatisation ne fait pas partie du fonctionnement manuel
retenu. Les textures importées, les catégories créatives et les cultures
sont conservées.
@@ -0,0 +1,41 @@
{
"version": "beta.307",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.307.jar",
"sha256": "e510871bd515e5b52f2e1b218b593b49ff74ffae320e9b6b665ef1629c53d3d0",
"previous_verified_sha256": "a58ddb731719b5bcd975ac86acb95941f0f1bfe49cbefab429b01d47e847af60",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"data/sanctuary/recipe/redstone_mill.json",
"fabric.mod.json",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"generated_json": {
"cuisine": 432,
"kitchen": 192,
"agriculture": 376
},
"server_required": 52,
"recipe_id": "sanctuary:redstone_mill",
"pattern": [
"SSS",
"GCG",
" B "
],
"ingredients": {
"S": "minecraft:smooth_stone_slab",
"G": "minecraft:copper_ingot",
"C": "minecraft:stonecutter",
"B": "minecraft:stick"
},
"result": {
"id": "sanctuary:redstone_mill"
},
"crafting_category": "misc",
"runtime_classes_unchanged": 2745,
"pngs_unchanged": 973,
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md"
],
"build_log": "build/mill307-build.log"
}
+69
View File
@@ -0,0 +1,69 @@
# CUI-307 — recette du moulin manuel
Demande du créateur du 28 octobre 2026 : adapter la fabrication au
fonctionnement manuel du moulin, **sans redstone**. Préparation **beta.307**
sur la même branche `codex/itsalive-26-3`, après beta.306. Travail local,
sans publication, installation, mise à jour de canal ou déploiement serveur.
## Fabrication
La table de fabrication donne **un moulin** avec :
| Dalle de pierre lisse | Dalle de pierre lisse | Dalle de pierre lisse |
| --- | --- | --- |
| Lingot de cuivre | Tailleur de pierre | Lingot de cuivre |
| Vide | Bâton | Vide |
Le bâton représente la poignée du mécanisme manuel. Il remplace la poudre
de redstone de la recette précédente ; les autres ingrédients et leurs
quantités sont conservés. Aucun de ces composants ne demande de redstone.
La catégorie du livre de fabrication devient **Divers / Miscellaneous** au
lieu de Redstone ; les objets et leurs noms FR/EN restent ceux du jeu.
Les onglets créatifs ne changent pas.
La recette garde l'identifiant **`sanctuary:redstone_mill`** et sa découverte
dans la collection des appareils culinaires. Les moulins déjà placés, les
inventaires et les neuf recettes de mouture gardent le comportement manuel
de beta.306. Ce lot change uniquement les données de fabrication, sans
nouveau Java de jeu, nouveau PNG ou modification de sauvegarde.
La source adaptée est `scripts/data/kitchen-crafting.json`, distribuée par
`scripts/kitchen_resources.py`. Les reçus historiques 26.2 et beta.304 restent
inchangés ; cette page documente l'évolution de la copie Sanctuary.
## Vérifications
`check build assemblePack` passe en **2 min 53 s**, avec **52 tests serveur
requis réussis**. La nouvelle grille est chargée et produit un moulin sans
résultat concurrent ; la découverte du plan et les transformations manuelles
restent vérifiées.
Minecraft **26.3**, Fabric API **0.160.5+26.3**, Java 25. Les tests serveur
existants chargent les dix fabrications d'appareils/stockage, font correspondre
leurs grilles réelles et vérifient l'absence de résultat concurrent. Ils
couvrent également la découverte du plan et les neuf recettes du moulin
manuel. Le code de menu et les textures sont inchangés ; le parcours Vulkan
de beta.306 reste le reçu graphique de référence et n'est pas présenté comme
un nouvel essai de beta.307.
Les **1 000 JSON générés** correspondent aux sources : 432 culinaires,
192 d'appareils et 376 agricoles. Comparé au JAR vérifié de beta.306, seuls
la recette du moulin, la version du manifeste et les deux copies des notices
changent. Les **2 745 classes et 973 PNG** de l'archive sont identiques octet
pour octet. Les copies du JAR packwiz client et serveur sont identiques au
binaire contrôlé ; le template ne change que par sa notice.
SHA-256 de `sanctuary-beta.307.jar` :
```text
e510871bd515e5b52f2e1b218b593b49ff74ffae320e9b6b665ef1629c53d3d0
```
[Reçu de validation](mill-recipe-beta307-verification.json). Journaux dans
`build/mill307-build.log` et `build/mill307-artifacts.log`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
```
+6
View File
@@ -3,6 +3,12 @@
16 septembre 2026. Cadrage corrigé après clarification du créateur.
Aucun portage, adaptateur ou changement de sauvegarde livré ici.
**Suite du 28 octobre 2026 :** le créateur ouvre la
[refonte 26.3 d'It's Alive !](itsalive-26-3.md). Le premier lot importe les
textures ; les mécaniques restent en tickets. La cuisinière four + table de
fabrication et son lien avec le Fourneau seront examinés dans IA-08. Le texte
ci-dessous conserve les décisions et constats du cadrage du 16 septembre.
## Direction retenue
Le créateur souhaite intégrer **tout It's Alive dans Sanctuary**, mais
+21
View File
@@ -0,0 +1,21 @@
# Sanctuary beta.289
Six nouveaux infectés rejoignent Sanctuary : Infecté, Charger, Spitter, Boomer,
Smoker et Hunter, chacun avec son œuf et son comportement. Le Spitter laisse
une flaque d’acide ; le Smoker doit toucher avec son lasso avant de tirer sa
cible ; le Hunter prépare un bond qui peut être esquivé.
Neuf tenues aléatoires sont partagées avec le zombie classique. Les bras restent
en avant, avec le Hunter accroupi au sol. Les infectés restent sans variante
bébé ; leurs familiers reprennent le modèle adulte en miniature, à taille
variable, avec leurs pouvoirs.
Les objets lumineux tenus en main éclairent de nouveau le terrain avec Sodium,
y compris sans PBR. JEI est intégré au même JAR Sanctuary sur le client et le
serveur. Le grand dézoom de carte et les relevés lointains sont conservés.
Minecraft 26.3 · Fabric 0.19.5. Construction complète, 31 tests serveur et parcours
Vulkan des zombies/familiers vérifiés pour cette livraison. Les lumières utilisent
le correctif de beta.288, dont les classes sont conservées à l’identique.
Le téléchargement du site reste l’instance Prism prête à suivre le canal stable.
+19
View File
@@ -0,0 +1,19 @@
# Sanctuary beta.293
- Happy Creepers repris de la branche dédiée `codex/happy-creepers` : Maj +
clic droit avec une fleur pour la porter, visage souriant et comportement
passif ; retrait à main vide avec le même geste. Charge électrique conservée.
- Baleines fantômes volantes et œuf natif de beta.290 inclus.
- Logo Sanctuary affiché pendant les téléchargements et mises à jour packwiz,
avec l'installateur intégré au ZIP Prism prêt à importer.
- Simple Voice Chat 2.6.24+26.3, Bobby 5.2.16+mc26.3, Lithium 0.26.2+mc26.3 et
Entity Culling 1.11.3 pour 26.3 disponibles comme choix facultatifs du client.
Lithium et la voix font également partie du profil serveur.
- Sound Physics 1.5.1, Sodium 0.9.2, JEI embarqué et Minecraft 26.3 / Fabric
0.19.5 conservés. La version vocale retenue respecte ces dépendances.
- Sauvegardes et réglages restent attachés à la même instance ; aucun changement
de génération ou de format de monde. Dozei Stream et Only Fun restent futurs.
Le ZIP Prism suit le canal stable à chaque lancement. Les anciens utilisateurs
gardent leur instance ; la première mise à jour de l'habillage doit aussi
installer le nouvel outil packwiz et conserver `--bootstrap-no-update`.
+17
View File
@@ -0,0 +1,17 @@
# Sanctuary beta.295
Le serveur **Sanctuary Beta** est enregistré automatiquement au premier
lancement du client, avec le logo du modpack. Il utilise l'adresse publique
`beta.sanctuary-minecraft.net`. Les autres favoris restent conservés ; vous
pouvez ensuite renommer, déplacer ou supprimer cette entrée.
Le serveur annonce aussi le logo Sanctuary dans la liste multijoueur.
Le même parcours s'applique au ZIP Prism du site, au MRpack et aux instances
existantes qui suivent le canal packwiz.
La commande de propriété est unifiée : **`/sanctuary property`**, avec
`claim`, `protect` et `duel`. Les alias `propriete` et `propriété` sont retirés.
Les règles, prix et protections des claims restent identiques.
Les sauvegardes et paramètres de génération sont conservés ; aucun nouveau
monde n'est nécessaire.
+20
View File
@@ -0,0 +1,20 @@
# Sanctuary beta.296
Les écrans partagés arrivent dans Sanctuary, avec le menu original de Dream
Displays 1.10.4. Huit bâtons autour d'une redstone fabriquent une ancre ; la
largeur et la hauteur se règlent librement, sans cadre supplémentaire.
Le contour suit toute la surface et l'image conserve ses proportions.
Le serveur garde la séance commune, les clients lisent la vidéo. Clic droit
sur l'écran à 16 blocs pour le lecteur ; Maj + clic droit près de l'ancre ou
bouton Taille pour redimensionner. Sound Physics peut être désactivé pour les
vidéos uniquement, dans ses options de son.
Le favori Sanctuary Beta, les dernières commandes de propriété, les mondes et
les réglages sont conservés. Minecraft 26.3 / Fabric 0.19.5 inchangés.
Le module Media est inclus dans Sanctuary ; Dream Displays est installé par
packwiz sur les deux côtés.
Fonction expérimentale à tester : vidéos et live HLS daté contrôlés vérifiés
sous Vulkan, sources publiques Twitch/YouTube encore à essayer. Le filtre
16 pixels/bloc et les disques blancs ne sont pas inclus.
+18
View File
@@ -0,0 +1,18 @@
# Sanctuary beta.297
Le menu de dimensions s'ouvre automatiquement à la première pose du cadre.
Ensuite, clic droit et Maj + clic droit ouvrent directement le lecteur Dream ;
le bouton Taille / Size permet toujours de redimensionner près de l'ancre.
Le cadre possède maintenant une vraie épaisseur de 1/16 de bloc, avec des
faces latérales qui suivent exactement la surface de l'écran. Le repère rouge,
le contour de sélection du bloc invisible et les liserés vidéo visibles de
côté sont retirés. Le son continue lorsque l'image est masquée.
Les écrans déjà posés en beta.296 conservent leur source, leurs dimensions et
leurs données. Aucun bloc à remplacer et aucun changement de format de monde.
Media passe en 0.3.1 ; Minecraft 26.3, Fabric, Dream Displays 1.10.4 et les
autres dépendances restent inchangés.
Correctif vérifié sous Vulkan avec deux clients, 17 contrôles d'interaction
et des vues de face, des côtés, du haut et de l'arrière.
+15
View File
@@ -0,0 +1,15 @@
# Sanctuary beta.298
Le petit cadre brillant dans le coin inférieur gauche de la vidéo est corrigé
avec les shaders Sanctuary activés. Le modèle invisible de l'ancre ne fournit
plus de faces à la passe des normales PBR. Le grand cadre conserve sa taille
et son épaisseur ; le lecteur et le redimensionnement gardent leurs gestes.
Les écrans déjà posés conservent leur source, leurs dimensions et leurs données.
Aucun bloc à remplacer ni conversion de sauvegarde. Media passe en 0.3.2 ;
Minecraft 26.3, Fabric et Dream Displays 1.10.4 restent inchangés.
Correctif vérifié à deux clients Vulkan avec PBR actif, vidéo en mouvement et
gros plans de face et en vue rasante. Le détail des contrôles et leurs limites
est dans `docs/media-anchor-normals-beta298.md` ; pas de nouvelle validation
des sources publiques ni de l'endurance du lecteur.
+30
View File
@@ -0,0 +1,30 @@
# Sanctuary beta.315 — cuisine et agriculture It's Alive
La refonte locale beta.299 à beta.315 rejoint le pack Sanctuary 26.3.
- Vingt cultures, citronnier, olivier, caféier et vanille grimpante vers le haut.
- Recettes pour les nouvelles récoltes, poêle et piles de quatre, cuisinière
automatique, chaudron remué au bâton et recettes répétées, fermentation.
- Moulin manuel, sans combustible. Les blocs de tomates, raisins et olives
se piétinent en huit paliers ou s'écrasent au piston ; super piston 27 blocs.
- Préparation de saucisson à l'établi puis séchage sur quatre crochets,
cinq minutes de jeu au sec ; pluie et immersion suspendent la progression.
- Fromage posé en sept parts et saucisson posé en quatre tranches.
- Vin jeune après trois minutes de fermentation ; vin de table, réserve et
grand cru après un, trois et sept jours réels de garde au tonneau, jeu fermé.
- Nourriture dans Nourriture et boissons, semences dans Naturel, sans nouvel onglet.
Les identifiants historiques de cette refonte restent stables. Les nouveaux
blocs conservent leur état par les mécanismes natifs ; le vin a un horodatage
serveur. Aucune régénération ou expansion de monde n'est effectuée.
Les cultures sont jouables ; leur apparition naturelle et la répartition
climatique ne sont pas introduites par cette livraison. Chercher les objets
dans les onglets vanilla et leurs recettes dans JEI pour les essais.
Le fromage et le saucisson se mangent après la pose ; casser un aliment entamé
ne rend pas un nouvel aliment entier. Une sortie de tonneau extraite par un
entonnoir garde sa qualité : le verrouiller pour laisser vieillir le vin.
Minecraft 26.3, Fabric Loader 0.19.5 et dépendances du pack conservés.
Les contrôles graphiques ciblent Vulkan avec Sodium. Les preuves détaillées
et limites figurent dans les tickets beta.299–315 et le reçu de livraison.
+29
View File
@@ -0,0 +1,29 @@
# Sanctuary beta.318
Minecraft 26.3 · Fabric Loader 0.19.5 · Java 25.
Cette mise à jour réunit les ajouts beta.316 à beta.318 :
- Récoltes sauvages et premières semences en survie selon les biomes des neuf
îles : cultures, arbres fruitiers, café et vanille. Les terrains déjà explorés
gardent leurs blocs et disposent aussi de trouvailles adaptées au climat.
- Séchoir : viandes, cabillaud et saumon crus, raisins, tomates, piment, herbes,
fruits et vanille. Durées propres à chaque aliment, quatre crochets indépendants,
pause sous la pluie et protection par un toit.
- Dix-huit nouvelles recettes aux produits séchés : pains, brioche, biscuits,
sandwichs, plats au chaudron, salade, dessert, mélange de fruits et épices.
Le saucisson pimenté se prépare, sèche cinq minutes et se partage en quatre tranches.
- Manger épicé provoque deux petits coups visuels et sonores, sans dégâts
ni recul. La réaction fonctionne aussi sur les tranches de saucisson pimenté.
Les nouveaux objets restent dans Nourriture et boissons. Les herbes et le piment
séchés, la poudre de piment et l'assaisonnement servent aussi dans la cuisine
existante. Les bols et fioles des nouveaux plats reviennent à la consommation.
Les anciennes recettes, appareils et sauvegardes restent compatibles. Aucun
repeuplement des anciens chunks ni changement de format de sauvegarde : les
plantes sauvages apparaissent à la première décoration des nouveaux chunks.
Les icônes supplémentaires réutilisent les sprites existants recolorés.
[Guide des récoltes](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.318/docs/wiki/alimentation/README.md) ·
[Recettes, quantités et durées](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.318/docs/wiki/alimentation/sechoir.md).
+40
View File
@@ -0,0 +1,40 @@
# Sanctuary beta.320
Minecraft 26.3 · Fabric Loader 0.19.5 · Java 25.
- **Cuisine directe** : les ingrédients se mettent dans la poêle, le chaudron
ou la cuisinière. Les 46 préparations artificielles « Uncooked » quittent
les fabrications, le créatif et JEI. Les anciennes préparations stockées
restent cuisinables au four ou au fumoir.
- **Chaudron Minecraft** : plus d’objet « Cooking Pot » distinct. Ajouter les
ingrédients au chaudron ordinaire, puis remuer avec un bâton. Les anciens
exemplaires et les préparations déjà engagées restent récupérables.
- **Baratte en bois**, sans combustible : lait au repos cinq minutes pour
deux crèmes et le seau rendu ; beurre en huit gestes, crème fouettée avec du
sucre en huit gestes, beurre aux herbes en quatre gestes. Maj-clic à main
vide reprend les ingrédients et annule le travail inachevé. Les nouveaux
laitages servent aussi dans la cuisine existante ; le fromage reste au tonneau.
- **Semences dans l’herbe** : graines, grains à planter et boutures adaptés
au climat remplacent les fruits et légumes récoltés. Carottes, pommes de
terre, oignons, ail et couronnes d’ananas se trouvent sur les vraies plantes
sauvages ou se multiplient à partir des cultures déjà rapportées.
- **Carte à la hauteur du joueur** : Atlas et aperçu Pause suivent le Y exact
des pieds, sans arrondi aux six anciens plafonds. Le toit des grottes est
exclu ; zoom et déplacement restent disponibles. Les anciennes cartes de
surface restent conservées ; les nouvelles coupes se complètent en revisitant
les zones. Les relevés de dimensions différentes restent séparés.
- **Insectes et saisons** : calendrier des 47 espèces conservé, papillons
diurnes suivant le soleil, grillons moins fréquents sous la pluie et papillons
de nuit autour des lanternes extérieures, y compris suspendues. Habitats et
plafonds de population conservés.
Les nouveautés restent dans les onglets créatifs existants. Aucun monde n’est
régénéré ni repeuplé. Le support de carte Under est prêt pour ses types de
dimensions ; cette livraison n’active pas le prototype Under ni ses portails.
Validation : **241 tests serveur**, contrôles complets de construction et
parcours regroupé **Vulkan avec Sodium**, en FR/EN aux échelles 2/3/4.
[Laitages et baratte](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.320/docs/wiki/alimentation/laitages.md) ·
[Récoltes et semences](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.320/docs/wiki/alimentation/README.md) ·
[Détails et vérification du lot](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.320/docs/integration-beta320.md).
+26
View File
@@ -0,0 +1,26 @@
# Sanctuary beta.321
Minecraft 26.3 · Fabric Loader 0.19.5 · Java 25.
- **Carte adaptative** : vue complète de la surface en extérieur ; coupe à
la hauteur des pieds sous un toit ou dans une grotte. Même comportement
dans l’aperçu Pause. Le feuillage seul conserve la vue extérieure ; le verre
et les dalles comptent comme couverture. Zoom et cadrage restent conservés.
- **Baratte en bois ouverte**, avec une vraie cavité et une poignée qui
tourne par quarts de tour. Tous les éléments du modèle restent droits.
- **Saucissons simplifiés** : pavés sans petits bouts blancs ni ficelles
saillantes, pour les variantes crues, séchées et épicées. Les saucissons
posés gardent leurs quatre tranches et raccourcissent à chaque bouchée.
- **Noms d’inventaire corrigés** pour la Baratte / Dairy Churn et le
Séchoir / Drying Rack, en français et en anglais.
Aucun changement de génération, de recette, d’identifiant ou de format de
sauvegarde. Les mondes existants et les anciennes découvertes de carte restent
conservés. Cette version n’active aucun prototype Under.
Validation du lot : **55 tests serveur**, `check build assemblePack`, parcours
**Vulkan avec Sodium**, noms FR/EN aux échelles 2/3/4, cuisson/séchage et
portions réelles, sauvegarde/relecture, seize états de baratte et transitions
extérieur/intérieur dans la grande carte et l’aperçu Pause.
[Détails du lot](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.321/docs/presentation-beta321.md).
+44
View File
@@ -0,0 +1,44 @@
# Sanctuary beta.324
Minecraft 26.3 · Fabric Loader 0.19.5 · Java 25.
- **Poules colorées rares** : émeraude, rubis, saphir et or. Une poule
ordinaire peut pondre un œuf en or, à raison d’une chance sur 256.
Le lancer fait éclore un poussin rare. Les variantes pondent leur produit
avec des délais de plus en plus longs et ne se reproduisent pas.
- **Aptitudes rééquilibrées** selon leur portée. Catalogue des recettes :
30 niveaux ; Savoir alimentaire : 6 ; Étude des familiers : 15.
Les aptitudes déjà achetées restent acquises, sans supplément ni rachat.
- **Recherche JEI réparée** : la première lettre ne retire plus le focus.
Saisie française/anglaise, accents, Unicode et touches d’édition conservés.
Le fork embarqué passe à `30.32.0-sanctuary.5`.
- **Séchoir à deux aliments**, agrandis et redressés. Les anciennes positions
excédentaires restent en attente avec leur progression. Nouvelle fabrication :
cinq bâtons et deux planches, sans fil.
- **Fabrication du moulin** : la pierre lisse remplace le tailleur de pierre.
Le moulin reste manuel et sans combustible.
Les nouveaux achats d’aptitudes coûtent des niveaux d’XP :
| Aptitude | Niveaux |
| --- | ---: |
| Noms des créatures | 2 |
| Se reposer | 4 |
| Zoom | 5 |
| Savoir alimentaire | 6 |
| Nage | 8 |
| Rangement | 10 |
| Grande carte | 12 |
| Étude des familiers | 15 |
| Lien actif | 20 |
| Forgerie | 20 |
| Alchimie | 25 |
| Enchantement | 30 |
| Catalogue des recettes | 30 |
Les prix personnalisés restent conservés ; les anciens tarifs par défaut
des configurations suivent la transition documentée. Les découvertes, favoris
JEI et reçus d’achat restent conservés. Aucun monde n’est régénéré et aucun
prototype Under n’est activé.
[Sources, compatibilité et validation](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.324/docs/integration-beta324.md).
+164
View File
@@ -0,0 +1,164 @@
# PACK-292 — voix, cache de chunks et optimisations
Préparation locale du **26 octobre 2026**, branche
`codex/optional-mods-integration`, depuis le logo packwiz beta.291.
Le même logo et le même canal stable sont conservés.
## Mods intégrés
| Mod | Binaire retenu pour Minecraft 26.3 / Fabric | Client | Serveur |
| --- | --- | --- | --- |
| [Simple Voice Chat](https://modrinth.com/plugin/simple-voice-chat/version/OLnMVWXy) | 2.6.24+26.3, bêta | Facultatif, coché initialement | Inclus, activé initialement |
| [Bobby](https://modrinth.com/mod/bobby/version/J7YnfCss) | 5.2.16+mc26.3 | Facultatif, coché initialement | Exclu |
| [Lithium](https://modrinth.com/mod/lithium/version/xS0Q8LSi) | 0.26.2+mc26.3 | Facultatif, coché initialement | Inclus, activé initialement |
| [Entity Culling](https://modrinth.com/mod/entityculling/version/X1g3VhTx) | 1.11.3 pour mc26.3 | Facultatif, coché initialement | Exclu |
Chaque téléchargement utilise le binaire original, sa version Modrinth
immuable et son SHA-512 dans `packwiz/mods/*.pw.toml`. Les JAR restent séparés,
sans dépendance obligatoire ni copie imbriquée dans le JAR Sanctuary. Les
descriptions du sélecteur packwiz sont en FR/EN. Les interfaces amont conservent
leurs propres traductions, vérifiées pour le menu vocal français et anglais.
`scripts/data/optional-mods.json` fixe les identifiants, versions, côtés,
dépendances et conflits attendus. `verify_optional_mods.py`, exécuté par
`check` et `assemblePack`, vérifie les métadonnées Fabric des JAR, leur hash et
les bibliothèques imbriquées. Les quatre fichiers réellement utilisés par
Gradle sont aussi comparés aux binaires vérifiés pendant la validation.
Minecraft reste **26.3**, Loader **0.19.5**, Java **25**, Fabric API
**0.160.5+26.3** ; MixinExtras **0.5.5** est fourni par Loader et satisfait Lithium.
## Choix de version vocale
Les versions vocales 2.6.25 et 2.6.26 refusent explicitement Sound Physics
Remastered <1.5.2. Le pack conserve son **1.5.1+26.3** et son interface native,
donc la voix est épinglée en **2.6.24+26.3**, sans contournement des dépendances.
Le plug-in Sound Physics est chargé par le serveur vocal et la connexion locale
est authentifiée pendant le parcours client. Les mises à jour de ces deux mods
doivent être traitées ensemble à la prochaine évolution de version.
Le menu vocal s'ouvre avec sa touche amont **V**, configurable ; la touche de
push-to-talk se choisit dans les réglages vocaux. Aucun raccourci ni préférence
personnelle n'est remplacé par le pack. La voix reste facultative pour le joueur.
Le profil serveur contient désormais **Fabric API, Sanctuary, Lithium et Simple
Voice Chat**. Son choix est indépendant des options d'un client. Le kit Linux
reste sans interface ; son installateur officiel est conservé. La vérification
Web compare aussi les nouveaux JAR serveur au canal avant toute publication.
L'utilisation sur la Beta dédiée exigera le
[port UDP vocal](https://dev.modrepo.de/minecraft/voicechat/wiki/server_setup),
par défaut 24454, et un échange audible entre deux joueurs. Cette préparation
ne modifie ni la CT Beta, ni ses règles réseau, ni l'instance personnelle. Le
microphone est désactivé dans le test de développement ; aucune captation de la
voix réelle de l'utilisateur n'est nécessaire à la validation réseau locale.
## Portée de Bobby et d'Entity Culling
[Bobby](https://github.com/Johni0702/bobby) conserve les chunks déjà envoyés
par le serveur dans son cache client `.bobby`, puis peut afficher leur dernière
copie connue au-delà de la distance d'envoi. Il ne génère pas de chunks et ne
simule pas les zones lointaines. Le serveur reste autoritaire lorsqu'il renvoie
l'état courant. Le pack ne distribue aucun monde `bobby-fallback`, cache, ni
configuration personnelle ; la limite de distance et la conservation du cache
restent celles du mod et des réglages du joueur.
[Entity Culling](https://github.com/tr7zw/EntityCulling) conserve son moteur
amont et ses bibliothèques TRender/TRansition imbriquées. L'occlusion et la
réapparition d'une entité sont exercées sur Vulkan. Aucun gain chiffré de FPS
ou de ticks n'est revendiqué ; les validations vérifient ici le fonctionnement
et la coexistence, sans benchmark représentatif de tous les mondes Sanctuary.
## Vérifications
- `./gradlew check build assemblePack assembleServerPack
-PsanctuaryFocusedTests=recipes,progression,smoker285,hunter286
-PsanctuaryAtlasOnly=true -PsanctuaryOptional292ServerTests=true` :
**réussi en 2 min 52 s**, **46 tests serveur requis réussis**, Lithium et voix
effectivement chargés. Recettes, progression, lasso du Smoker et bond du Hunter
sont exercés avec ces dépendances. Les contrôles de ressources, de packwiz et
de l'habillage passent aussi. Le test de quota de baleines déjà en échec dans
[beta.291](packwiz-logo-beta291.md) reste hors de ce périmètre, sans correction
ni validation nouvelle de ce cas.
- Parcours graphique **Vulkan / MoltenVK 1.4.2 / Apple M1 avec Sodium 0.9.2**,
réussi en **38 s** : quatre mods présents, Sound Physics initialisé, entité
masquée derrière le mur puis visible après retrait ; Bobby actif, stockage
persistant et **35 chunks de cache** visibles après un déplacement de huit
chunks avec une distance d'envoi de quatre. Authentification et connexion UDP
vocales réelles, menus vocaux FR/EN ouverts en gardant le microphone muet.
Les captures du mur, de l'entité réapparue et du menu FR sont inspectées.
- Le même parcours **Vulkan sans Sodium** réussit en **43 s**, avec les mêmes
contrôles, 35 chunks de cache et menus FR/EN. Un premier passage avait atteint
tous les contrôles avant de se bloquer dans la synchronisation des threads du
lanceur Fabric pendant la fermeture du monde ; il a été interrompu après
capture des piles. La nouvelle exécution se ferme normalement. Cette limite
du premier essai reste dans le journal, sans la présenter comme un succès.
- Deux synchronisations client depuis le ZIP Prism réussies : **huit JAR**,
un seul Sanctuary, mêmes hashes au second passage, logo de l'installateur
conservé et trois fichiers témoins personnels inchangés. Puis deux passages
supplémentaires avec un choix Bobby désactivé déjà persisté, simulé dans le
cache de test : Bobby n'est pas réinstallé et le choix reste faux.
- Deux synchronisations serveur réussies : exactement les quatre JAR du
profil serveur ; aucun Bobby, Entity Culling, Sodium ou Sound Physics client.
- Les **11 tests** du vérificateur Web passent, y compris la comparaison des
dépendances partagées avec le relevé serveur et le refus d'un mod client dans
son profil. Le MRpack exporté possède les sept dépendances distantes et leurs
bons côtés et options ; les overrides sont limités à Sanctuary et son icône.
- Contrôle complémentaire des baleines avec les quatre mods, Sodium et Vulkan :
les assertions de rendu translucide, modèle animé, œuf FR/EN, deux entités
chargées et déplacement réel atteignent `WHALE290_CLIENT_PASS`. La capture
`0001_whale290-ghosts.png` est inspectée. Ce parcours se bloque ensuite à la
fermeture dans la synchronisation du lanceur de tests Fabric et est arrêté
après capture des piles ; il ne constitue pas une exécution complète réussie.
- Après ajout des notices, le JAR et les archives sont réassemblés et les
synchronisations sont répétées sur les binaires finaux. Les **2 658 classes
de jeu** restent identiques à beta.291. Le vérificateur Web accepte le MRpack
et le ZIP Prism finaux contre les métadonnées préparées et les hashes du
serveur de test synchronisé, avec état de service simulé pour cette vérification
hors ligne ; aucune CT de production n'est contactée.
Les essais utilisent uniquement des mondes et dossiers de développement sous
`build/`. Les copies et hashes finaux sont consignés dans
`build/optional-mods292/`, avec les journaux, captures et reçus natifs.
Le passage vocal audible à deux joueurs, l'accès UDP depuis Internet et les
rendus propres aux familiers et multiblocs avec culling restent des
vérifications complémentaires à effectuer avant d'en revendiquer la couverture.
Commande du parcours client principal (ajouter `-PsanctuarySodiumClientTests=true`
pour le passage avec Sodium) :
```sh
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryOptional292ClientTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=8 \
-PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true \
-PsanctuaryFocusedTests=recipes,progression
```
L'option supplémentaire `-PsanctuaryOptional292WhaleOnly=true` sélectionne
le diagnostic des baleines avec le même ensemble de mods ; son blocage de
fermeture observé ci-dessus reste ouvert.
## Livraison et suite
Le compteur du pack et du mod est aligné sur **beta.292**. Les archives locales
conservent l'habillage packwiz, les options et le canal de la Beta. Un ZIP Prism
préparé ne fait pas avancer le canal public : avant publication, ce canal sert
encore la version publiée. Aucune installation de jeu, sauvegarde personnelle,
publication Web, release Gitea ou configuration réseau n'est modifiée ici.
Dozei Stream et Only Fun restent des modules personnels futurs, avec leurs
[tickets de cadrage](integrations-mods-next.md). Aucun artefact fictif n'est
ajouté au pack pour ces projets.
Artefacts locaux vérifiés, reçus dans `artifacts.json` :
| Fichier dans `build/` | Octets | SHA-256 |
| --- | ---: | --- |
| `Sanctuary-beta.292.mrpack` | 16 753 207 | `28980cec018fc81f700cb8ecb3981199537e04ff737bf58b220ce442b7e5dc56` |
| `Sanctuary-Prism-beta.292.zip` | 3 928 525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.292.zip` | 4 036 530 | `0ac362bbfbfd2c03efdaf6b209d9319e648ad546bee074521038fffc86bb640a` |
JAR Sanctuary : `0163da08897de96559ab51f482363bd00c03cfb3309784cdb6e112acf25a4862`.
Le ZIP Prism d'amorçage a les mêmes octets qu'en beta.291 : il contient l'outil,
le logo et l'adresse stable, et les versions de Minecraft/Loader n'ont pas changé.
Le MRpack et les métadonnées du canal préparé contiennent les nouveaux mods.
+49
View File
@@ -0,0 +1,49 @@
{
"version": "beta.308",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.308.jar",
"sha256": "103e08039063633829b4f2059f25e32920cdb7e4df6d1e02512f40a35c0390eb",
"previous_verified_sha256": "e510871bd515e5b52f2e1b218b593b49ff74ffae320e9b6b665ef1629c53d3d0",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity$1.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity$2.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/screen/KitchenOvenScreen.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$FuelSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$IngredientSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$OutputSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$1.class"
],
"generated_json": {
"cuisine": 432,
"kitchen": 192,
"agriculture": 376
},
"culinary_source_classes": 44,
"culinary_compiled_classes_verified": 62,
"oven_recipes": 13,
"unchanged_pngs": 1108,
"server_required": 63,
"oven_scenarios": 11,
"client_vulkan": {
"log": "build/oven308-client.log",
"screenshots": "build/oven308-screenshots",
"screenshot_count": 12,
"world_seed": 308,
"sodium": "0.9.2+mc26.3"
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"build_log": "build/oven308-build.log"
}
+128
View File
@@ -0,0 +1,128 @@
# CUI-308 / IA-08 — cuisinière, grille et cuisson automatique
> Correction locale suivante : [beta.309 retire l'aperçu, garde une seule sortie
> et bloque le remplissage de la grille par entonnoir](oven-single-output-beta309.md).
> Cette page conserve le résultat historique de beta.308.
Demande du créateur du 28 octobre 2026, précisée : **démarrage automatique
comme un four**, et **recettes de cuisine uniquement**. Préparation locale
**beta.308**, après beta.307, sur la même branche `codex/itsalive-26-3`.
Aucune publication, installation dans Prism, mise à jour de canal ou de serveur.
## Cycle jouable
La cuisinière réunit une **grille persistante 3 × 3**, un combustible natif et
une sortie pour les plats terminés. L'interface montre aussi un **aperçu
« À cuire / To cook »**, séparé de cette sortie. Cet aperçu indique la recette
reconnue mais ne peut être retiré, déplacé, cloné ou collecté par double-clic.
Ses aides FR/EN expliquent le paiement en fin de cuisson.
La cuisson commence automatiquement lorsqu'une recette valide, de la place
en sortie et une source de combustible sont présents. Les ingrédients restent
visibles et disponibles dans la grille pendant **toute la durée de cuisson**.
À l'échéance seulement, la cuisinière consomme les quantités d'une recette,
rend les récipients réellement payés et range le plat dans la sortie.
Les ingrédients restants permettent un nouveau cycle complet, sans bouton.
Trois pâtes donnent donc trois pains sur trois durées de 240 ticks.
Fermer le menu laisse la grille dans le bloc et la cuisson continue tant que
le chunk est chargé. Retirer, remplacer, déplacer ou modifier la quantité ou
les composants d'un ingrédient **annule l'avancement en cours**. Cela couvre
les Maj-clics partiels, les autres joueurs, les entonnoirs et les changements
de pile effectués directement. Si la nouvelle grille reste une recette valide,
un nouveau cycle démarre automatiquement à zéro ; sinon elle attend.
Remettre immédiatement le même ingrédient ne rend pas l'ancien avancement.
Prendre un plat déjà cuit ou ajouter du combustible n'édite pas la grille et
ne remet pas sa cuisson à zéro. Une sortie pleine ou incompatible empêche
l'allumage d'un nouveau combustible et remet le cycle bloqué à zéro, sans
consommer les ingrédients. Libérer la sortie permet un nouveau cycle complet.
Le Maj-clic utilise les mêmes règles de combustible côté client et serveur.
Le combustible suit les composants et durées du four Minecraft **26.3**.
Un charbon est payé à l'allumage, comme dans un four ; retirer un ingrédient
ne rembourse pas le combustible déjà brûlé. La chaleur restante continue de
se dépenser. Les combustibles encore en pile restent disponibles. Une pause
par manque de combustible conserve l'avancement tant que la grille est intacte.
Les **treize recettes de cuisinière**, leurs ingrédients, résultats, identifiants
et durées de 240 à 380 ticks restent en place. La cuisinière ne fabrique pas
les outils et objets de l'établi ordinaire et ne fond pas les minerais.
Les 92 recettes du catalogue culinaire et les autres appareils restent dans
leurs circuits existants. La fabrication de la cuisinière conserve trois
lingots de fer, quatre blocs de briques, une table de fabrication et un four.
## Continuité des sauvegardes
L'identifiant `sanctuary:kitchen_oven` reste stable pour le bloc, l'objet, le
menu et le bloc entité. Les **onze cases sauvegardées** gardent leur encodage :
0–8 pour la grille, 9 pour le combustible, 10 pour les plats cuits. L'aperçu
est une case virtuelle du menu, jamais une douzième case de stockage.
Les champs natifs existants `CookingProgress`, `CookingDuration`,
`ActiveRecipe`, `BurnTime` et `BurnDuration` sont conservés. La surveillance de
la grille est reconstruite depuis les objets chargés, sans nouveau champ
de sauvegarde ni conversion automatique. Une cuisson en cours reprend avec
ses ingrédients et son avancement. Le temps écoulé hors chargement ne produit
aucun repas supplémentaire, comme pour une cuisson fondée sur les ticks du bloc.
La casse rend uniquement le vrai inventaire restant, une seule fois. Elle
ne transforme pas l'aperçu en plat. Aucun monde personnel n'est ouvert ou
modifié par cette préparation ; les tests utilisent de nouveaux mondes ignorés.
## Vérifications
`check build assemblePack` passe en **3 min 6 s**, avec **63 tests serveur
requis réussis**, dont onze nouveaux scénarios de cuisinière. Les régressions
appareils, cuisine, moulin, recettes, progression et connaissances alimentaires
sont incluses.
Minecraft **26.3**, Fabric API **0.160.5+26.3**, Java 25. Les onze nouveaux tests
serveur couvrent les échéances et lots successifs, la fermeture, l'annulation
près de la fin, le Maj-clic partiel, les changements directs de pile, la sortie
bloquée, l'aperçu non retirable, le rechargement natif d'une cuisson en cours,
les récipients, le périmètre culinaire et la casse sans duplication.
Les régressions des appareils exécutent également les treize recettes réelles.
Le parcours **Vulkan avec Sodium 0.9.2** passe en **1 min 41 s**. Il utilise
de vrais paquets d'insertion et de retrait, vérifie la prédiction du Maj-clic
du combustible, l'aperçu non retirable et les écrans FR/EN aux échelles GUI
2/3/4. Retirer la pâte annule une cuisson aux trois quarts sans la consommer.
Après remise en place, les trois cycles se terminent avec le menu fermé et
produisent exactement trois pains. Une fermeture/réouverture réelle du monde
conserve ces trois pains, récupérés ensuite par un vrai Maj-clic. Les treize
recettes de cuisinière restent présentes dans JEI. Les douze captures sont
archivées dans `build/oven308-screenshots/`, journal `build/oven308-client.log`.
Les **1 000 JSON générés** sont identiques aux sources et au JAR beta.307 :
432 culinaires, 192 d'appareils et 376 agricoles. Les 44 sources culinaires
et leurs 62 classes compilées sont présentes et contrôlées. L'archive ne
change que les classes de cuisinière, les libellés FR/EN, la version et les
notices ; le nouveau slot d'aperçu ajoute une classe interne de menu.
Les **1 108 PNG** de l'archive sont identiques à beta.307. Les copies du JAR
packwiz client et serveur sont identiques au binaire vérifié ; le template
ne change que par les notices et les deux fichiers de libellés.
SHA-256 de `sanctuary-beta.308.jar` :
```text
103e08039063633829b4f2059f25e32920cdb7e4df6d1e02512f40a35c0390eb
```
[Reçu de validation](oven-beta308-verification.json). Journaux complémentaires
dans `build/oven308-build.log` et `build/oven308-artifacts.log`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryOven308ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=oven308 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Le parcours graphique cible uniquement **Vulkan avec Sodium 0.9.2**, dans un
monde de développement neuf de graine **308**. Aucun PNG n'est modifié :
l'interface assemble les panneaux et sprites vanilla de l'établi et du four.
@@ -0,0 +1,54 @@
{
"version": "beta.309",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.309.jar",
"sha256": "32ca2d855f71ac29af0a62ba9f4e463e3d11f172fefe7ecdbb1afad086b63ff9",
"previous_verified_sha256": "103e08039063633829b4f2059f25e32920cdb7e4df6d1e02512f40a35c0390eb",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity$1.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity$2.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/KitchenOvenBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/screen/KitchenOvenScreen.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$FuelSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$IngredientSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$OutputSlot.class",
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [],
"removed_jar_entries": [
"fr/koka/sanctuary/cuisine/menu/KitchenOvenMenu$1.class"
],
"generated_json": {
"cuisine": 432,
"kitchen": 192,
"agriculture": 376
},
"culinary_source_classes": 44,
"culinary_compiled_classes_verified": 61,
"oven_recipes": 13,
"machine_slots": 11,
"cooked_output_slots": 1,
"ingredient_hopper_insertion": false,
"cooked_hopper_extraction": true,
"unchanged_pngs": 1108,
"server_required": 63,
"oven_scenarios": 11,
"client_vulkan": {
"log": "build/oven309-client.log",
"screenshots": "build/oven309-screenshots",
"screenshot_count": 11,
"world_seed": 309,
"sodium": "0.9.2+mc26.3"
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"build_log": "build/oven309-build.log"
}
+93
View File
@@ -0,0 +1,93 @@
# CUI-309 — une seule sortie pour la cuisinière
Correction demandée par le créateur le 28 octobre 2026 : **une seule sortie,
comme un four Minecraft**, et abandon du remplissage automatique de la grille.
Préparation locale **beta.309**, après beta.308, sur `codex/itsalive-26-3`.
Aucune publication, installation dans Prism ou mise à jour de serveur/canal.
## Résultat
La cuisinière présente sa grille 3 × 3, le combustible et **une seule case de
sortie**, centrée face à la flèche de cuisson. La case d'aperçu « À cuire »
ajoutée en beta.308 est retirée, ainsi que ses aides et sa flèche supplémentaire.
La sortie reste vide jusqu'à la fin d'une cuisson réelle.
À la demande suivante du créateur, l'icône de feu (vide et animée) est décalée
de **2 pixels GUI vers la gauche et de 2 pixels vers le haut**, sans déplacer
la case de combustible.
Le cycle confirmé précédemment reste en place : démarrage automatique avec
une recette de cuisine et du combustible, ingrédients conservés dans la grille
jusqu'à l'échéance, paiement d'un lot en fin de cuisson, puis enchaînement des
lots disponibles. Modifier la grille annule l'avancement ; fermer le menu
laisse la cuisson continuer tant que le chunk est chargé. Les treize recettes
de cuisinière et leurs durées sont conservées.
La grille se remplit **à la main**. Aucun ingrédient n'est insérable par
entonnoir, quelle que soit la face. Un entonnoir placé dessous récupère
uniquement les plats déjà cuits dans l'unique sortie ; il ne prélève ni les
ingrédients ni le combustible. L'accès latéral au combustible déjà présent
reste disponible. Aucune grille d'automatisation spéciale n'est ajoutée.
Les identifiants et les onze cases sauvegardées restent inchangés : neuf
ingrédients, combustible en case 9 et plats cuits en case 10. L'ancienne case
d'aperçu n'était pas sauvegardée. Retirer cette case virtuelle ne convertit ni
ne supprime aucun objet. Les compteurs de cuisson et de combustion gardent
leur encodage. Aucun monde personnel n'est ouvert ou modifié.
## Vérifications
`check build assemblePack` passe en **3 min 32 s**, avec **63 tests serveur
requis réussis**, dont les onze scénarios de cuisinière adaptés. Le parcours
Vulkan repasse après le déplacement du feu ; les contrôles portent sur le
binaire final de cette préparation.
Minecraft **26.3**, Fabric API **0.160.5+26.3**, Java 25. La régression serveur
de la cuisinière vérifie maintenant un véritable entonnoir d'alimentation
bloqué au-dessus et un véritable entonnoir d'extraction dessous : aucune sortie
avant l'échéance, puis exactement un pain extrait et deux pâtes encore en
grille après le premier cycle. Les autres scénarios de beta.308 restent actifs.
Le parcours client est adapté à l'unique sortie, aux onze cases réelles et
aux indices natifs d'inventaire retrouvés. Les tests graphiques restent
exclusivement **Vulkan avec Sodium 0.9.2**, dans un nouveau monde de graine
**309**. Aucun PNG n'est modifié ; l'interface utilise les panneaux vanilla.
Les classes de régression et leurs options gardent leur nom `Oven308`.
Le parcours Vulkan passe en **1 min 47 s**, après le décalage du feu. Les
écrans FR/EN aux échelles GUI 2/3/4 présentent une seule sortie et aucune case
virtuelle. De vrais paquets d'inventaire vérifient le remplissage manuel, le
combustible, l'annulation d'une cuisson aux trois quarts et sa reprise depuis
zéro. Trois cycles se terminent avec le menu fermé, donnant exactement trois
pains dans l'unique sortie. Une fermeture/réouverture réelle conserve ces
trois pains et leur retrait par Maj-clic. Les treize recettes restent dans JEI.
Les onze captures sont dans `build/oven309-screenshots/`, avec l'icône vide
et la flamme animée décalées ensemble. Journal `build/oven309-client.log`.
Les **1 000 JSON générés** et les treize recettes de cuisinière sont inchangés.
Les 44 sources culinaires et leurs 61 classes compilées sont contrôlées dans
le JAR. La classe interne de l'ancien aperçu a disparu ; seules les classes
de cuisinière, la version, les notices et le retrait des trois libellés
d'aperçu diffèrent de beta.308. Les **1 108 PNG** sont identiques octet pour
octet. Les copies packwiz client et serveur sont identiques au JAR vérifié ;
le template ne change que par ses notices et fichiers de libellés FR/EN.
SHA-256 de `sanctuary-beta.309.jar` :
```text
32ca2d855f71ac29af0a62ba9f4e463e3d11f172fefe7ecdbb1afad086b63ff9
```
[Reçu de validation](oven-single-output-beta309-verification.json).
Journaux de build et d'archives dans `build/oven309-build.log` et
`build/oven309-artifacts.log`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryOven308ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=oven308 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
+109
View File
@@ -0,0 +1,109 @@
# PACK-LOGO — logo Sanctuary pendant packwiz
Branche `codex/packwiz-sanctuary-logo`, préparation locale **beta.291**, depuis
le socle beta.290. Demande du 26 octobre 2026 : afficher le bandeau Sanctuary
fourni dans la fenêtre de téléchargement et de mise à jour, avant Minecraft.
## Résultat
Le PNG `minecraft.png` fourni par le créateur est conservé octet pour octet
dans `launcher/packwiz/sanctuary.png` (1024 × 256, RGBA). Son SHA-256 est
`efee73a6c812c89b2900d41f6446c0f906ccf85136b6c226daf42870a41a5157`.
La fenêtre l'affiche sur fond noir à 640 × 160, proportions conservées,
au-dessus de la progression réelle. Ses boutons, le texte initial et le
compte à rebours suivent la langue du système : français, anglais sinon.
Les messages et dialogues du moteur amont conservent leurs traductions amont.
`scripts/packwiz_installer.py` télécharge le JAR officiel
[packwiz-installer v0.5.14](https://github.com/packwiz/packwiz-installer/releases/tag/v0.5.14),
vérifie son SHA-256, puis remplace uniquement `InstallWindow.class` par
l'adaptation Java de sa fenêtre Swing. Toutes les autres classes et notices
restent identiques : téléchargement, vérification des hashes, sélection des
mods facultatifs, erreurs et annulation continuent de dépendre de packwiz.
La licence MIT de comp500 et le source de l'adaptation sont joints au JAR.
Le logo est embarqué : aucun téléchargement d'image n'est requis pour l'afficher.
Le build utilise Java 25 ; les classes de la fenêtre ciblent Java 8 comme
l'amont. Les SHA-256 de l'amont, du logo et du résultat sont fixés dans
`launcher/packwiz/installer.json`. Une compilation différente échoue avant
d'écrire le JAR de distribution. Les dépendances et JAR générés restent dans
`build/packwiz-branding/`, ignoré par Git.
## Archive Prism et mises à jour
La commande habituelle `python3.14 scripts/pack.py prism <url-du-canal>`
embarque le bootstrap officiel vérifié et le nouvel installateur vérifié,
avec la même configuration Minecraft 26.3 / Fabric 0.19.5 et le même canal
stable. `--bootstrap-no-update` empêche le bootstrap de remplacer la fenêtre
Sanctuary par le binaire officiel. Cette option concerne **l'installateur** ;
la synchronisation des mods packwiz reste active à chaque lancement.
Le nom beta.291 du ZIP local n'avance pas ce canal : avant publication, un
lancement visant l'adresse stable récupère la version déjà publiée, beta.289
au moment de cette préparation. Les essais beta.291 utilisent un serveur HTTP
de développement isolé, jamais le monde ni le serveur personnel.
Les évolutions de l'installateur doivent donc être préparées et testées
explicitement, avec mise à jour du verrou et du vérificateur Web. Une simple
avance du canal de mods ne met pas à jour l'outil d'une instance existante.
Lors d'une future synchronisation locale demandée, sauvegarder l'instance,
copier le JAR vérifié et ajouter l'option à sa commande avant lancement en
conservant les autres réglages ; conserver cette même instance, sans réimport.
Le kit serveur conserve son installateur officiel et son fonctionnement sans
interface. Le logo n'est pas ajouté à l'index des fichiers du monde ou du jeu.
`verify_prism` contrôle désormais les deux JAR par leurs hashes et la présence
de l'option qui conserve l'habillage. Les sauvegardes et fichiers personnels
restent refusés dans le ZIP. Le MRpack n'embarque pas les commandes Prism et
ne suffit pas à installer cet habillage.
## Vérifications
- Logo fourni identique octet pour octet ; JAR résultant contrôlé par son
SHA-256 `9e2912fdd05e5c23721acd58cd5c61bbf13061e453627e8f4df9a4c53f7aa875`.
- Les deux tests de distribution de `test_packwiz_installer.py` passent :
toutes les entrées de l'amont sont relues, seule la classe de fenêtre change,
et le véritable JAR vérifié est retrouvé dans l'export Prism.
- Les dix tests de `test_publish_web_pack.py` passent : outils modifiés refusés,
option de conservation obligatoire, contrôles de publication préservés.
- Parcours Swing réel en FR et EN réussi avec le `GUIHandler` officiel :
progression déterminée/indéterminée, options, Annuler, Continuer et compte à
rebours. Les captures `preview-fr.png` et `preview-en.png` sont inspectées.
Le test ne lance ni Minecraft ni un microphone.
- Deux exécutions de `check build assemblePack` avec le profil
`whale290,recipes,progression` échouent sur le même test serveur hérité :
`eggQuotaNaturalSpawnAndFlightUseActualServerEntities`, quota après utilisation
de l'œuf entre Overworld et Nether (18 réussites sur 19). Le profil isolé
`whale290` échoue également sur ce cas (6 réussites sur 7). Les sources du
comportement et de son test ne sont pas modifiées dans ce chantier. Cet échec
reste ouvert ; aucune validation complète des baleines n'est revendiquée.
- `./gradlew check build assemblePack -PsanctuaryFocusedTests=recipes,progression
-PsanctuaryAtlasOnly=true` réussit en **2 min 42 s**, avec **13 tests serveur
requis réussis**, les contrôles purs de `check`, le JAR et les profils client
et serveur assemblés. Ce périmètre ne valide pas le test de baleines en échec.
- Comparaison des JAR beta.290/beta.291 : **2 658 classes de jeu identiques**,
aucune classe ajoutée. Le compteur et les notices évoluent, sans changement
du code de jeu.
- Deux lancements du véritable bootstrap et de l'installateur adapté réussis
depuis le ZIP extrait dans `native instance with spaces/`, avec les arguments
de sa commande Prism et un canal HTTP local beta.291. Un seul JAR Sanctuary,
fichiers gérés identiques au second passage, installateur avec logo conservé,
trois fichiers témoins personnels inchangés. Aucun monde ouvert. Le mode
sans interface vérifie la synchronisation ; les tests Swing ci-dessus
vérifient la fenêtre. Reçu `native-validation.json`.
Archive locale `build/Sanctuary-Prism-beta.291.zip` : **3 928 525 octets**,
SHA-256 `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9`.
JAR Sanctuary beta.291 :
`bd130418a05f820dffd86b00595c5b7ce96293ec82867926f5493a95736aee73`.
Les interfaces Linux/Windows, le lancement Minecraft depuis Prism et une
mise à jour de l'instance personnelle ne sont pas revendiqués par ces essais
macOS. Le test de quota des baleines reste à résoudre avant une validation
complète de cette base de jeu.
Les reçus et captures restent sous `build/packwiz-branding/`.
Les mods évoqués pendant ce chantier sont seulement
[préparés en tickets pour la passe suivante](integrations-mods-next.md).
Aucune publication du canal, du site, du serveur Beta ou de l'instance
personnelle n'est demandée ou effectuée par cette préparation locale.
+100 -39
View File
@@ -1,5 +1,85 @@
# Distribution packwiz et Prism
Le [téléchargement direct de Sanctuary Web](beta-download.md) donne une instance
Prism déjà configurée. Le premier lancement télécharge les mods ; les suivants
suivent les publications explicitement demandées via Codex.
La [procédure de reprise et de publication complète](updates.md) relie aussi
le serveur dédié, le téléchargement du site et l'instance locale. Les reçus
des anciennes versions ci-dessous restent historiques.
## beta.318 — récoltes et recettes séchées publiées
[Livraison complète du 30 octobre 2026](release-beta318.md). Récoltes par climat,
produits du séchoir, dix-huit recettes et coups épicés sans dégâts. Serveur,
site et Prism sur le même JAR ; 204 tests serveur, 7 tests du site, deux passages
isolés puis deux personnels. Le profil d'essai local laisse place au canal public.
## beta.315 — cuisine et agriculture publiées
[Reçu de livraison](release-beta315.md) : refonte It's Alive beta.299–315,
release et canal client/serveur, CT 350, téléchargement Web et même instance
Prism mis à jour. 187 tests serveur, neuf JAR clients/cinq serveur, deux passages
isolés et personnels identiques. 211 fichiers serveur et 936 fichiers personnels
protégés conservés. [Export de textures](itsalive-textures-export-beta315.md).
## beta.293 — livraison complète publiée
[Reçu de livraison](release-beta293.md) : Happy Creepers de la branche dédiée,
baleines, logo et quatre mods facultatifs réunis. Release immuable, canal
client/serveur, CT 350, téléchargement Web et même instance Prism personnelle
mis à jour. Import neuf et instance existante vérifiés sur deux passages,
sauvegardes et réglages conservés. Voix UDP 25565 annoncée sur le port public
25567 via la règle Beta existante ; ping applicatif réussi depuis le LAN.
L'audio à deux joueurs et l'accès depuis un réseau extérieur restent à essayer.
## beta.292 — quatre mods facultatifs (préparation locale)
[Voix, cache de chunks et optimisations](optional-mods-beta292.md) : Simple
Voice Chat 2.6.24, Bobby 5.2.16, Lithium 0.26.2 et Entity Culling 1.11.3, tous
épinglés pour Minecraft 26.3 / Fabric. Les quatre sont facultatifs côté client ;
Lithium et la voix sont aussi présents dans le profil serveur. Le logo de
beta.291 et les préférences de sélection sont conservés. Préparation locale,
sans avance du canal public ni modification d'installation personnelle.
## beta.291 — logo dans l'installateur (préparation locale)
Le [bandeau Sanctuary fourni](packwiz-logo-beta291.md) est embarqué dans la
fenêtre packwiz du ZIP Prism préparé. Le bootstrap reste officiel ; la fenêtre
est adaptée et l'installateur épinglé avec `--bootstrap-no-update`. Les mods
continuent de suivre le canal stable. Les instances déjà installées devront
recevoir ce JAR et cette option lors d'une synchronisation explicitement demandée,
en conservant la même instance. Cette préparation ne publie pas le canal.
## beta.280 — JEI embarqué et profil serveur
JEI rejoint le JAR Sanctuary ; `mods/sanctuary.pw.toml` reste le seul artefact
Sanctuary à publier. `python3 scripts/pack.py release <sanctuary-https-url>`
prépare désormais le client et `server/pack.toml`, qui partagent le même JAR,
la même URL et le même hash. Le profil serveur contient seulement Fabric API
et Sanctuary ; Sodium et Sound Physics restent facultatifs côté client.
Les deux profils sont publiés dans le même commit du canal, après vérification
du JAR immuable. L'ancienne entrée JEI est retirée de l'index client.
`./gradlew assembleServerPack` construit un kit Linux avec les outils épinglés
et les commandes de synchronisation/démarrage. [Mode d'emploi](server-pack.md),
[contrat et vérifications](jei-server-beta280.md). La configuration Sanctuary Web,
MariaDB et les secrets restent hors de l'index. La préparation locale ne publie
pas le canal et ne met pas à jour une installation personnelle.
Livraison du 25 octobre : [release beta.280](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.280)
publiée, canal `338e8a62387048c7e703ef036fda759ef57b4130`, puis nouveau serveur
CT 350 sur `gpu` installé avec le kit vérifié. Le monde neuf, les paramètres
et les services Web sont vérifiés dans le [reçu](jei-server-beta280.md).
Une synchronisation du serveur conserve 61 fichiers suivis. L'Alpha et
l'instance Prism personnelle restent hors de cette mise en service.
La règle Bbox permanente est ensuite vérifiée et le secours UPnP Beta retiré.
Le domaine Minecraft `beta.sanctuary-minecraft.net` répond sans ce secours,
avec 20 places. [MRpack client beta.280](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.280/Sanctuary-beta.280.mrpack)
vérifié et disponible ; le [reçu](jei-server-beta280.md) conserve les empreintes
et la limite de validation réseau.
## beta.257 — Mods client séparés
JEI Sanctuary, Sound Physics Remastered et Sodium sont facultatifs et séparés
@@ -2078,18 +2158,18 @@ La procédure complète, également utilisable manuellement :
1. Incrémenter ensemble les versions de `gradle.properties` et `packwiz/pack.toml`
selon la [convention `beta.xxx`](versioning.md).
2. Exécuter `./gradlew check build assemblePack` et les vérifications du ticket.
3. Préparer les métadonnées de la livraison, avec les deux URL exactes :
3. Pour préparer les métadonnées manuellement depuis beta.280, utiliser la
seule URL du JAR Sanctuary contenant JEI :
```sh
python3 scripts/pack.py release \
https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.257/sanctuary-beta.257.jar \
https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.257/jei-sanctuary-26.3-30.32.0-sanctuary.4.jar
https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.xxx/sanctuary-beta.xxx.jar
```
4. Pousser le commit source vérifié. Créer une release Gitea correspondant à ce
commit et joindre les JAR Sanctuary et JEI construits, sans remplacer les artefacts d'une release
commit et joindre le JAR Sanctuary construit, sans remplacer les artefacts d'une release
antérieure. Vérifier que le téléchargement public possède le SHA-256 indiqué
dans `build/packwiz-release/mods/sanctuary.pw.toml` et `jei-sanctuary.pw.toml`.
dans `build/packwiz-release/mods/sanctuary.pw.toml`, identique au profil serveur.
5. Publier le contenu de `build/packwiz-release/` à la racine de la branche
`packwiz` dans un seul commit, puis vérifier les fichiers et hashes depuis
l'URL publique. Préserver l'historique de ce canal et ne jamais y copier le
@@ -2111,48 +2191,29 @@ python3 scripts/pack.py prism https://git.botsu.net/koka/sanctuary-beta/raw/bran
Il contient les versions exactes Minecraft/Fabric, la commande de lancement et
`packwiz-installer-bootstrap` v0.0.3. Le script vérifie le SHA-256 du bootstrap
officiel avant d'écrire `build/Sanctuary-Prism-auto-update.zip`. Ce ZIP est réservé
officiel avant d'écrire `build/Sanctuary-Prism-beta.xxx.zip`. Ce ZIP est réservé
aux nouvelles installations ; les instances déjà branchées sur packwiz suivent
le canal sans être réimportées.
## Raccorder l'instance Prism existante
## Importer l'instance Prism prête
Fermer Minecraft avant de modifier ses mods. Fermer également Prism avant de
modifier directement `instance.cfg`, pour éviter que son état en mémoire écrase
les changements. Dans l'instance Sanctuary Beta :
Le bouton **Télécharger** de [Sanctuary Web](https://sanctuary-minecraft.net)
télécharge directement [Sanctuary-Beta.zip](https://sanctuary-minecraft.net/downloads/sanctuary-prism.zip).
Dans Prism : **Ajouter une instance → Importer depuis un ZIP**, choisir ce fichier,
puis lancer **Sanctuary Beta**. Packwiz télécharge automatiquement les mods.
La commande avant lancement et l'outil sont déjà dans l'archive.
1. Sauvegarder `instance.cfg` et les anciens JAR Sanctuary dans un dossier de
sauvegarde hors de `mods/`. Vérifier que l'instance utilise Minecraft
`26.3-pre-2` et Fabric `0.19.5` ; ne pas convertir une instance 26.2.
2. Mettre le bootstrap issu du ZIP dans son dossier `minecraft/` (ou `.minecraft/`
selon l'installation).
3. Dans **Modifier → Paramètres → Commandes personnalisées**, activer les
commandes et renseigner la commande avant lancement ci-dessous.
4. Pour une instance issue d'un ancien `.mrpack`, déplacer seulement l'ancien
JAR Sanctuary non géré dans la sauvegarde préparée, puis faire la première
synchronisation packwiz. Conserver les autres mods et données personnelles.
Si la synchronisation échoue, remettre ce JAR et les réglages sauvegardés.
5. Vérifier qu'il reste un seul mod Sanctuary actif et que `packwiz.json` est
présent dans le dossier Minecraft. Les prochaines mises à jour sont suivies
par ce manifeste local : ne pas le supprimer entre les versions.
Commande à coller dans l'interface Prism :
```text
"$INST_JAVA" -jar "$INST_MC_DIR/packwiz-installer-bootstrap.jar" --bootstrap-main-jar "$INST_MC_DIR/packwiz-installer.jar" --pack-folder "$INST_MC_DIR" --multimc-folder "$INST_DIR" https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml
```
Une modification directe de `instance.cfg` doit échapper les guillemets au format
Qt INI (`\"`) et activer `OverrideCommands=true`. Ces clés et
`PreLaunchCommand` doivent être dans la section **`[General]`**, jamais ajoutées
après la section `[UI]`. Le ZIP préparé le fait déjà. Rouvrir les commandes
personnalisées dans Prism pour vérifier que la commande est effectivement lue.
Une instance importée d'un `.mrpack` peut être marquée `ManagedPack=true` :
dès que packwiz en assure les mises à jour, utiliser `ManagedPack=false` pour
éviter deux mécanismes de gestion sur le même pack.
Conserver cette même instance pour les versions suivantes : une publication
explicitement demandée via Codex est suivie au lancement suivant. Une instance
déjà branchée sur le canal stable n'a pas besoin d'être réimportée.
## Données locales et mondes
Depuis beta.295, le premier lancement du client ajoute le serveur Sanctuary
dans les favoris sans remplacer leur liste. Un marqueur local respecte ensuite
les suppressions volontaires ; le profil serveur distribue le logo 64 × 64.
Voir [le contrat](default-server-beta295.md).
Le pack livré possède uniquement les fichiers déclarés dans son index. Il ne
déclare ni `saves/`, ni `options.txt`, `servers.dat`, `screenshots/`, ni les packs
graphiques personnels. L'installation de packwiz et une mise à jour des mods
+80
View File
@@ -0,0 +1,80 @@
{
"version": "beta.310",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.310.jar",
"sha256": "4a2278d987b031b343a6d66694da50db0aeb408bb77785ce8c02ae0ed9174b26",
"previous_verified_sha256": "32ca2d855f71ac29af0a62ba9f4e463e3d11f172fefe7ecdbb1afad086b63ff9",
"changed_jar_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/blockstates/frying_pan.json",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json",
"data/sanctuary/loot_table/blocks/frying_pan.json",
"fabric.mod.json",
"fr/koka/sanctuary/cuisine/culinary/block/FryingPanBlock.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/AbstractTimedCulinaryBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/block/entity/FryingPanBlockEntity.class",
"fr/koka/sanctuary/cuisine/culinary/client/FryingPanHud.class",
"fr/koka/sanctuary/cuisine/culinary/client/renderer/FryingPanBlockEntityRenderer.class",
"fr/koka/sanctuary/cuisine/culinary/client/renderer/state/FryingPanRenderState.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [
"assets/sanctuary/models/block/frying_pan_layer_2.json",
"assets/sanctuary/models/block/frying_pan_layer_3.json",
"assets/sanctuary/models/block/frying_pan_layer_4.json"
],
"removed_jar_entries": [],
"generated_json": {
"cuisine": 432,
"kitchen": 195,
"agriculture": 376
},
"culinary_source_classes": 44,
"culinary_compiled_classes_verified": 61,
"pan_recipes_unchanged": 26,
"physical_pan_counts": [
1,
2,
3,
4
],
"heights_pixels": [
4,
8,
12,
16
],
"pan_output_slots": 1,
"shared_recipe_per_stack": true,
"native_inventory_size": 17,
"original_indices_preserved": [
0,
1,
2,
3,
4
],
"unchanged_pngs": 1108,
"server_required": 76,
"pan_scenarios": 13,
"client_vulkan": {
"log": "build/pan310-client.log",
"screenshots": "build/pan310-screenshots",
"screenshot_count": 13,
"world_seed": 310,
"sodium": "0.9.2+mc26.3"
},
"client_server_copies_identical": true,
"template_changed_entries": [
"THIRD_PARTY_NOTICES.md",
"assets/sanctuary/blockstates/frying_pan.json",
"assets/sanctuary/lang/en_us.json",
"assets/sanctuary/lang/fr_fr.json"
],
"template_added_entries": [
"assets/sanctuary/models/block/frying_pan_layer_2.json",
"assets/sanctuary/models/block/frying_pan_layer_3.json",
"assets/sanctuary/models/block/frying_pan_layer_4.json"
],
"build_log": "build/pan310-build.log"
}
+147
View File
@@ -0,0 +1,147 @@
# CUI-310 / IA-07 — poêles en ligne et piles de quatre
Choix du créateur le 28 octobre 2026 : **une recette commune par pile**.
Le modèle actuel fait quatre pixels de haut ; quatre poêles tiennent donc
dans un bloc. Chaque emplacement reste chauffé par-dessous. Des piles côte
à côte peuvent préparer des plats différents. Préparation locale **beta.310**
sur `codex/itsalive-26-3`, sans publication, installation ou déploiement.
## Contrat de stockage et de continuité
Ce lot ajoute une capacité réelle pour les ingrédients non empilables :
quatre omelettes doivent réellement payer quatre seaux de lait, et non créer
quatre plats depuis un seul seau. Les quatre positions de préparation restent
communes à toute la pile, avec une seule recette et une seule sortie.
L'identifiant `sanctuary:frying_pan` du bloc, de l'objet et du bloc entité
reste stable. Le nouvel état natif `pans` vaut 1 à 4 ; une ancienne sauvegarde
sans cette propriété se charge avec **une poêle**. Aucune ancienne colonne
n'est supprimée ou regroupée automatiquement.
Les indices d'inventaire **0 à 4 restent inchangés** : ingrédients 0–3,
résultat 4. Douze indices de réserve sont ajoutés au même inventaire natif :
| Position commune | Case historique | Réserves pour les poêles 2–4 |
| --- | ---: | --- |
| Ingrédient 1 | 0 | 5, 6, 7 |
| Ingrédient 2 | 1 | 8, 9, 10 |
| Ingrédient 3 | 2 | 11, 12, 13 |
| Ingrédient 4 | 3 | 14, 15, 16 |
| Plat terminé | 4 | Aucune autre sortie |
La lecture des anciennes cinq cases conserve chaque objet à son indice,
avec douze réserves vides. Les champs de cuisson et d'assemblage sont gardés.
Le champ additionnel `CookingPanCount` mémorise le nombre de poêles associé
à l'avancement, avec 1 par défaut pour l'ancien format. Un ajout de poêle
pendant la cuisson remet l'assemblage et l'avancement à zéro, y compris si
la pile est sauvegardée avant le tick suivant. L'indication des récipients à
récupérer est dérivée des objets et synchronisée sans nouvelle case de sortie.
Les piles physiques respectent toujours la taille maximale native des objets :
quatre seaux de lait restent quatre piles d'un seau, sans pile illégale.
Les quantités agrégées servent uniquement à la résolution de la recette.
La quantité réellement consommée est prélevée dans les cases physiques et
les récipients payés sont rendus une seule fois.
Ce contrat décrit une évolution **vers beta.310**. Pour revenir à une version
antérieure, il faut d'abord vider les réserves et récupérer les poêles de la
pile : une ancienne version ne connaît ni les nouveaux indices ni leur compte.
Aucun monde personnel n'est ouvert ou converti par cette préparation ; la
continuité est vérifiée dans des sauvegardes et mondes de développement neufs.
## Utilisation
- Poser une poêle, puis utiliser d'autres poêles sur le même bloc pour atteindre
deux, trois ou quatre couches. Chaque ajout consomme un objet ; la casse
rend toutes les poêles et chaque pile réelle d'ingrédients une seule fois.
- Chauffer chaque emplacement par-dessous avec une source reconnue. Une poêle
ne transmet pas la chaleur à un autre bloc de poêle au-dessus. Les anciennes
colonnes restent présentes ; la pose neuve se prolonge horizontalement.
- Ajouter les ingrédients par clic droit, un objet à la fois. Les quatre
positions de recette et leurs réserves sont partagées. Quatre seaux de lait
pour quatre omelettes occupent quatre cases natives distinctes.
- L'assemblage conserve sa fenêtre de 30 secondes, ou son départ après trois
secondes de stabilité si les quatre positions d'une recette sont remplies.
Les réserves d'un même ingrédient ne comptent pas comme quatre positions.
- Une cuisson traite au plus autant de recettes complètes que de poêles,
pendant la durée historique du plat. Deux œufs dans quatre poêles donnent
deux œufs au plat. Une préparation invalide paie aussi ses plats ratés.
- Les ingrédients restent présents jusqu'au paiement final. Modifier une case
annule l'avancement. Ajouter une poêle relance aussi l'assemblage.
- Maj-clic récupère d'abord la sortie commune, puis les ingrédients ou
récipients. Les récipients revenus dans une position vidée doivent être
collectés avant de commencer une nouvelle préparation. Si des ingrédients
restent dans cette position, les récipients sont déposés dans le monde.
- Un entonnoir peut alimenter les réserves par les côtés ou le dessus selon
les limites natives. La face inférieure expose seulement la sortie ; une
chaleur réelle doit toujours être présente juste sous la poêle pour cuire.
Les 26 recettes, leurs durées, les textures et les catégories créatives sont
conservées. Les piles voisines peuvent cuire des plats différents. Le contenu
commun apparaît dans la poêle supérieure, et le HUD FR/EN affiche le nombre
de poêles, le temps, la quantité terminée ou les récipients à récupérer.
## Validation locale
Le parcours client sur un monde plat de développement neuf, graine **310**,
a réussi sous **Vulkan / Apple M1**, avec **Sodium 0.9.2+mc26.3** :
- vrais paquets de pose en survie, paiement des quatre objets, plafond à
quatre et prolongement horizontal ;
- vrais clics d'ajout pour quatre œufs et quatre seaux de lait non empilables ;
- huit états de modèle chargés, 30 faces par couche, hauteurs visibles exactes
et texture historique résolue sur chaque face ;
- HUD français/anglais aux échelles 2, 3 et 4, assemblage, cuisson et quantité
prête ; les autres piles cuisent chacune leur propre bœuf ;
- ticks réels pour la cuisson, quatre omelettes payées, quatre seaux rendus ;
- fermeture et réouverture réelle du monde, récupération par Maj-clic des
quatre plats puis des quatre seaux, conservés ensemble dans l'inventaire ;
- 26 recettes historiques présentes dans JEI.
La fenêtre d'assemblage est avancée par une fixture après les interactions
réelles, pour ne pas attendre 30 secondes avant la cuisson ; le paiement,
la progression et les durées de cuisson restent réels. Treize captures sont
archivées dans `build/pan310-screenshots/` (ignoré). Le parcours client dure
47 secondes et son journal est `build/pan310-client.log` (ignoré).
Les treize nouveaux cas serveur vérifient la pose native, formes et loot,
les quatre capacités, les **26 recettes à quatre portions**, le lait et ses
récipients, l'ajout d'une poêle avant un paiement et avant sauvegarde,
les recettes voisines et l'absence de chauffe transmise verticalement,
la casse, les 17 indices, les anciennes cinq cases sans propriété `pans`,
les quantités insuffisantes et préparations ratées, le retrait d'une réserve
juste avant la fin et l'insertion par un entonnoir natif.
Commandes de vérification :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryPan310ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=pan310 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Les orientations supplémentaires et les ancrages particuliers du ticket IA-07
restent ouverts. Ce lot réalise le choix confirmé de piles partageant une
recette, avec des ingrédients réellement stockés et payés.
`check build assemblePack` a réussi en **3 min 27 s**, avec **76 tests serveur
obligatoires**. La comparaison stricte à beta.309 confirme les six classes
prévues, le modèle par couches, le loot, les trois libellés FR/EN, la version
et les crédits. Les 26 recettes de poêle et les **1 108 PNG** de l’archive
sont identiques. Les 432 JSON de cuisine, 195 d’appareils et 376 d’agriculture
sont comparés à leurs générateurs. Les copies client/serveur du JAR sont
identiques ; le modèle de pack de ressources emporte les trois nouveaux
modèles et leur état multipart.
[Reçu de vérification](pan-stacks-beta310-verification.json). JAR local :
`mods/sanctuary/build/libs/sanctuary-beta.310.jar`
SHA-256 :
`4a2278d987b031b343a6d66694da50db0aeb408bb77785ce8c02ae0ed9174b26`
Aucun push, tag, canal packwiz public, installation Prism ou serveur
personnel n’a été modifié.

Some files were not shown because too many files have changed in this diff Show More