Compare commits

...
Author SHA1 Message Date
koka cfa10559bc docs: record verified beta.325 pack, site and server delivery
Build Sanctuary / build (push) Waiting to run
2026-11-01 22:56:30 +01:00
koka aabc867a5c docs: prepare beta.325 release notes
Build Sanctuary / build (push) Waiting to run
2026-11-01 22:43:11 +01:00
koka 76a440ea80 fix: let rare chickens glide and power boats (beta.325) 2026-11-01 13:12:15 +01:00
koka e3b4613b10 Complete README history from beta.001 through beta.324
Build Sanctuary / build (push) Canceled after 0s
2026-10-31 14:00:50 +01:00
koka 4b9e44e75a Document verified beta.324 site and server delivery
Build Sanctuary / build (push) Canceled after 0s
2026-10-31 13:37:26 +01:00
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
786 changed files with 40440 additions and 217 deletions
+423 -27
View File
@@ -1,11 +1,371 @@
# Sanctuary
[Dernière release : beta.325](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.325) ·
[Reçu de livraison](docs/release-beta325.md) ·
[Installation et mises à jour](docs/packwiz.md).
[Sources de la version publiée](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.325).
L’historique ci-dessous couvre **beta.001 à beta.325**. Chaque entrée décrit
le chantier à sa date de préparation ; les titres précisent les regroupements
livrés. Les essais annulés et les chantiers non finalisés gardent leur statut.
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.325 — plané et bateaux des poules colorées livrés
[Les quatre poules rares utilisent les déplacements de la poule classique](docs/chicken-flight-beta325.md) :
plané lorsqu'elles sont portées et propulsion lorsqu'elles occupent un siège
de bateau, adultes comme poussins. Correctif ciblé sur le socle publié beta.324.
**25 tests serveur**, parcours **Vulkan avec Sodium**, construction et pack vérifiés.
[Livraison vérifiée](docs/release-beta325.md) : pack, serveur Beta et téléchargement
du site en beta.325 ; même instance Prism mise à jour à son prochain lancement.
## beta.324 — nouveautés regroupées et livrées
[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).
[Livraison vérifiée](docs/release-beta324.md) : Git poussé, serveur Beta actif,
canal et téléchargement du site en beta.324. La même instance Prism se met
à jour à son prochain lancement.
## beta.323 — poules colorées rares (intégrée à beta.324)
[Poules émeraude, rubis, saphir et or](docs/rare-chickens-beta323.md).
Une poule ordinaire peut pondre un œuf en or (une chance sur 256) ; lancé à
la main ou au distributeur, il fait éclore un poussin rare. Chaque variante
pond son produit à son propre rythme et reste stérile ; les textures adultes
et poussins de la 26.2 sont reprises. Préparation vérifiée : **34 tests serveur**
et parcours **Vulkan avec Sodium**. [Livrée dans beta.324](docs/release-beta324.md).
## beta.322 — préparation du séchoir, livrée en beta.324
[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, intégrée à beta.324.
## 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 (intégrée à beta.318)
[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 (intégrée à beta.318)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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é (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 (intégrée à beta.315)
[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 ! (intégrée à beta.315)
[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
@@ -638,6 +998,15 @@ beta.235 intégrée, adaptée au choix de masquer la carte. `check build assembl
[MRpack local beta.237](build/Sanctuary-beta.237.mrpack) vérifié ; aucune
publication ni mise à jour personnelle.
## beta.236 — aptitudes par thème et essai de carte dans Pause
[Regroupement des aptitudes en cinq thèmes](docs/aptitudes-beta236.md), avec
Enchantement et Alchimie et un choix personnel d’activation. Beta.237 rend
ensuite les achats permanents, sauf Carte et Noms des créatures.
Un [essai distinct de carte derrière Pause](docs/pause-map-layer-beta236.md)
utilise aussi ce numéro : ce calque est annulé, tandis que le raccourci **M**
et Story sont conservés. Les changements retenus sont réunis en beta.239.
## beta.235 — Essai réversible du menu Pause
[Disposition adaptative](docs/pause-columns-beta235.md) : avant Atlas, Aventure
@@ -1265,9 +1634,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,
@@ -1363,6 +1731,20 @@ commune avec le site. Shaders beta.151 conservés.
[Contrat et configuration](docs/community-contract-v1.md) ·
[Vérifications et limites](docs/community-beta154.md).
## beta.153 — chantier shaders non finalisé
[Inventaire historique des publications](docs/publications-beta144-166.md).
Chantier de shaders conservé dans les fichiers de travail locaux ; aucun
commit de livraison ni JAR Sanctuary vérifiable retrouvé. Cette préparation
n’a pas de tag ni de binaire publié.
## beta.152 — chantier shaders non finalisé
[Inventaire historique des publications](docs/publications-beta144-166.md).
Autre numéro de préparation shaders, sans commit de livraison ni JAR Sanctuary
vérifiable retrouvé. Le travail local est conservé ; aucune publication
artificielle n’a été créée pour compléter la numérotation.
## beta.151 — Nether, reflets des blocs et SSR
Synchronisation de l’inventaire au changement de dimension, retour de l’intensité
@@ -1432,11 +1814,6 @@ La [vision complète](docs/vision.md) conserve les intentions ; le
L’économie, les claims et les dimensions décrits dans la vision restent
à implémenter.
La version **beta.144** prépare une option d’**eau naturelle pixélisée** :
couleur du biome, trois profils selon le fond et visibilité adaptée en immersion.
Les océans gardent leur couleur native et le profil clair.
[Contrat et vérifications](docs/natural-water-beta144.md). Livraison en cours.
La version **beta.143** garde le sampler natif de précipitation pour la neige
saisonnière, mais ralentit son rythme : l'accumulation est espacée par un
facteur 12 et la fonte par le facteur temps réel 72. Les protections existantes
@@ -1455,6 +1832,14 @@ La [carte native beta.005](docs/atlas-beta005.md) prend le relais après
l’étude de Xaero et des alternatives libres.
## beta.144 — eau naturelle pixélisée
[Eau naturelle selon le biome et le fond](docs/natural-water-beta144.md) :
profils clair, légèrement teinté et étang, avec visibilité adaptée en immersion.
Les océans gardent leur couleur native et le profil clair ; les réglages sont
personnalisables et les choix existants sont conservés.
Publication confirmée dans l’[inventaire beta.144 à beta.166](docs/publications-beta144-166.md).
## beta.143 — Neige saisonnière en temps réel
Accumulation ralentie par un facteur 12 et fonte saisonnière ralentie par le
@@ -2031,6 +2416,17 @@ Parcours natifs, montures, arènes, anciens duels, compilation et archives véri
[Pack normal](build/Sanctuary-beta.074.mrpack) ·
[Monde plat rapide](build/Sanctuary-Test-beta.074.mrpack).
## beta.073 — arènes et paris
**Menu pause → Duels et arènes** (depuis beta.076) : arènes sans plafond d'inscrits, duels entre
joueurs ou familiers, mode mixte, règles visibles et mises en objets. Les
spectateurs consultent les combats annoncés et parient avant leur lancement.
Les joueurs meurent réellement ; les familiers gardent leur K.-O. habituel.
[Parcours, règles et contrat de sauvegarde](docs/arenas-beta073.md).
Client natif, régression des anciens duels, compilation et archives vérifiés.
[Pack normal](build/Sanctuary-beta.073.mrpack) ·
[Monde plat rapide](build/Sanctuary-Test-beta.073.mrpack).
## beta.072 — statues et plans natifs
**K** ouvre l’outil natif : transformer un modèle Minecraft en statue de blocs,
@@ -2045,17 +2441,6 @@ interopérabilité avec Litemapy vérifiés.
[Pack normal](build/Sanctuary-beta.072.mrpack) ·
[Monde plat rapide](build/Sanctuary-Test-beta.072.mrpack).
## beta.073 — arènes et paris
**Menu pause → Duels et arènes** (depuis beta.076) : arènes sans plafond d'inscrits, duels entre
joueurs ou familiers, mode mixte, règles visibles et mises en objets. Les
spectateurs consultent les combats annoncés et parient avant leur lancement.
Les joueurs meurent réellement ; les familiers gardent leur K.-O. habituel.
[Parcours, règles et contrat de sauvegarde](docs/arenas-beta073.md).
Client natif, régression des anciens duels, compilation et archives vérifiés.
[Pack normal](build/Sanctuary-beta.073.mrpack) ·
[Monde plat rapide](build/Sanctuary-Test-beta.073.mrpack).
## beta.071 — personnalités et traits de monture
Chaque familier possède un caractère stable : agressif, protecteur, passif ou
@@ -2706,6 +3091,13 @@ Cette durée exclut le lancement et le rendu du client. Le détail des mesures,
de leur portée et des vérifications est dans [STARTUP-01](docs/initial-loading.md).
Livraison locale, non publiée et non installée dans Prism.
## beta.021 — préparation des cosmétiques de tête interactifs
[Début du chantier des accessoires portés](docs/head-cosmetics-beta021.md),
le 13 septembre 2026 : modèles et interactions des cosmétiques de tête.
Le correctif de chargement beta.022 intervient en parallèle ; la finalisation
et les vérifications du chantier sont documentées en **beta.023**.
## beta.020 — œufs singuliers, portage et plongeon
Les œufs portent désormais les couleurs de leur rareté et deux noms d’effets
@@ -3731,7 +4123,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
@@ -3760,7 +4152,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).
@@ -3808,13 +4200,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
+194
View File
@@ -1,5 +1,199 @@
# 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)
+9
View File
@@ -14,6 +14,8 @@ 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'
@@ -73,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.
+55
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,
+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é.
+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é.
+82
View File
@@ -0,0 +1,82 @@
# CHICKEN-02 — Déplacements des poules colorées, beta.325
Demande du 1er novembre 2026, branche `codex/chicken-flight`.
Base : `e3b4613b1028baf5515064f0ffc58b521ee6f0d6`, branche d'intégration
`codex/itsalive-26-3`, au-dessus de la livraison publique beta.324.
Seuls six fichiers documentaires diffèrent du tag publié ; le code de départ
est exactement celui de beta.324. Le canal packwiz public a été relu en beta.324.
L'ancien prototype du chat n'est pas repris.
## Résultat
Les poules émeraude, rubis, saphir et or, adultes et poussins, sont reconnues
comme des poules pour les deux mécanismes existants :
- Portées sur la tête, elles permettent de planer avec la même limite de
descente et la même protection contre les dégâts de chute. Les restrictions
habituelles du portage et du vol continuent à s'appliquer ; déposer la poule
arrête immédiatement son assistance.
- Assises directement dans un bateau, elles fournissent exactement le moteur
d'une poule classique : portance, vitesse, maniabilité, descente et calcul
de charge. Cela couvre le bateau classique et les formats collectifs.
L'embarquement existant depuis la tête reste utilisable ; Espace fait monter
le bateau, relâcher le fait descendre. Une poule restée sur une tête n'est
pas un moteur de bateau.
Les deux contrôles limités à l'identifiant `minecraft:chicken` reconnaissent
désormais les instances de la classe native `Chicken`, dont hérite déjà
`GemChickenEntity`. Le cas existant des familiers de poule reste conservé.
Les classifications des autres espèces ne changent pas.
Aucun code de création, texture, identifiant, sauvegarde, règle de reproduction,
ponte, produit ou tirage des poules rares n'est modifié. Leurs responsabilités
restent dans l'intégration courante. La préparation ne modifie aucun monde.
[Livraison pack/site/serveur vérifiée](release-beta325.md) le 1er novembre 2026 ;
l'instance Prism personnelle conserve sa mise à jour automatique au prochain lancement.
## Vérification
Sur Minecraft 26.3, Java 25, Fabric Loader 0.19.5 et Fabric API 0.160.5+26.3 :
- `check build assemblePack` réussit en **3 min 44 s**, avec **25 GameTests
serveur requis réussis** et les contrôles communs complets. Le script local
limite les tests purs à 512 Mio et le serveur à 1 Gio, sans exclure de contrôle.
- Le parcours **Vulkan / MoltenVK / Apple M1 avec Sodium** réussit en
**41 secondes**. Les huit entités synchronisées utilisent les mêmes
classifications de vol côté client ; modèles et libellés FR/EN passent aussi.
- La comparaison avec le JAR publié beta.324 (SHA-256 contrôlé) ne trouve
que **trois entrées différentes** : `CarryGlide.class`, `FlightMotors.class`
et la version dans `fabric.mod.json`. Aucun fichier ajouté ni retiré.
Les deux classes livrées sont identiques à celles du parcours client.
- L'export MRpack est vérifié : CRC ZIP, version beta.325 et un seul JAR
Sanctuary, identique au binaire construit. Artefacts locaux :
`mods/sanctuary/build/libs/sanctuary-beta.325.jar` et
`build/Sanctuary-beta.325.mrpack`.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=chickens323,poultry,corrections -PsanctuaryAtlasOnly=true \
-I build/chicken-flight325/memory.init.gradle \
-Dorg.gradle.jvmargs=-Xmx768m --max-workers=1
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryChickens323ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=chickens323 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=2 \
-PsanctuaryClientNoVsync=true -Dorg.gradle.jvmargs=-Xmx768m --max-workers=1
```
Le script ignoré ci-dessus règle seulement `maxHeapSize` des tâches JavaExec ;
la commande sans `-I` exécute les mêmes contrôles avec les heaps par défaut.
Reçu local : `build/chicken-flight325/verification.json`.
Aucun essai de réseau distant ou multijoueur prolongé n'est revendiqué.
Deux scénarios serveur supplémentaires parcourent les quatre variantes et les
deux âges : plané effectif, vitesse horizontale conservée, remise à zéro de la
chute, absence de poussée ajoutée, dépose, état de ponte préservé ; embarquement,
propulsion et charge identiques, montée/descente et retrait du dernier moteur
pour les bateaux classiques, 2×2 et 3×3. Les suites poules rares, portage et
bateaux existantes sont rejouées.
Le parcours client Vulkan avec Sodium vérifie aussi la reconnaissance des huit
entités synchronisées, en plus des modèles et libellés FR/EN déjà présents.
Les preuves locales restent ignorées dans `build/chicken-flight325/`.
+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.
@@ -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
}
+74
View File
@@ -0,0 +1,74 @@
# 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.
Livré dans le [regroupement beta.324](release-beta324.md).
## 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).
+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`.
+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
}
+83
View File
@@ -0,0 +1,83 @@
# 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/`.
[Livraison site/serveur vérifiée](release-beta324.md) le 31 octobre 2026 :
canal, CT 350 et téléchargement Web en beta.324 ; reçu committé après publication
sans déplacer le tag immuable.
+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.
+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).
+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."
}
+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
+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).
+23
View File
@@ -0,0 +1,23 @@
# Sanctuary beta.325
Minecraft 26.3 · Fabric Loader 0.19.5 · Java 25.
Les poules émeraude, rubis, saphir et or utilisent les déplacements de la poule
classique, adultes comme poussins :
- Portées sur la tête, elles permettent de planer avec la même vitesse de
descente et la même protection contre les dégâts de chute.
- Assises dans un bateau classique ou collectif, elles fournissent la même
propulsion. Espace fait monter ; relâcher fait descendre.
Les pontes, produits, chances d'éclosion et règles de stérilité sont conservés.
Toutes les intégrations de beta.324 sont reprises : cuisine It's Alive et
séchoir, aptitudes et achats existants, recherche JEI `.5`, Media 0.3.2,
Dream Displays, voix et autres dépendances client/serveur.
Validation : **25 tests serveur** et parcours **Vulkan avec Sodium** réussis.
Comparé au JAR publié beta.324, seules les deux classes de reconnaissance des
poules et les métadonnées de version diffèrent. Aucun format de sauvegarde
ou réglage de génération n'est modifié ; aucun chunk n'est régénéré.
[Contrat et vérifications](https://git.botsu.net/koka/sanctuary-beta/src/tag/beta.325/docs/chicken-flight-beta325.md).
+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
```
+20
View File
@@ -8,6 +8,21 @@ 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,
@@ -2194,6 +2209,11 @@ 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é.
+58
View File
@@ -0,0 +1,58 @@
# Beta.321 — modèles culinaires et carte adaptative
Branche : `codex/itsalive-26-3`. Préparation locale validée, puis
[publiée sur le site et le serveur Beta](release-beta321.md) à la demande du propriétaire.
## Résultat attendu
- La baratte et le séchoir portent leurs noms traduits dans l’inventaire :
**Baratte / Dairy Churn**, **Séchoir / Drying Rack**.
- La baratte forme une cuve en bois ouverte, avec fond, parois et pieds.
La collision respecte la cavité. La poignée tourne par quarts de tour ; aucun
élément du modèle n’utilise de rotation oblique.
- Les saucissons crus et secs, ordinaires et épicés, sont des pavés simples,
sans ficelles ni bouts blancs saillants. Un saucisson posé raccourcit à chaque
tranche et conserve une face de coupe. Les quatre portions, recettes,
orientations et identifiants existants sont conservés.
- La grande carte et l’aperçu Pause montrent la surface complète en extérieur.
Sous un toit ou dans une grotte, ils utilisent la coupe à la hauteur des pieds,
arrondie vers le bas. La nuit et la météo ne changent pas ce choix.
- Le feuillage, les végétaux sans collision et l’eau seule ne constituent pas
un toit. Le verre et les dalles constituent une couverture. Une dimension
à plafond permanent conserve la coupe intérieure. Une colonne non chargée
conserve provisoirement la coupe sans charger de chunk.
- Un passage extérieur/intérieur à hauteur constante actualise la carte sans
modifier son zoom ou son cadrage. Les anciens paquets restent filtrés par
le jeton de requête existant.
## Compatibilité
Aucune modification des identifiants, du format des sauvegardes, des recettes
ou de la génération. Aucun monde existant modifié et aucune régénération.
La vue de surface réutilise le relevé de surface historique ; les coupes
réutilisent les relevés exacts déjà présents depuis la beta.320.
## Vérification
- `./gradlew check build assemblePack` réussi avec le filtre
`map321,map319,map244,map,cuisine319,sausage315,driedcuisine318,drying317,drying313`
et `sanctuaryAtlasOnly=true` : **55 tests serveur réussis**, contrôles de
construction et vérification des versions, icônes et index du pack.
- Parcours client **Vulkan avec Sodium** : chaîne laitière, noms FR/EN aux
échelles 2/3/4, placement, séchage, quatre tranches réelles, sauvegarde/relecture,
modèles natifs et changement extérieur/intérieur dans Atlas et Pause.
Les faces des seize états de baratte sont aussi contrôlées sur les modèles
réellement compilés : elles restent toutes alignées sur les axes.
Le verre déclenche la coupe, les feuilles seules conservent la surface ;
zoom et cadrage restent stables. Les paquets périmés et la séparation des
dimensions restent contrôlés, avec une dimension Under strictement de test.
- Inspection des modèles générés : quatre objets saucisson, huit modèles de
portions et trois parties de baratte ; aucun élément oblique ni bout en laine.
- JAR local : `mods/sanctuary/build/libs/sanctuary-beta.321.jar`, 19 160 419 octets,
SHA-256 `c8a176f6954d3e7b5e1e736f08426f43fc7c278aaaef248cff1a45c4f8103673`.
Version intégrée vérifiée ; les nouvelles classes de test sont exclues du JAR.
Les sorties de préparation restent dans `build/presentation321/` (ignoré par
Git). Cette préparation n’avait pas publié ni déployé la version. La
[livraison ultérieure beta.321](release-beta321.md) met à jour le canal, le site
et le serveur ; l’instance personnelle suivra le canal à son prochain lancement.
+60
View File
@@ -0,0 +1,60 @@
# CLAIM-03 — Une seule commande de propriété
Ticket local du **26 octobre 2026**, branche `codex/property-command`,
préparation locale `beta.294`.
## Demande et résultat attendu
Les trois variantes de propriété encombrent les commandes proposées au joueur.
Conserver uniquement le nom anglais `/sanctuary property`, cohérent avec les
autres commandes. Retirer les alias `propriete` et `propriété`, y compris pour
les duels, afin qu'aucun enregistrement secondaire ne les réintroduise.
Commandes conservées :
- `/sanctuary property` : ouvrir la carte de propriété ;
- `/sanctuary property claim` : revendiquer le chunk courant ;
- `/sanctuary property protect` : acheter sa protection ;
- `/sanctuary property duel <id>` : consulter le duel proposé.
Ce ticket remplace uniquement les alias de commande introduits en beta.270.
Les règles de revendication, prix, protections, interfaces FR/EN et sauvegardes
restent identiques. Aucun contrat de migration n'est nécessaire.
## Critères d'acceptation
- La complétion de `/sanctuary prop` propose uniquement `property`.
- Les deux alias retirés sont absents de l'arbre serveur et sont refusés,
seuls comme avec `claim`, `protect` ou `duel`.
- La branche anglaise et ses trois sous-commandes restent accessibles sans
permission opérateur. Revendication et protection fonctionnent via le
répartiteur réel des commandes.
- Les tests de propriétés et de duels passent ; le mod et le pack portent
ensemble `beta.294`.
## Vérifications
`check build assemblePack` réussit en **4 min 4 s**, sur Minecraft 26.3,
Fabric 0.19.5 et Java 25. Les **18 GameTests serveur ciblés** passent :
propriétés historiques, claims par chunks, priorité Demeure et duels Battle.
Le contrôle de commande vérifie la complétion unique, les anciens alias refusés
et les sous-commandes conservées. Le scénario natif de minage revendique et
protège désormais son terrain via les vraies commandes `property claim` et
`property protect`, en contrôlant le propriétaire et les huit saphirs débités.
Les **63 contrôles du registre de claims**, les **26 contrôles du journal de
duels** et les autres vérifications de `check` passent également.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=property270,claims272,claims277,claims278 \
-PsanctuaryAtlasOnly=true
```
Journal ignoré : `build/property294-check-build-pack.log`.
JAR local : `mods/sanctuary/build/libs/sanctuary-beta.294.jar`.
Les packs client et serveur sont assemblés et vérifiés dans `build/packwiz`
et `build/packwiz-server`. La validation porte sur l'arbre serveur et les
commandes exécutées ; aucun essai graphique n'est revendiqué pour ce ticket.
Préparation locale uniquement ; aucune publication ni synchronisation d'une
installation de jeu ou du serveur Beta demandée pour ce ticket.
+123
View File
@@ -0,0 +1,123 @@
# CHICKEN-01 — Poules rares, beta.323
Demande du créateur du 31 octobre 2026, branche `codex/rare-chickens`.
Préparation locale ; publication, serveur Beta et instance Prism hors périmètre.
Les modifications locales antérieures du dépôt sont conservées.
Le socle de ce ticket reste le commit local `74dc1265a8247a44410ed466ca04b371b25284c1`
et ses changements existants. Le numéro 323 est choisi après vérification des
tags distants jusqu’à beta.321 et du chantier beta.322 en cours. Les travaux
des autres branches ne sont pas intégrés automatiquement : ce ticket doit
rejoindre la branche de livraison retenue avant une publication commune.
## Contrat jouable
Les poules ordinaires ont une chance sur 256 de remplacer leur ponte par
un `sanctuary:golden_egg`, comme dans la référence 26.2. Leur cadence normale
et leurs autres œufs restent natifs. L'œuf en or se lance à la main ou au
distributeur ; son impact le casse et fait toujours éclore **un seul poussin**.
L'éclosion est décidée côté serveur. Les œufs ordinaires restent inchangés.
Les pourcentages précis n'étant pas imposés dans la demande, cette première
implémentation choisit les poids **8:4:2:1**. L'éclosion est garantie comme
dans 26.2, puis la couleur est tirée selon ces poids :
| Variante | Probabilité par œuf en or | Produit unique | Intervalle de ponte |
| --- | --- | --- | --- |
| Émeraude | 8/15 ≈ 53,33 % | `minecraft:emerald` | 4 × l'intervalle normal, soit 20 à 40 min |
| Rubis | 4/15 ≈ 26,67 % | `sanctuary:ruby` | 8 ×, soit 40 à 80 min |
| Saphir | 2/15 ≈ 13,33 % | `sanctuary:sapphire` | 16 ×, soit 80 à 160 min |
| Or | 1/15 ≈ 6,67 % | `sanctuary:golden_egg` | 32 ×, soit 160 à 320 min |
Temps à 20 ticks/s, uniquement pour un adulte chargé et effectivement simulé.
Les poussins grandissent normalement et ne pondent pas. Le premier délai
adulte est lui aussi multiplié ; le délai restant est sauvegardé exactement,
sans réinitialisation ni multiplication supplémentaire au rechargement.
Un arrêt du serveur ou une poule déchargée ne produit aucun rattrapage.
Les quatre variantes ne peuvent entrer en amour, s'accoupler entre elles
ou avec une poule ordinaire, ni produire de descendant de reproduction.
Les graines permettent toujours d'attirer les poules et de nourrir les poussins.
Il n'existe aucun ajout aux listes de biomes, aucune apparition naturelle
et aucun œuf d'apparition classique pour cette entité. Les commandes opérateur
restent utilisables pour l'inspection :
```mcfunction
/give @s sanctuary:golden_egg
/summon sanctuary:gem_chicken ~ ~ ~ {GemChickenVariant:2}
```
Identifiants de variante : rubis `0`, saphir `1`, émeraude `2`, or `3`.
`sanctuary:gem_chicken` est une nouvelle entité avec sa variante synchronisée
et persistante. Aucun identifiant existant, format de monde, chunk ou mécanisme
de génération n'est modifié. Ce port n'est pas une migration des entités
`itsalive:gem_chicken` des sauvegardes 26.2.
## Provenance et limites
Référence en lecture seule : `../26.2`, commit
`26f2c2a0061619df1f146f9081d6740c560a7497`, modules `itsalive` et `anotherworld`.
Les six textures adulte/poussin émeraude, rubis et saphir, et l'icône d'œuf
en or, sont copiées sans modification. Le modèle et l'animation des poules
reprennent le rendu natif tempéré. La nouvelle poule en or utilise la texture
tempérée native, avec une teinte dorée appliquée par le moteur au rendu.
Le port remplace la reproduction historique, le tirage uniforme et les anciens
facteurs de ponte. Les gemmes viennent du registre Sanctuary déjà présent ;
aucune dépendance aux modules historiques n'est ajoutée. Les libellés de
chaque variante et de l'œuf existent en français et en anglais.
L'armure de poule envisagée dans la vision reste un futur ticket.
## Vérifications
Les **34 GameTests serveur requis réussissent** sur Minecraft 26.3 / Java 25,
dont neuf nouveaux scénarios des poules rares, plus les régressions sur les
œufs/familiers et les moteurs de bateaux. Pontes et produits réels, premier
délai et suivants, poussins, stérilité pure et mixte, sauvegarde native,
absence de spawn naturel, tirage pondéré, collision réelle de l'œuf,
lancer à la main et distributeur sont couverts.
Le premier contrôle global a été interrompu par le redémarrage de la machine.
La reprise conserve les 90 contrôles purs déjà terminés dans les journaux
`build/chickens297-check-interrupted.log` et `build/chickens297-check-resume.log` ;
seuls les tests touchés et les contrôles restants sont rejoués, avec un script
local `build/chickens323-memory.init.gradle` limitant les processus de test
à 512 Mio, ou 1 Gio pour le serveur de GameTests. Une assertion de parcours
des catégories de biome vides a été corrigée après le premier passage serveur.
Le passage final est consigné dans `build/chickens323-check.log`.
- `check build assemblePack` termine avec succès après la reprise documentée,
en **3 min 6 s** pour le passage final. Les profils packwiz client/serveur
sont assemblés et leurs index vérifiés.
- Le client graphique termine avec succès en **2 min 14 s**, sous **Vulkan /
MoltenVK 1.4.2 / Apple M1, avec Sodium** et un tas limité à 2 Gio.
Les quatre variantes synchronisées, les huit modèles adulte/poussin,
les textures, la teinte dorée et les noms FR/EN sont contrôlés. La capture
française a été inspectée pour les couleurs et les proportions ; le
client et son serveur intégré se ferment normalement.
- Les sept PNG repris sont identiques octet pour octet à 26.2. Le JAR livré
contient exactement les classes des poules exécutées par le client de test.
- L'export MRpack passe le contrôle ZIP/CRC : Minecraft 26.3, Loader 0.19.5,
version beta.323, un seul JAR Sanctuary identique à celui construit.
Les classes de GameTests sont exclues. Reçu ignoré :
`build/chickens323-artifacts.json`.
Artefacts locaux : `mods/sanctuary/build/libs/sanctuary-beta.323.jar` et
`build/Sanctuary-beta.323.mrpack`. Captures :
`build/chickens323-screenshots/`. Aucune installation de jeu personnelle ni
serveur publié n'a été modifié. Le calendrier de ponte complet de plusieurs
heures et une session multijoueur distante ne sont pas revendiqués : les
limites de temporisation et la persistance sont exercées côté serveur.
Commandes de validation :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=chickens323,eggaudit,poultry -PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryChickens323ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=chickens323 \
-PsanctuaryQuickTests=true -PsanctuaryClientGraphicsBackend=vulkan \
-PsanctuaryClientHeapGb=2 -PsanctuaryClientNoVsync=true
```
Journaux de développement ignorés : `build/chickens323-*.log`.
+80
View File
@@ -0,0 +1,80 @@
# beta.295 — livraison du serveur préenregistré
Livraison complète du **26 octobre 2026**, branche `codex/default-server`.
[Contrat PACK-03](default-server-beta295.md), [notes de version](notes-beta295.md).
Le ticket CLAIM-03 terminé est intégré depuis ses fichiers validés, sans
modifier son checkout. beta.294 reste une préparation locale non publiée.
## Versions réellement livrées
| Cible | État vérifié |
| --- | --- |
| Source et tag `beta.295` | `2734c2383a8ce8562506a9d6bd1da036084143a5` |
| Canal client/serveur | `9a3dd1bea975efc94cbdd5e9f7ef7288458063b7` |
| Release | [beta.295](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.295), quatre artefacts publics vérifiés |
| CT 350 | Service actif, quatre mods dont Sanctuary beta.295, démarrage sans erreur |
| Icône annoncée | Logo PNG 64 × 64, hash du ping public identique à la ressource du JAR |
| CT 320 | `releases/beta.295/prism`, beta.293 conservée, téléchargement direct et footer actualisés |
| Prism historique | Même instance Sanctuary Beta, huit mods et un seul JAR Sanctuary beta.295 |
Le ZIP du site reste une amorce du canal stable. Ses octets sont identiques
à ceux de beta.293 car la plateforme et les outils sont inchangés ; le premier
lancement récupère désormais le JAR beta.295 qui ajoute le serveur.
## Vérifications
- `check build assemblePack assembleServerPack` réussi en **3 min 22 s** :
contrôles purs et **18 tests serveur** `property270,claims272,claims277,claims278`.
- **15 contrôles des favoris** : conservation, sauvegarde, absence de doublon,
suppression volontaire, lecture vanilla de l’icône et corruption réparable.
- **Vulkan FR/EN**, GUI 3 en 1280 × 800 : réussi en 38 s, captures inspectées.
Hook réel de démarrage et liste multijoueur vanilla ; aucun monde ouvert.
- Deux synchronisations packwiz identiques dans une importation isolée, puis
deux dans l’instance historique. Serveur ajouté dans celle-ci avec le même
code d’initialisation, deux appels identiques, sans lancer le jeu.
- Ping public via DNS/SRV : Minecraft 26.3, 0/20, icône vérifiée depuis le LAN.
Aucun essai depuis un réseau extérieur ajouté.
- Admission : HTTP 200, code volontairement invalide refusé, aucun redeem.
Métriques Web fraîches et en marche ; même base et UUID communautaire.
## Artefacts
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.295.jar` | 18179585 | `45a4af94c56bdd25f1eeeaa5e642588e0f9b1ab3f77e934f396fee1a73898831` |
| `Sanctuary-beta.295.mrpack` | 16768587 | `ab1b71de5a70b0f097a2b89a5ed7d4ca2ca3b3453b19d404b5ebf85ff205cfd7` |
| `Sanctuary-Prism-beta.295.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.295.zip` | 4036670 | `40841bf0f0c8a16d56ef04441f0f71729348b14e6eba98ebf0865aacea843b67` |
Icône serveur SHA-256 :
`2b8966e8f2a0cfe064a1dfac4205874216373f8bb4c59e8eb712d5e7d204fce7`.
## Conservation et limites
Serveur vide avant arrêt. Sauvegarde complète privée :
`/root/sanctuary-beta-backups/before-beta295-20261026T052413Z/instance.tar.gz`,
SHA-256 `b46c036a439944f79d5f89a188064e7507bc5804ffaf8e3a6f42458319340f66`.
Les **248 fichiers protégés** et l’environnement privé sont identiques après
synchronisation, avant redémarrage. Ensuite toutes les clés/valeurs de
`server.properties` restent identiques ; Minecraft réécrit son commentaire
horodaté. Voix, réseau et monde existant gardent leurs réglages. Aucune
migration de monde ou de génération.
Prism : sauvegarde complète sous le dossier de l’instance historique,
`sanctuary-backups/before-beta295-20261026T052117Z/instance.tar.gz`,
SHA-256 `a128a1463cf598707674c84834c9b456c36d781fbf558daa4ce195713ceca8ca`.
Les **999 fichiers personnels préexistants** et `instance.cfg` sont identiques.
Seuls les fichiers gérés sont actualisés, et les nouveaux `servers.dat` et
`.sanctuary/default-server-beta` initialisent le favori. Aucun monde personnel ouvert.
Une autre instance importée, dossier `Sanctuary-Beta`, était en cours de jeu.
Elle n’a pas été modifiée pendant cette session et suivra le canal beta.295
au prochain lancement. Aucune nouvelle instance personnelle créée ici.
Web : HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8` et **73 changements préexistants** identiques.
Aucun remplacement du code live ni reconstruction de cache. ZIP et MRpack
publics HTTP 200 avec hashes exacts, ZIP reçu sous le nom `Sanctuary-Beta.zip`.
Reçus, journaux, hashes et scripts opérationnels : `build/release295/`, hors Git.
Les limites vocales antérieures restent celles de [beta.293](release-beta293.md) ;
cette livraison ne revendique pas de nouvel échange audible à deux joueurs.
+108
View File
@@ -0,0 +1,108 @@
# beta.296 — écrans partagés installés pour essai
Livraison complète du **26 octobre 2026**, branche `codex/media-beta296`.
[Contrat et gestes en jeu](media-beta296.md), [notes](notes-beta296.md).
Le socle publié beta.295 et ses ajouts sont conservés.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source et tag `beta.296` | `9674e7f3c5b755990ab546c3bfb202850ecb299e` |
| Canal client/serveur | `550a079699ae3a731b0cb39255f4c3af4efa77eb` |
| Release | [beta.296](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.296), quatre artefacts publics vérifiés |
| CT 350 | Service actif, Sanctuary beta.296 avec Media 0.3.0 embarqué et Dream Displays 1.10.4 chargé |
| CT 320 | Distribution `releases/beta.296/prism`, ancienne beta.295 conservée |
| Prism historique | Même instance Sanctuary Beta, neuf JAR, deux synchronisations identiques |
Un seul JAR Sanctuary est installé. Le module Media conserve son ID Fabric
`sanctuary_media`, ses recettes, blocs et données. Dream Displays est installé
séparément par packwiz des deux côtés. Minecraft 26.3, Fabric 0.19.5, JEI et les
autres dépendances restent aux versions précédentes.
## Vérifications
- Tâches `check` et `build` réussies : contrôles purs, **18 GameTests requis**
`property270,claims272,claims277,claims278`, contrats horloge/HLS/reprise et
géométrie Media. La première commande globale a ensuite refusé l'assemblage
sur la vérification de la borne Minecraft déclarée par Dream (`~26.3-`).
Le vérificateur épingle maintenant cette valeur exacte de l'artefact déjà
validé pour 26.3. Assemblages client/serveur réexécutés et réussis en **5 s**.
- Module Media construit par Gradle ; un seul exemplaire dans Sanctuary,
licence incluse, aucune sonde ni classe de test dans l'artefact livré.
- **14 contrôles interactifs** de l'ancre réussis avec le JAR beta.296 :
coût unique, taille libre, menus, portées, droits, murs et paquets refusés.
- Deux vrais clients **Vulkan**, Sodium et Sound Physics, utilisant le même
JAR livré et son module embarqué. Recherche et sélection via le menu natif,
puis vidéo et live HLS synthétiques ; sortie OpenAL active, sans erreur AL.
- Deux synchronisations du vrai installateur dans une instance isolée, puis
deux dans l'instance personnelle existante : neuf mods identiques au second
passage. Pas de monde personnel ouvert pour ces contrôles.
- Onze tests du vérificateur Web réussis ; ZIP/MRpack et profils comparés
aux artefacts et hashes effectivement installés sur la CT.
- Ping public DNS/SRV depuis le LAN, Minecraft 26.3, 0/20 lors du contrôle,
logo serveur vérifié. Admission : faux code refusé en HTTP 200, aucun redeem.
Métriques Web fraîches et serveur en marche, même UUID communautaire.
Laboratoire `build/media-prototype/release296/`, Apple M1 8 Gio, Java 25,
FFmpeg 8.1.2 externe. Comparaison des numéros d'images soumis au GPU après les
quinze premières secondes, méthode de MEDIA-04 :
| Source | Durée | Paires | Médiane | P95 | Maximum |
| --- | ---: | ---: | ---: | ---: | ---: |
| Vidéo, menu natif | 28,8 s | 55 | 1,7 ms | 25,7 ms | 31,7 ms |
| Live HLS daté | 64,0 s | 196 | 10,7 ms | 28,0 ms | 70 ms |
Les couvertures utilisables, chargement inclus, sont 90,5/91,4 % pour la vidéo,
88,3/88,7 % pour le live. Aucun scanout de moniteur ni enregistrement audible.
Les essais de reconnexion et de pause froide restent détaillés dans
[MEDIA-04](media-anchor-prototype.md) ; cette série vérifie leur code dans
l'artefact embarqué, sans revendiquer un nouveau parcours de reconnexion.
## Artefacts
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.296.jar` | 18295484 | `20896c6271edc1eef27a7ac0ba5c4844b70fe589b866e2fac436e233fadf8ab1` |
| `Sanctuary-beta.296.mrpack` | 16884738 | `952dcfcd23a9d2fda9b4c193398aee233d74bceefd94b1ce411d47e01250b267` |
| `Sanctuary-Prism-beta.296.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.296.zip` | 4036720 | `f31bcf2c83929028a29a51eae53b37eae2bb7fa8253dc124acad1e2ac2846af0` |
Le ZIP Prism reste identique à beta.295 : mêmes outils et plateforme, canal
stable maintenant en beta.296. Le bouton du site donne HTTP 200, nom reçu
`Sanctuary-Beta.zip` ; ZIP, MRpack et version dans le HTML public vérifiés.
## Conservation
Serveur vide avant arrêt propre. Sauvegarde complète privée :
`/root/sanctuary-beta-backups/before-beta296-20261026T154620Z/instance.tar.gz`,
SHA-256 `c2996fd33451b57e51be7d30fb6cebc6fb0a48e5fcc346d9dd94c6344e6f3d6d`.
Les **152 fichiers protégés** (hors mods/outils/caches/logs/métadonnées gérées)
sont identiques après synchronisation, avant redémarrage ; le monde contient
122 fichiers et est inclus dans cette sauvegarde. Environnement privé et
toutes les clés/valeurs de `server.properties` restent identiques après démarrage.
Aucune régénération ni migration de monde.
Prism : sauvegarde sous l'instance existante,
`sanctuary-backups/before-beta296-20261026T153934Z/instance.tar.gz`, SHA-256
`d2fe94fae8a0ed28668d3a011a82a9b1fe61208b07748c971e14939d9283db7b`.
Les **933 fichiers personnels contrôlés** et `instance.cfg` sont identiques.
Le chemin cache FFmpeg de Dream a été ajouté comme lien vers le binaire système
8.1.2 vérifié ; aucune option personnelle remplacée, aucun monde ouvert.
L'autre instance importée suit le même canal à son prochain lancement ; elle
n'a pas été réimportée ni modifiée manuellement.
Web : HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8` et **73 changements
préexistants** conservés, empreintes Git avant/après identiques. Seule la
distribution atomique est avancée ; pas de remplacement de code ou de cache.
Alpha, réseau/NAT, comptes et permissions ne sont pas modifiés.
## Limites
Fonction expérimentale disponible pour essai. Twitch/YouTube publics restent
à valider ; les résultats portent sur des fixtures locales. Le filtre
16 pixels/bloc, ANI-CLI et les disques blancs ne sont pas inclus. Les écrans
requièrent un mur complet et des dimensions entières dans le budget serveur.
Après pose de nouveaux blocs, un retour à beta.295 exige la sauvegarde associée.
Reçus, journaux et hashes : `build/release296/`, hors Git.
+107
View File
@@ -0,0 +1,107 @@
# beta.297 — correctifs des cadres installés
Livraison complète du **27 octobre 2026**, branche `codex/media-frame-fixes`.
[Comportement et validation graphique](media-frame-fixes-beta297.md),
[notes de version](notes-beta297.md). Le socle beta.296 est conservé.
## Résultat en jeu
Le menu de dimensions apparaît automatiquement à la première pose. Ensuite,
clic droit et **Maj + clic droit** ouvrent le lecteur Dream ; son bouton
**Taille / Size** permet de redimensionner. Le repère rouge est retiré.
Le cadre possède des faces latérales et suit les dimensions de l'écran ;
la vidéo ne laisse plus de liseré coloré à travers le bois en vue rasante.
Le son continue lorsque l'image est masquée. Les écrans existants conservent
leurs dimensions, source et identité, sans conversion de données.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source et tag `beta.297` | `bad2bdb0d12295a736aee64e08b9f6f5a8ae81d3` |
| Canal client/serveur | `e40b0d372af9fa43a301b842661c131f4e69f7c7` |
| Release | [beta.297](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.297), quatre artefacts publics vérifiés |
| CT 350 | Service actif, Sanctuary beta.297, Media 0.3.1 embarqué et Dream Displays 1.10.4 chargé |
| CT 320 | Distribution `releases/beta.297/prism`, ancienne beta.296 conservée |
| Prism historique | Même instance Sanctuary Beta, neuf JAR, deux synchronisations identiques |
Minecraft 26.3, Fabric 0.19.5, Java 25 et les dépendances restent inchangés.
Un seul JAR Sanctuary inclut JEI et Media ; Dream Displays reste un JAR
distinct obligatoire côté client et serveur. Le serveur comporte cinq JAR.
Le tag immuable désigne les sources de construction ; le présent reçu est
ajouté ensuite sans déplacer ce tag.
## Vérifications
- Nouvelle exécution `check build assemblePack assembleServerPack` réussie
en **2 min 57 s**, 158 tâches, **18 GameTests requis**, profil
`property270,claims272,claims277,claims278`, atlas ciblé. Contrats Media
inclus. Le JAR reconstruit a exactement le hash du JAR final testé sous Vulkan.
- Avant livraison : **17 contrôles interactifs** et deux clients **Vulkan**,
Sodium et Sound Physics, sur un écran 9 × 5. Captures finales de face,
droite, gauche, haut et arrière inspectées : aucun repère rouge ni liseré
vidéo, volume du cadre visible. Image suspendue hors ouverture, curseur
OpenAL actif, uploads repris en revenant devant. Les preuves et limites
sont dans [MEDIA-06](media-frame-fixes-beta297.md).
- Archives, plateformes, profils client/serveur et dépendances comparés à
leurs hashes. Deux synchronisations du véritable installateur dans une
instance isolée, puis deux dans l'instance personnelle : second passage
identique, aucun doublon Sanctuary, sélections facultatives conservées.
- Redémarrage CT 350 terminé (`Done`), versions Sanctuary, Media et Dream
confirmées dans le journal. Ping DNS/SRV depuis le LAN : Minecraft 26.3,
0/20 lors du contrôle, logo serveur inchangé.
- ZIP et MRpack publics : HTTP 200 et SHA-256 attendus. Le bouton du site
donne `Sanctuary-Beta.zip` ; le HTML annonce beta.297 et garde le lien direct.
- Admission : faux code refusé en HTTP 200 (`invalid`), aucun redeem.
Métriques Web fraîches, serveur en marche, même UUID communautaire
`cc6f4f5a-e58d-409a-879f-81daecf59461` côté jeu et site.
Les essais graphiques précèdent cette opération de publication et utilisent
le même binaire. Aucune nouvelle séance graphique ni mesure de synchronisation
vidéo/live n'est revendiquée pour le déploiement du 27 octobre.
## Artefacts
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.297.jar` | 18301448 | `f9bfffb0198abb8a4eae8a6d76a1ad3f1190edda7ce33f719bd47f0f4da27d9d` |
| `Sanctuary-beta.297.mrpack` | 16890964 | `89a031a85015615cfcf68c492bf1a73d32e0b10261c36f68045c985dc78d6886` |
| `Sanctuary-Prism-beta.297.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.297.zip` | 4036720 | `f31bcf2c83929028a29a51eae53b37eae2bb7fa8253dc124acad1e2ac2846af0` |
Les ZIP d'amorçage sont identiques à beta.296 : mêmes outils et plateforme,
canal stable maintenant en beta.297. Le MRpack contient le nouveau JAR.
## Conservation
Serveur vide avant arrêt propre. Sauvegarde complète privée :
`/root/sanctuary-beta-backups/before-beta297-20261027T035832Z/instance.tar.gz`,
SHA-256 `6b7fc4b5a6569e8cd3a9bab7e138a67b4344fde84a5dfdd453db9fec273ccdc5`.
Les **176 fichiers protégés** sont identiques après synchronisation et avant
redémarrage. Environnement privé et toutes les clés/valeurs de
`server.properties` sont identiques après démarrage. Aucune régénération ni
migration de monde.
Prism : sauvegarde sous la même instance,
`sanctuary-backups/before-beta297-20261027T035256Z/instance.tar.gz`, SHA-256
`0c95dfd13aa45eb26ea62b16465c87598838a19b2835b7b641d197167c92af09`.
Les **933 fichiers personnels contrôlés**, `instance.cfg` et l'installateur
habillé Sanctuary sont inchangés. Le lien FFmpeg existant est conservé.
Aucun monde personnel ouvert. L'autre instance importée suit le canal au
prochain lancement ; elle n'a pas été réimportée ni modifiée manuellement.
Web : HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8` et **73 changements
préexistants** conservés, empreintes Git avant/après identiques. Seule la
distribution atomique est avancée. Alpha, réseau/NAT, comptes et permissions
ne sont pas modifiés ; le checkout principal du chantier voisin est préservé.
## Limites
Twitch/YouTube publics et l'écoute subjective n'ont pas de nouvelle validation.
Les essais graphiques utilisent une vidéo synthétique, un mur orienté sud ;
les quatre orientations sont vérifiées numériquement. ANI-CLI, le filtre
16 pixels/bloc et les disques blancs ne sont pas inclus. Les dimensions
restent entières, dans le budget serveur, sur un mur complet.
Reçus opérationnels : `build/release297/`, hors Git. Captures graphiques
finales : `build/media-prototype/frame-fixes-02/`.
+97
View File
@@ -0,0 +1,97 @@
# beta.298 — normales de l'ancre corrigées et installées
Livraison complète du **27 octobre 2026**, branche `codex/media-anchor-model`.
[Correctif et preuve graphique](media-anchor-normals-beta298.md),
[notes de version](notes-beta298.md).
Avec les shaders Sanctuary activés, le petit cadre invisible ne laisse plus
de normales PBR sur la vidéo dans le coin inférieur gauche. Son modèle de
bloc est vidé et la collecte des matériaux ignore les modèles invisibles.
Le grand cadre, le lecteur et les interactions sont conservés. Les écrans
existants gardent leur source, leurs dimensions et leur identité ; aucun
bloc à reposer ni conversion de données.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source et tag `beta.298` | `fb8705369e3834c66d965108d609ec704b584ec2` |
| Canal client/serveur | `7fa08625a4fa89391d64b4b4fc0859611ecf0952` |
| Release | [beta.298](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.298), quatre artefacts publics vérifiés |
| CT 350 | Service actif, Sanctuary beta.298, Media 0.3.2 embarqué et Dream Displays 1.10.4 chargé |
| CT 320 | Distribution `releases/beta.298/prism`, ancienne beta.297 conservée |
| Prism historique | Même instance Sanctuary Beta, neuf JAR, deux synchronisations identiques |
Minecraft 26.3, Fabric 0.19.5, Java 25 et les dépendances restent inchangés.
Un JAR Sanctuary contient JEI et Media ; Dream est distinct et obligatoire
des deux côtés. Le serveur compte cinq JAR. Le présent reçu est ajouté après
la publication sans déplacer le tag immuable.
## Vérifications
- Exécution fraîche `check build assemblePack assembleServerPack` réussie
en **2 min 50 s**, 158 tâches, **18 GameTests requis**, profil
`property270,claims272,claims277,claims278`, atlas ciblé. Contrats Media inclus.
- JAR reconstruit strictement identique au binaire vérifié dans MEDIA-07 :
deux clients Vulkan avec PBR actif et vidéo en mouvement, zéro face
résiduelle, ancre exclue des matériaux, gros plans de face et en vue rasante.
Ces essais précèdent la publication ; aucune nouvelle séance graphique ou
mesure de synchronisation n'est revendiquée pendant ce déploiement.
- Archives, profils et hashes vérifiés. Deux passages du véritable
installateur en instance isolée, puis deux dans Prism personnel : second
passage identique, aucun doublon Sanctuary, sélections facultatives conservées.
- Démarrage CT confirmé par `Done` et versions chargées dans le journal.
Ping DNS/SRV depuis le LAN : Minecraft 26.3, 0/20 lors du contrôle, icône
serveur inchangée. Cela ne prouve pas un accès depuis un autre réseau.
- ZIP et MRpack publics en HTTP 200, hashes attendus ; nom reçu
`Sanctuary-Beta.zip`, version beta.298 et lien direct dans le HTML public.
- Faux code d'admission refusé (`invalid`, HTTP 200), aucun redeem.
Métriques Web fraîches, serveur en marche, même UUID communautaire
`cc6f4f5a-e58d-409a-879f-81daecf59461` côté jeu et site.
## Artefacts
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.298.jar` | 18301295 | `e6fdc36a212dcfcc89d31fbb29bc8eeec9d002cc9223ea6dcbfb31b7df17ec23` |
| `Sanctuary-beta.298.mrpack` | 16890840 | `29f88803b0abc88443a32830ca0b8a1e0490de1543f8164bed1ce86c26aff10e` |
| `Sanctuary-Prism-beta.298.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.298.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
Le ZIP Prism reste identique à beta.297 : mêmes outils et plateforme, canal
stable maintenant en beta.298. Le kit serveur ne change que son README pour
aligner le nom du kit courant ; ses outils sont inchangés. Cette documentation
a été assemblée par `scripts/server_pack.py` après le build complet réussi.
## Conservation
Une connexion était active avant l'arrêt de maintenance. Sauvegarde complète
privée après arrêt propre :
`/root/sanctuary-beta-backups/before-beta298-20261027T045721Z/instance.tar.gz`,
SHA-256 `1310c975169f1b33ecb3b3494dbb0a12a8f9815b45e2240d25c509c19c5dc755`.
Les **177 fichiers protégés** sont identiques après synchronisation, avant
redémarrage. Environnement privé et clés/valeurs de `server.properties`
identiques après démarrage. Aucune migration ni régénération de monde.
Prism : sauvegarde sous la même instance,
`sanctuary-backups/before-beta298-20261027T045406Z/instance.tar.gz`, SHA-256
`692b1989f5dac8c2bc28a2fb2f7842937b5e28eeefeb4e30d428169ecc175d0e`.
Les **933 fichiers personnels contrôlés**, `instance.cfg` et l'installateur
habillé Sanctuary sont inchangés. Le lien FFmpeg existant est conservé.
Aucun monde personnel ouvert. L'autre instance importée n'est pas modifiée
manuellement ; elle suivra le canal au prochain lancement.
Web : HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8` et **73 changements
préexistants** conservés, empreintes Git avant/après identiques. Distribution
basculée atomiquement ; pas de remplacement de code ou de cache. Alpha,
réseau/NAT, comptes, permissions et chantier du checkout principal préservés.
## Limites
Les limites du parcours graphique MEDIA-07 restent valables : mur orienté sud,
pas de nouvelle validation de source publique, arrêt tardif d'un client par
manque d'espace pour les journaux de la sonde. Ce n'est pas un essai d'endurance.
La sonde n'est pas distribuée. Aucun nouveau problème d'espace n'est survenu
pendant cette livraison ; environ 2,5 Gio restaient au contrôle final local.
Reçus et journaux opérationnels : `build/release298/`, hors Git.
+95
View File
@@ -0,0 +1,95 @@
# beta.315 — cuisine et agriculture publiées
Livraison complète du **29 octobre 2026**, branche `codex/itsalive-26-3`.
[Notes de version](notes-beta315.md), [export de textures](itsalive-textures-export-beta315.md).
Les incréments beta.299 à beta.315, jusque-là locaux, sont réunis : cultures,
vanille grimpante, cuisine et appareils, écrasement, séchoir et saucisson,
fromage à partager et quatre qualités de vin.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source/tag `beta.315` | `359f49792bbe401acb53da121babaca451744b9c` |
| Canal client/serveur | `a5df95c2d43a2e80d1215a1bca39528f4ce55957` |
| Release publique | [beta.315](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.315), quatre artefacts anonymes vérifiés |
| CT 350 | Service actif, Sanctuary beta.315, Media 0.3.2 et Dream Displays 1.10.4 chargés |
| CT 320 | Distribution `releases/beta.315/prism`, ancienne beta.298 conservée |
| Prism historique | Même instance Sanctuary Beta, neuf JAR, deux passages identiques |
Minecraft 26.3, Fabric Loader 0.19.5, Java 25 et les dépendances sont conservés.
Le serveur a cinq JAR, JEI et Media sont embarqués dans Sanctuary.
Ce reçu est committé après publication sans déplacer le tag immuable.
## Contrôles
- Build frais `check build assemblePack assembleServerPack`, **2 min 38 s**,
162 tâches et **187 GameTests requis** : cuisine complète, agriculture,
vanille, écrasement/super piston, progression/recettes et contrôles de
propriété/admission. Les contrats smoke du dépôt sont inclus.
- Le JAR reste strictement identique au binaire final audité beta.315,
[134 tests ciblés et contrôles de la préparation](sausage-slices-beta315.md).
Les deux parcours **Vulkan / Sodium** de cette préparation couvrent le
séchoir et les parts posées. Aucun jeu personnel n'est ouvert au déploiement.
- MRpack : huit dépendances distantes et un override Sanctuary vérifié.
ZIP Prism et kit serveur identiques à beta.298 : outils, plateforme et canal
stable inchangés ; le canal fournit maintenant le nouveau mod.
- Deux vrais passages de l'installateur en instance isolée puis deux dans
l'instance personnelle : neuf JAR, aucun doublon, second passage identique.
- CT 350 : versions chargées et `Done` dans le journal, propriétés identiques
par clés/valeurs, environnement privé et UUID communautaire conservés.
Vérification authentifiée d'un code fictif : HTTP 200, `invalid`, aucun redeem.
- Ping par DNS/SRV depuis le LAN : Minecraft 26.3, **0/20**, port public 25567,
icône inchangée. Cette preuve ne couvre pas un réseau extérieur.
- Site public : ZIP et MRpack en HTTP 200, hashes attendus, nom du ZIP reçu
`Sanctuary-Beta.zip`, bouton direct, survol et footer beta.315.
Métriques `running=true`, `fresh=true`, même UUID communautaire.
## Artefacts
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.315.jar` | 19031856 | `3767fe61832e1193367a09fa9e8c9c1df1a2f5ccf4802bc7280d2cfbe665ce78` |
| `Sanctuary-beta.315.mrpack` | 17335224 | `d1811f1e892ab41147b55280976fc8fc24bd20b867ff8b17d94217d98f72b1e1` |
| `Sanctuary-Prism-beta.315.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.315.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
## Conservation
CT : arrêt avant avance du canal ; le wrapper retourne 143 après SIGTERM et
aucun Java Minecraft ne reste actif avant la sauvegarde.
Sauvegarde privée `/root/sanctuary-beta-backups/before-beta315-20261029T085359Z/instance.tar.gz`, SHA-256
`58993afceff58adfa8b705a727ca19d5be24269065d8c23547088847daf9c77e` ; environnement privé copié à part en accès root.
**211 fichiers protégés** identiques après mise à jour,
avant redémarrage. Aucune régénération ni conversion explicite de monde.
Prism : sauvegarde `/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1/sanctuary-backups/before-beta315-20261029T085045Z/instance.tar.gz`, SHA-256
`f418c47484ecb67a8301f4ae6010b60f7c5c34980400e8fea44baf6f6b8c69a7`. **936 fichiers personnels**
contrôlés inchangés, avec `instance.cfg`, réglages, sauvegardes, captures,
packs personnels, installateur au logo et lien FFmpeg. Aucune instance créée
ou réimportée dans Prism ; l'instance isolée de vérification reste dans build.
Web : publication limitée à la distribution, sans pull/reset, déploiement de
code, migration DB ou changement de cache. HEAD observé
`eadc30e8c7b6dda50bc810584af057235e7fdba8`, **73 changements préexistants**.
Le premier relevé Git préalable a été refusé par le contrôle de propriétaire ;
le relevé final utilise une exception de confiance limitée à la commande,
sans modifier la configuration Git. Aucun fichier applicatif n'est écrit
par le script de publication. Alpha, NAT, comptes et permissions hors cible.
## Textures éditables et limites
Export dans `Downloads/ItsAlive-Textures-beta.315/`, ZIP de même nom :
**347 PNG de la refonte**, **368 images modifiables** avec les matériaux
réutilisés et **696 JSON visuels**. Les 347 PNG correspondent exactement au
JAR. Copies séparées pour les matériaux du fromage, des saucissons et du
séchoir, et un PNG propre à chaque vin de garde. Le pack éditable n'est pas
activé automatiquement. [Mode d'emploi](itsalive-textures-export-beta315.md).
Les cultures sont jouables ; leur apparition naturelle/répartition climatique
reste hors de cette livraison. Le créateur prévoit maintenant ses essais de
saucisson et de cuisine : les contrôles techniques ne valent pas validation de
ses préférences d'équilibrage ou de présentation. Les limites Media/voix et
réseau des livraisons précédentes restent inchangées.
Reçus et journaux opérationnels : `build/release315/`, hors Git.
+97
View File
@@ -0,0 +1,97 @@
# beta.318 — récoltes et recettes séchées publiées
Livraison du **30 octobre 2026**, branche `codex/itsalive-26-3`.
[Notes de version](notes-beta318.md) · [guide des récoltes](wiki/alimentation/README.md) ·
[recettes du séchoir et cuisine](wiki/alimentation/sechoir.md).
Les incréments locaux beta.316 à beta.318 sont maintenant disponibles sur le
serveur Beta et dans le téléchargement du site : récoltes par climat, seize
recettes de séchoir, dix-huit nouvelles recettes culinaires et petits coups
cosmétiques quand on mange épicé, sans dégât ni recul.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source/tag `beta.318` | `de6e11848ac391401aba01b08f6eb38df5bb6b0e` |
| Canal client/serveur | `807f69680d5d1f8ca7853d1f009898017ca16aa2` |
| Release | [beta.318](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.318), quatre artefacts anonymes vérifiés |
| CT 350 | Service actif, `Done`, Sanctuary beta.318, Media 0.3.2, cinq JAR |
| CT 320 | Distribution `releases/beta.318/prism`, précédente beta.315 conservée |
| Prism historique | Même instance Sanctuary Beta, neuf JAR et canal public rétabli |
Minecraft 26.3, Fabric Loader 0.19.5, Java 25 et les dépendances restent inchangés.
Ce reçu est committé après publication sans déplacer le tag immuable.
## Contrôles de livraison
- Build frais `check build assemblePack assembleServerPack` : **2 min 33 s**,
162 tâches et **204 tests serveur requis**. Cuisine, séchoir, récoltes,
agriculture, vanille, autres appareils, écrasement/super piston, progression,
recettes et contrôles de propriété/admission ; les smoke tests du dépôt passent.
- JAR strictement identique au binaire beta.318 installé lors des essais locaux :
`5b8d6fff72c3128ceac085a9d71b493bbda13a0dbbe42ffdd3e8dc2fda3a632b`. Le parcours **Vulkan / Sodium** de cette préparation vérifie les
fabrications, la sauvegarde, les dix-neuf modèles, JEI et deux coups sans perte
de vie par tranche. Il n'est pas présenté comme une nouvelle séance graphique
pendant le déploiement.
- Site : **7 tests / 52 assertions** passent pour le téléchargement et les
métriques, sur la base SQLite de test en mémoire. Aucun code PHP ou asset Web
n'est déployé par cette livraison.
- Deux vrais passages de l'installateur depuis le ZIP Prism dans une copie
isolée neuve, puis deux dans l'instance personnelle. Un seul Sanctuary,
mêmes neuf JAR au second passage, préférences facultatives conservées.
- CT 350 : version et Media effectivement chargés, zéro erreur au démarrage,
propriétés identiques par clés/valeurs, environnement privé et UUID communautaire
conservés. Code d'admission fictif refusé : HTTP 200, `invalid`, aucun redeem.
- Site public : ZIP/MRpack HTTP 200, hashes attendus, ZIP reçu sous
`Sanctuary-Beta.zip`, téléchargement direct et HTML beta.318.
Métriques `running=true`, `fresh=true`, même UUID ; aucun changement de base.
- Ping depuis le LAN par DNS/SRV : Minecraft 26.3, **0/20**,
port public 25567 et icône inchangée. Cela ne valide pas un accès depuis
un autre réseau ni un échange vocal entre deux joueurs.
## Artefacts immuables
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.318.jar` | 19131515 | `5b8d6fff72c3128ceac085a9d71b493bbda13a0dbbe42ffdd3e8dc2fda3a632b` |
| `Sanctuary-beta.318.mrpack` | 17394176 | `199097b346ce1b3068f274fafafc422104d0c6b77c1c14d09a75ec26460aa863` |
| `Sanctuary-Prism-beta.318.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.318.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
Les archives d'amorçage Prism et serveur restent identiques à beta.315 : le canal
fournit le nouveau mod. Le MRpack contient huit dépendances distantes et un seul
override Sanctuary, vérifié contre les profils client et serveur.
## Conservation
CT : arrêt systemd avant avance du canal. Le wrapper transmet SIGTERM et attend
Java ; son code 143 est celui déjà documenté. Aucun processus Java ne reste
avant la sauvegarde et aucun SIGKILL n'est utilisé.
Sauvegarde complète privée :
`/root/sanctuary-beta-backups/before-beta318-20261030T055616Z/instance.tar.gz`,
SHA-256 `3da2f620653d4f379e8921130d5de5d48af68ac168c35f7e7b310fb84468f49f`.
L'environnement privé est copié séparément, mode 600. **211 fichiers protégés**
sont identiques après synchronisation, avant le redémarrage. Aucun monde n'est
régénéré ou converti explicitement ; les chunks existants ne sont pas repeuplés.
Prism : sauvegarde complète
`/Users/koka/Library/Application Support/PrismLauncher/instances/Sanctuary-0.1.0-alpha.1/sanctuary-backups/before-public-beta318-20261030T060417Z/instance.tar.gz`,
SHA-256 `f13183a890ad407af515237627d4e45930962ea83f71fc23488c6e45029bc320`.
**1031 fichiers personnels** contrôlés inchangés, dont sauvegardes,
réglages, favoris, captures, packs, outils et huit autres mods. Seuls les deux
arguments de pack des `PreLaunchCommand` reviennent au canal public. Le profil
local beta.318 est conservé en archive ; aucune nouvelle instance et aucun
monde personnel ouvert. Le lien FFmpeg et l'installateur au logo sont conservés.
Web : publication limitée aux fichiers de distribution et au lien `current`.
HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8`, **73 changements préexistants** et
**423 fichiers de code/assets** restent strictement identiques. Aucun pull/reset,
changement d'application, cache, compte ou permission. L'Alpha et le réseau
restent hors cible. Journaux et reçus détaillés ignorés : `build/release318/`.
## Essais restant humains
Le serveur est prêt pour tester les plats et le ressenti des petits coups en
multijoueur. La texture des nouveaux plats réutilise les sprites recolorés ;
les réglages culinaires et l'impression de piquant restent à apprécier en jeu.
+112
View File
@@ -0,0 +1,112 @@
{
"version": "beta.320",
"date": "2026-10-30",
"source_tag": "5869f85ec36424509c3eecbc98834971321e27f6",
"channel_commit": "cb301259b9906ebea8eb8b6327de9aed0a4c304f",
"server": {
"service": "active",
"loaded_version": "beta.320",
"embedded_media": "0.3.2",
"started": true,
"server_properties_unchanged": true,
"private_env_unchanged": true,
"community_uuid_unchanged": true,
"admission_status": 200,
"admission_reason": "invalid",
"no_redeem_called": true,
"startup_error_count": 0
},
"backup": {
"backup": "/root/sanctuary-beta-backups/before-beta320-20261030T080352Z",
"backup_sha256": "7cb1e410f803ff7ea3d7a2771c43ca07e2bb0623a76dc5f05c2886f923331b71",
"backup_bytes": 246932673,
"protected_files": 213,
"java_exit_confirmed": true,
"forced_kill_used": false,
"service_before": "inactive"
},
"web": {
"current": "releases/beta.320/prism",
"head": "eadc30e8c7b6dda50bc810584af057235e7fdba8",
"status_entries": 73,
"status_hash": "4c43579292d7a800aba013921f6606ea95a8857231d5d46a2136bc2fa772c555",
"protected_source_files_unchanged": 423,
"community_uuid_unchanged": true,
"metrics": {
"days": 5,
"deaths": 5,
"online": 0,
"running": true,
"fresh": true,
"measuredAt": 1793347910051
}
},
"artifacts": {
"sanctuary-beta.320.jar": {
"bytes": 19160731,
"sha256": "09459661e40f610d61dfcb463cdba3b73e0962328eebe72c11e78b8ce6eee453"
},
"Sanctuary-beta.320.mrpack": {
"bytes": 17418164,
"sha256": "1793f0ecda78a88b50a8a4c7f8c5e1e999c1d1fd43d8144b4c34325f50e9c4c8"
},
"Sanctuary-Prism-beta.320.zip": {
"bytes": 3928525,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9"
},
"Sanctuary-Server-beta.320.zip": {
"bytes": 4036721,
"sha256": "c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43"
}
},
"public_checks": {
"/downloads/sanctuary-prism.zip": {
"status": 200,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"bytes": 3928525,
"content_disposition": "attachment; filename=Sanctuary-Beta.zip"
},
"/downloads/sanctuary-beta.mrpack": {
"status": 200,
"sha256": "1793f0ecda78a88b50a8a4c7f8c5e1e999c1d1fd43d8144b4c34325f50e9c4c8",
"bytes": 17418164,
"content_disposition": "attachment; filename=Sanctuary-Beta.mrpack"
},
"html_beta320": true,
"direct_prism_download": true,
"minecraft_ping": {
"version": "26.3",
"online": 0,
"max": 20,
"icon_sha256": "2b8966e8f2a0cfe064a1dfac4205874216373f8bb4c59e8eb712d5e7d204fce7",
"srv_target": "beta.sanctuary-minecraft.net",
"srv_port": 25567,
"origin": "LAN via public DNS/SRV"
},
"channel_commit": "cb301259b9906ebea8eb8b6327de9aed0a4c304f",
"source_tag": "5869f85ec36424509c3eecbc98834971321e27f6"
},
"isolated_installer": {
"passes": 2,
"jars": 9,
"single_sanctuary": true,
"second_pass_identical": true
},
"personal_prism": {
"public_channel_confirmed": true,
"synchronized_by_this_delivery": false,
"next_launch_updates_from_channel": true
},
"game_validation": {
"server_tests": 241,
"vulkan_sodium_combined_run": "passed before publication",
"same_jar": true
},
"scope": {
"site": true,
"server_beta_ct350": true,
"alpha_changed": false,
"web_code_changed": false,
"personal_world_opened": false
}
}
+83
View File
@@ -0,0 +1,83 @@
# beta.320 — cuisine, carte et activité saisonnière publiées
Livraison du **30 octobre 2026**, branche `codex/itsalive-26-3`.
[Notes de version](notes-beta320.md) · [laitages](wiki/alimentation/laitages.md) ·
[intégration et essais du jeu](integration-beta320.md) · [reçu structuré](release-beta320-verification.json).
Le serveur Beta et le téléchargement du site utilisent **beta.320** : cuisine
directe et chaudron Minecraft, baratte, semences naturelles dans les herbes,
carte/Pause à hauteur exacte du joueur et activité saisonnière des insectes.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source/tag `beta.320` | `5869f85ec36424509c3eecbc98834971321e27f6` |
| Canal client/serveur | `cb301259b9906ebea8eb8b6327de9aed0a4c304f` |
| Release | [beta.320](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.320), quatre artefacts anonymes vérifiés |
| CT 350 | Active, `Done`, Sanctuary beta.320, Media 0.3.2, cinq JAR, zéro erreur au démarrage |
| CT 320 | Distribution `releases/beta.320/prism`, précédente beta.318 conservée |
| Prism personnel | Canal public confirmé ; aucune synchronisation personnelle lancée par cette demande |
Minecraft 26.3, Fabric Loader 0.19.5, Java 25 et les dépendances sont conservés.
Le reçu est committé après publication sans déplacer le tag immuable.
## Vérification
- Le JAR livré est strictement celui du lot vérifié : **241 tests serveur**,
contrôles de `check build assemblePack assembleServerPack` et parcours
regroupé **Vulkan/Sodium** sur Apple M1. Ses **2 770 classes de production**
sont celles des essais. Ces preuves ne sont pas présentées comme une nouvelle
séance de tests pendant le déploiement.
- MRpack, ZIP Prism et kit serveur vérifiés avant publication : versions,
intégrité ZIP, hashes, huit dépendances distantes et override Sanctuary du
MRpack identique au JAR publié.
- Deux synchronisations réelles depuis le ZIP Prism dans une instance isolée
neuve : neuf JAR, un seul Sanctuary beta.320 et deuxième passage identique.
L’instance personnelle et ses préférences ne sont pas modifiées ; son prochain
lancement suit déjà le canal public et récupérera la mise à jour.
- CT 350 : version effectivement chargée, `Done`, zéro erreur, configuration,
environnement privé et UUID communautaire conservés. Admission fictive :
HTTP 200, `invalid`, aucun appel à `redeem` et aucun vrai code consommé.
- Site : ZIP et MRpack anonymes HTTP 200, hashes attendus ; ZIP reçu comme
`Sanctuary-Beta.zip`. Version beta.320 dans le bouton, son survol et le footer.
Métriques `running=true`, `fresh=true`, même UUID communautaire.
- Ping Minecraft par DNS/SRV depuis le LAN : 26.3, **0/20** au contrôle,
port public 25567 et icône conservés. Cela ne prouve pas un accès depuis un
autre réseau ou un échange vocal entre deux joueurs.
## Artefacts immuables
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.320.jar` | 19160731 | `09459661e40f610d61dfcb463cdba3b73e0962328eebe72c11e78b8ce6eee453` |
| `Sanctuary-beta.320.mrpack` | 17418164 | `1793f0ecda78a88b50a8a4c7f8c5e1e999c1d1fd43d8144b4c34325f50e9c4c8` |
| `Sanctuary-Prism-beta.320.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.320.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
Les ZIP d’amorçage restent identiques à beta.318 : leur canal stable fournit
le nouveau mod au lancement. Les archives n’embarquent aucune sauvegarde ou
configuration privée.
## Conservation
La Beta était **déjà arrêtée** lors de l’inspection. L’absence de Java a été
confirmée avant la sauvegarde complète :
`/root/sanctuary-beta-backups/before-beta320-20261030T080352Z/instance.tar.gz`,
SHA-256 `7cb1e410f803ff7ea3d7a2771c43ca07e2bb0623a76dc5f05c2886f923331b71`,
246932673 octets. Environnement privé copié séparément en mode 600.
**213 fichiers protégés** sont identiques après synchronisation,
avant démarrage ; aucun SIGKILL, monde réinitialisé ou chunk régénéré.
Les propriétés sont ensuite comparées par clés/valeurs après le démarrage.
La publication Web ne change que les archives, leurs métadonnées et le lien
atomique `current`. HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8`, **73 changements
préexistants** et **423 fichiers de code/assets**
strictement conservés. Aucun pull/reset, changement de cache, base, compte ou
permission. Le script de publication transféré sur `gpu` a le même hash que
le script versionné. L’Alpha et les règles réseau restent hors cible.
Journaux détaillés et contrôles isolés : `build/release320/`, hors de Git.
Les impressions de cuisine et la densité réelle des insectes restent à
apprécier pendant les essais de jeu. Aucun prototype Under n’est activé par
cette livraison.
+145
View File
@@ -0,0 +1,145 @@
{
"version": "beta.321",
"date": "2026-10-30",
"source_branch": "codex/itsalive-26-3",
"source_tag": "4e2b120bf2769da1349a82606ff22d3f670ae189",
"channel_commit": "f5012f481a093e6dbfffd0d1bf5cdbfe764cad7d",
"release_url": "https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.321",
"artifacts": {
"sanctuary-beta.321.jar": {
"bytes": 19160419,
"sha256": "c8a176f6954d3e7b5e1e736f08426f43fc7c278aaaef248cff1a45c4f8103673"
},
"Sanctuary-beta.321.mrpack": {
"bytes": 17417741,
"sha256": "f70d45fa09d112c6c28d73a8302a555e3df3af25747b5573bcef8914ba56a251"
},
"Sanctuary-Prism-beta.321.zip": {
"bytes": 3928525,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9"
},
"Sanctuary-Server-beta.321.zip": {
"bytes": 4036721,
"sha256": "c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43"
}
},
"validation": {
"check_build_assemblePack_assembleServerPack": true,
"required_server_tests": 55,
"focused_tests": "map321,map319,map244,map,cuisine319,sausage315,driedcuisine318,drying317,drying313",
"sanctuaryAtlasOnly": true,
"jar_identical_to_preparation_vulkan_sodium": true,
"new_graphical_session_during_deployment": false
},
"backup": {
"target": "beta.321",
"version_before": "beta.320",
"service_before": "active",
"backup": "/root/sanctuary-beta-backups/before-beta321-20261030T102727Z",
"backup_sha256": "8d4e71fd693250864c8660c40d9b4f6ea72b74fd762c0bbd99af386faf62ddd4",
"backup_bytes": 247055660,
"protected_files": 217,
"java_exit_confirmed": true,
"forced_kill_used": false
},
"server_update": {
"version": "beta.321",
"sanctuary_sha256": "c8a176f6954d3e7b5e1e736f08426f43fc7c278aaaef248cff1a45c4f8103673",
"server_jars": 5,
"protected_files_unchanged": 217,
"private_env_unchanged": true,
"started_since": "2026-10-30T10:31:09.995038+00:00",
"backup": "/root/sanctuary-beta-backups/before-beta321-20261030T102727Z"
},
"server_verified": {
"service": "active",
"loaded_version": "beta.321",
"embedded_media": "0.3.2",
"started": true,
"server_properties_unchanged": true,
"private_env_unchanged": true,
"community_uuid_unchanged": true,
"admission_status": 200,
"admission_reason": "invalid",
"no_redeem_called": true,
"startup_error_count": 0
},
"web_script": {
"path": "/root/sanctuary-beta-maintenance/beta321-20261030/publish_web_pack.py",
"sha256": "a1543aa5ec23454370739d9d09c80bad07a3e466843cf0d16a0838f4d5357f84"
},
"web_verified": {
"current": "releases/beta.321/prism",
"head": "eadc30e8c7b6dda50bc810584af057235e7fdba8",
"status_hash": "4c43579292d7a800aba013921f6606ea95a8857231d5d46a2136bc2fa772c555",
"status_entries": 73,
"protected_source_files_unchanged": 423,
"previous_release_retained": true,
"community_uuid_unchanged": true,
"metrics": {
"days": 5,
"deaths": 5,
"online": 0,
"running": true,
"fresh": true,
"measuredAt": 1793356493880
}
},
"public_verified": {
"/downloads/sanctuary-prism.zip": {
"status": 200,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"bytes": 3928525,
"content_disposition": "attachment; filename=Sanctuary-Beta.zip"
},
"/downloads/sanctuary-beta.mrpack": {
"status": 200,
"sha256": "f70d45fa09d112c6c28d73a8302a555e3df3af25747b5573bcef8914ba56a251",
"bytes": 17417741,
"content_disposition": "attachment; filename=Sanctuary-Beta.mrpack"
},
"html_beta321": true,
"direct_prism_download": true,
"footer_button_tooltip_beta321": true,
"minecraft_ping": {
"version": "26.3",
"online": 0,
"max": 20,
"icon_sha256": "2b8966e8f2a0cfe064a1dfac4205874216373f8bb4c59e8eb712d5e7d204fce7",
"srv_target": "beta.sanctuary-minecraft.net",
"srv_port": 25567,
"origin": "LAN via public DNS/SRV"
},
"channel_commit": "f5012f481a093e6dbfffd0d1bf5cdbfe764cad7d",
"source_tag": "4e2b120bf2769da1349a82606ff22d3f670ae189"
},
"isolated_installation": {
"version": "beta.321",
"passes": 2,
"single_sanctuary": true,
"jars": {
"bobby-5.2.16+mc26.3.jar": "9d24790d45ccc2cf45ccb20eeea3eb72b51f5e8d34b1b0d221e24b259e599398",
"dreamdisplays-fabric-26.3-1.10.4.jar": "a7b6520a007b2683685cd42b6f5983d5d14b1923d37375eb52180c31156b2966",
"entityculling-fabric-1.11.3-mc26.3.jar": "d2f80514ee3382b1fa7afda4df762df50743226e3cd320b829ee507357aeafbc",
"fabric-api-0.160.5+26.3.jar": "5096e9774d629850338fc1c73b5571b527171374b11ac231691fb93731ee0ae6",
"lithium-fabric-0.26.2+mc26.3.jar": "0be5b17ef9f6e9244cd07b24b227553a73aec0cf93158cf28099f3094c167f1b",
"sanctuary-beta.321.jar": "c8a176f6954d3e7b5e1e736f08426f43fc7c278aaaef248cff1a45c4f8103673",
"sodium-fabric-0.9.2+mc26.3.jar": "87a5bb39f7e6e41106e77f122f82fc93f9d3bc0b6ebcb746b314172a446a287a",
"sound-physics-remastered-fabric-1.5.1+26.3.jar": "a27bb5e02315b5c9dafefd2763ca1a427b8de4f66c5b500678e368f3668324ae",
"voicechat-fabric-2.6.24+26.3.jar": "97074fa1d094a22f17d5ac11282176965a45137950b66627d3813618810c3d00"
},
"second_pass_identical": true,
"personal_instance_modified": false
},
"personal_prism": {
"synchronized_by_this_request": false,
"public_channel_confirmed_read_only": true,
"updates_on_next_launch": true
},
"limits": [
"No external-network connection test",
"No audible voice test with two players",
"No personal world opened"
],
"alpha_and_network_configuration_modified": false
}
+82
View File
@@ -0,0 +1,82 @@
# beta.321 — carte adaptative et modèles culinaires publiés
Livraison du **30 octobre 2026**, branche `codex/itsalive-26-3`.
[Notes de version](notes-beta321.md) · [détails du lot](presentation-beta321.md) ·
[reçu structuré](release-beta321-verification.json).
Le serveur Beta et le téléchargement du site utilisent **beta.321** : surface
complète dehors, coupe à hauteur du joueur à l’intérieur, aperçu Pause adapté,
baratte ouverte en bois et saucissons en pavés, noms d’inventaire FR/EN corrigés.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source/tag `beta.321` | `4e2b120bf2769da1349a82606ff22d3f670ae189` |
| Canal client/serveur | `f5012f481a093e6dbfffd0d1bf5cdbfe764cad7d` |
| Release | [beta.321](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.321), quatre artefacts anonymes vérifiés |
| CT 350 | Active, `Done`, Sanctuary beta.321, Media 0.3.2, cinq JAR, zéro erreur au démarrage |
| CT 320 | Distribution `releases/beta.321/prism`, précédente beta.320 conservée |
| Prism personnel | Canal public confirmé en lecture seule ; mise à jour au prochain lancement |
Minecraft 26.3, Fabric Loader 0.19.5, Java 25 et les dépendances sont conservés.
Le reçu est committé après publication sans déplacer le tag immuable.
## Vérification
- `check build assemblePack assembleServerPack` réussi : **55 tests serveur**
du profil ciblé du lot, contrôles de construction et index vérifiés.
- JAR strictement identique à celui de la préparation **Vulkan avec Sodium** :
carte/Pause et basculement extérieur/intérieur, maintien du cadrage/zoom,
feuillage et verre, séparation des dimensions, noms FR/EN aux échelles 2/3/4,
chaîne laitière et seize états de baratte aux faces droites, quatre tranches
réelles et relecture sur disque. Ces preuves ne sont pas présentées comme une
nouvelle séance graphique pendant le déploiement.
- MRpack, ZIP Prism et kit serveur : intégrité ZIP, versions, hashes, huit
dépendances distantes et override Sanctuary identique au JAR livré.
- Deux synchronisations réelles depuis le ZIP Prism dans une instance isolée :
neuf JAR, un seul Sanctuary beta.321, deuxième passage identique. L’instance
personnelle conserve son canal et ses préférences, sans synchronisation
lancée par cette demande site/serveur.
- CT 350 : version chargée, `Done`, zéro erreur, environnement privé et UUID
communautaire conservés. Admission fictive : HTTP 200, `invalid`, sans
`redeem` et sans consommer de vrai code.
- Site : ZIP et MRpack anonymes HTTP 200 et hashes attendus ; ZIP reçu comme
`Sanctuary-Beta.zip`. Bouton, survol et footer beta.321. Métriques
`running=true`, `fresh=true`, même UUID communautaire.
- Ping Minecraft DNS/SRV depuis le LAN : 26.3, 0/20,
port 25567 et icône conservés. Cela ne prouve pas un accès depuis un autre
réseau ou un échange vocal audible entre deux joueurs.
## Artefacts immuables
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.321.jar` | 19160419 | `c8a176f6954d3e7b5e1e736f08426f43fc7c278aaaef248cff1a45c4f8103673` |
| `Sanctuary-beta.321.mrpack` | 17417741 | `f70d45fa09d112c6c28d73a8302a555e3df3af25747b5573bcef8914ba56a251` |
| `Sanctuary-Prism-beta.321.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.321.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
Les ZIP d’amorçage restent identiques à beta.320 ; leur canal stable fournit
le nouveau mod au lancement. Aucune sauvegarde ni configuration privée embarquée.
## Conservation
Arrêt propre de la Beta active et fin de Java confirmés avant la sauvegarde :
`/root/sanctuary-beta-backups/before-beta321-20261030T102727Z/instance.tar.gz`,
247055660 octets, SHA-256
`8d4e71fd693250864c8660c40d9b4f6ea72b74fd762c0bbd99af386faf62ddd4`. Environnement privé copié séparément en mode 600.
**217 fichiers protégés** identiques après synchronisation avant démarrage ;
propriétés comparées par clés/valeurs et environnement/UUID conservés après.
Aucun SIGKILL, monde réinitialisé ou chunk régénéré.
La publication Web ne modifie que les archives, leurs métadonnées et le lien
atomique `current`. HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8`, **73 changements
préexistants** et **423 fichiers source/assets** conservés. Script de publication
transféré avec son hash vérifié, simulation réussie avant bascule. Aucun
pull/reset, changement de cache, base, compte ou permission. Alpha et règles
réseau restent hors cible.
Les sorties opérationnelles sont dans `build/release321/`, hors de Git.
Les essais de jeu du propriétaire restent à effectuer sur la carte et les
nouveaux modèles. Aucun prototype Under n’est activé.
+211
View File
@@ -0,0 +1,211 @@
{
"date": "2026-10-31",
"version": "beta.324",
"source_branch": "codex/itsalive-26-3",
"source_commit": "ea1d84160d1ff1ad07289d03f6de2233efc9de9f",
"channel_commit": "d71cc7ff65fa2b5b3070d3ffb9786783ab9ca5b5",
"release_url": "https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.324",
"artifacts": {
"sanctuary-beta.324.jar": {
"bytes": 19179410,
"sha256": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72"
},
"Sanctuary-beta.324.mrpack": {
"bytes": 17432690,
"sha256": "d9ef01491a8ec010c12ad27e4754f376bf6f7a2a88654da17b8596a78e6e89cc"
},
"Sanctuary-Prism-beta.324.zip": {
"bytes": 3928525,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9"
},
"Sanctuary-Server-beta.324.zip": {
"bytes": 4036721,
"sha256": "c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43"
}
},
"build_verification": "integration-beta324-verification.json",
"backup": {
"target": "beta.324",
"version_before": "beta.321",
"service_before": "active",
"backup": "/root/sanctuary-beta-backups/before-beta324-20261031T123117Z",
"backup_sha256": "3cc8672e072603cdf96590cfac202aa1d44a69709aaca15dce4d1956735c60f1",
"backup_bytes": 247109295,
"protected_files": 219,
"java_exit_confirmed": true,
"forced_kill_used": false
},
"server_update": {
"version": "beta.324",
"sanctuary_sha256": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72",
"server_jars": 5,
"protected_files_unchanged": 219,
"private_env_unchanged": true,
"started_since": "2026-10-31T12:32:55.470981+00:00",
"backup": "/root/sanctuary-beta-backups/before-beta324-20261031T123117Z"
},
"server": {
"service": "active",
"loaded_version": "beta.324",
"embedded_media": "0.3.2",
"embedded_jei": "30.32.0-sanctuary.5",
"aptitude_config_transitions": {
"progression.json": {
"schema_before": 5,
"schema_after": 6,
"changed_keys": [
"atlasCost",
"namesCost",
"schema",
"sortingCost",
"swimmingCost"
],
"other_fields_preserved": true
},
"companion-powers.json": {
"schema_before": 1,
"schema_after": 2,
"changed_keys": [
"activeCost",
"schema"
],
"other_fields_preserved": true
}
},
"started": true,
"server_properties_unchanged": true,
"private_env_unchanged": true,
"community_uuid_unchanged": true,
"admission_status": 200,
"admission_reason": "invalid",
"no_redeem_called": true,
"startup_error_count": 0
},
"web": {
"current": "releases/beta.324/prism",
"head": "eadc30e8c7b6dda50bc810584af057235e7fdba8",
"status_hash": "4c43579292d7a800aba013921f6606ea95a8857231d5d46a2136bc2fa772c555",
"status_entries": 73,
"protected_source_files_unchanged": 423,
"previous_release_retained": true,
"community_uuid_unchanged": true,
"metrics": {
"days": 6,
"deaths": 5,
"online": 0,
"running": true,
"fresh": true,
"measuredAt": 1793450075907
}
},
"web_publisher": {
"path": "/root/sanctuary-beta-maintenance/beta324-20261031/publish_web_pack.py",
"sha256": "a1543aa5ec23454370739d9d09c80bad07a3e466843cf0d16a0838f4d5357f84"
},
"web_dry_run": {
"verified": {
"version": "beta.324",
"minecraft": "26.3",
"fabric": "0.19.5",
"mrpack_sha256": "d9ef01491a8ec010c12ad27e4754f376bf6f7a2a88654da17b8596a78e6e89cc",
"mrpack_size": 17432690,
"sanctuary_sha256": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72",
"prism_size": 3928525,
"prism_sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"packwiz_url": "https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml",
"source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.324/Sanctuary-beta.324.mrpack",
"prism_source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.324/Sanctuary-Prism-beta.324.zip"
},
"web_ct": 320,
"server_ct": 350
},
"web_publication": {
"published": {
"version": "beta.324",
"minecraft": "26.3",
"fabric": "0.19.5",
"mrpack_sha256": "d9ef01491a8ec010c12ad27e4754f376bf6f7a2a88654da17b8596a78e6e89cc",
"mrpack_size": 17432690,
"sanctuary_sha256": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72",
"prism_size": 3928525,
"prism_sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"packwiz_url": "https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml",
"source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.324/Sanctuary-beta.324.mrpack",
"prism_source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.324/Sanctuary-Prism-beta.324.zip"
},
"previous": "releases/beta.321/prism",
"current": "/var/www/sanctuary/storage/app/distribution/current"
},
"public": {
"/downloads/sanctuary-prism.zip": {
"status": 200,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"bytes": 3928525,
"content_disposition": "attachment; filename=Sanctuary-Beta.zip"
},
"/downloads/sanctuary-beta.mrpack": {
"status": 200,
"sha256": "d9ef01491a8ec010c12ad27e4754f376bf6f7a2a88654da17b8596a78e6e89cc",
"bytes": 17432690,
"content_disposition": "attachment; filename=Sanctuary-Beta.mrpack"
},
"html_beta324": true,
"direct_prism_download": true,
"footer_button_tooltip_beta324": true,
"minecraft_ping": {
"version": "26.3",
"online": 0,
"max": 20,
"icon_sha256": "2b8966e8f2a0cfe064a1dfac4205874216373f8bb4c59e8eb712d5e7d204fce7",
"srv_target": "beta.sanctuary-minecraft.net",
"srv_port": 25567,
"origin": "LAN via public DNS/SRV"
},
"channel_commit": "d71cc7ff65fa2b5b3070d3ffb9786783ab9ca5b5",
"source_tag": "ea1d84160d1ff1ad07289d03f6de2233efc9de9f"
},
"isolated_installs": {
"version": "beta.324",
"passes": 2,
"single_sanctuary": true,
"jars": {
"bobby-5.2.16+mc26.3.jar": "9d24790d45ccc2cf45ccb20eeea3eb72b51f5e8d34b1b0d221e24b259e599398",
"dreamdisplays-fabric-26.3-1.10.4.jar": "a7b6520a007b2683685cd42b6f5983d5d14b1923d37375eb52180c31156b2966",
"entityculling-fabric-1.11.3-mc26.3.jar": "d2f80514ee3382b1fa7afda4df762df50743226e3cd320b829ee507357aeafbc",
"fabric-api-0.160.5+26.3.jar": "5096e9774d629850338fc1c73b5571b527171374b11ac231691fb93731ee0ae6",
"lithium-fabric-0.26.2+mc26.3.jar": "0be5b17ef9f6e9244cd07b24b227553a73aec0cf93158cf28099f3094c167f1b",
"sanctuary-beta.324.jar": "2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72",
"sodium-fabric-0.9.2+mc26.3.jar": "87a5bb39f7e6e41106e77f122f82fc93f9d3bc0b6ebcb746b314172a446a287a",
"sound-physics-remastered-fabric-1.5.1+26.3.jar": "a27bb5e02315b5c9dafefd2763ca1a427b8de4f66c5b500678e368f3668324ae",
"voicechat-fabric-2.6.24+26.3.jar": "97074fa1d094a22f17d5ac11282176965a45137950b66627d3813618810c3d00"
},
"second_pass_identical": true,
"personal_instance_modified": false
},
"personal_prism": {
"checked_prelaunch_commands": [
{
"file": "instance.cfg",
"public_channel": true,
"branded_installer_pinned": true
},
{
"file": "instance.cfg",
"public_channel": true,
"branded_installer_pinned": true
}
],
"instance_modified": false,
"mods_synchronized": false,
"updates_on_next_launch": true
},
"limits": [
"Ping depuis le LAN via DNS/SRV public ; accès depuis un autre réseau et audio vocal à deux joueurs non testés.",
"Instance Prism personnelle non synchronisée manuellement ; pré-lancement public vérifié, mise à jour au prochain lancement.",
"Ressenti et équilibre en jeu restent à tester par le propriétaire."
],
"no_world_regeneration": true,
"no_alpha_or_network_changes": true,
"runtime_config_rollback_requires_compatible_backup": true,
"private_secrets_included": false
}
+90
View File
@@ -0,0 +1,90 @@
# beta.324 — poules, aptitudes, recherche JEI et séchoir publiés
Livraison du **31 octobre 2026**, branche `codex/itsalive-26-3`.
[Notes de version](notes-beta324.md) · [regroupement validé](integration-beta324.md) ·
[reçu structuré](release-beta324-verification.json).
Le serveur Beta, le canal client/serveur et le téléchargement du site utilisent
**beta.324** : poules colorées rares, nouveaux tarifs des treize aptitudes,
recherche JEI corrigée, séchoir limité à deux aliments agrandis et redressés,
fabrications du séchoir sans fil et du moulin sans tailleur de pierre.
## Cibles vérifiées
| Cible | État |
| --- | --- |
| Source/tag `beta.324` | `ea1d84160d1ff1ad07289d03f6de2233efc9de9f` |
| Canal client/serveur | `d71cc7ff65fa2b5b3070d3ffb9786783ab9ca5b5` |
| Release | [beta.324](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.324), quatre artefacts anonymes vérifiés |
| CT 350 | Active, `Done`, Sanctuary beta.324, JEI .5, Media 0.3.2, cinq JAR, zéro erreur au démarrage |
| CT 320 | `releases/beta.324/prism`, précédente beta.321 conservée |
| Prism personnel | Deux pré-lancements publics vérifiés en lecture seule ; mise à jour au prochain lancement |
Minecraft 26.3, Fabric Loader 0.19.5, Java 25 et les dépendances sont conservés.
Le reçu est committé après publication sans déplacer le tag immuable.
## Vérification du binaire et de la livraison
- `check build assemblePack assembleServerPack` réussi, **221 tests serveur**
requis du profil ciblé et contrôles purs. Aucun contrôle exclu par le script
de limitation mémoire ; profil complet enregistré dans le reçu d’intégration.
- Parcours commun frais **Vulkan / Apple M1 avec Sodium** réussi : poules
adultes/poussins et noms FR/EN ; treize aptitudes, Catalogue refusé à 29 puis
prélevé à 30 et XP synchronisée en pause ; saisie et filtrage JEI FR/EN,
accents/Unicode, édition/focus et chat ; séchoir à deux aliments, refus du
troisième, immersion, relecture, récupération et consommation.
- JAR identique aux copies packwiz client/serveur et à l’override MRpack.
Un seul JEI embarqué `30.32.0-sanctuary.5`, aucun module de test distribué.
Les sept textures historiques de poules/œuf restent identiques aux sources.
- Deux synchronisations réelles depuis le ZIP Prism dans un dossier isolé :
neuf JAR, un seul Sanctuary beta.324, second passage identique. Aucune
modification ni ouverture de monde de l’instance personnelle.
- Serveur : version effectivement chargée, `Done`, zéro erreur, environnement
privé, propriétés et UUID communautaire conservés. Admission fictive :
HTTP 200 / `invalid`, sans `redeem` ni consommation d’un vrai code.
- Site : ZIP et MRpack anonymes HTTP 200 et hashes exacts ; ZIP reçu comme
`Sanctuary-Beta.zip`. Téléchargement direct, survol et footer beta.324.
Métriques `running=true`, `fresh=true`, même UUID communautaire.
- Ping Minecraft depuis le LAN via DNS/SRV public : 26.3, 0/20, port 25567,
icône conservée. Accès depuis un autre réseau et voix audible à deux joueurs
non testés. Les essais de jeu du propriétaire restent à effectuer.
## Artefacts immuables
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.324.jar` | 19179410 | `2fcfc84579660b494602fb35cb36cb1b6ba6d8964f664dbefde2abee7e1b1a72` |
| `Sanctuary-beta.324.mrpack` | 17432690 | `d9ef01491a8ec010c12ad27e4754f376bf6f7a2a88654da17b8596a78e6e89cc` |
| `Sanctuary-Prism-beta.324.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.324.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
Les ZIP d’amorçage restent identiques à beta.321 ; le canal stable fournit le
nouveau mod au lancement. Aucune sauvegarde ou configuration privée embarquée.
## Conservation et transition des aptitudes
Arrêt propre et fin de Java confirmés avant sauvegarde, sans SIGKILL :
`/root/sanctuary-beta-backups/before-beta324-20261031T123117Z/instance.tar.gz`, 247109295 octets, SHA-256
`3cc8672e072603cdf96590cfac202aa1d44a69709aaca15dce4d1956735c60f1`. Environnement privé copié séparément, mode 600.
**219 fichiers protégés** identiques après synchronisation avant démarrage.
Aucun monde réinitialisé ni chunk régénéré.
Après démarrage, les deux transitions de configuration prévues ont été
comparées au contenu de la sauvegarde : `progression.json` **5 → 6**, anciens
prix par défaut 4 remplacés pour Noms/Carte/Rangement/Nage ;
`companion-powers.json` **1 → 2**, Lien actif 4 → 20. Tous les autres champs
restent identiques. Les anciens reçus d’achat à quatre niveaux restent valides,
sans supplément ni rachat ; les tests historiques vérifient cette conservation.
Un retour à beta.321 exige la sauvegarde compatible : ne pas lancer son ancien
binaire sur les nouveaux schémas ou reçus.
La publication Web ne modifie que les archives, métadonnées et lien `current`.
HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8`, **73 changements préexistants**
et **423 fichiers source/assets** conservés. Script versionné transféré avec
son hash vérifié, simulation réussie avant bascule. Aucun pull/reset global,
changement de cache, base, compte ou permission. Alpha et réseau hors cible.
Les trois dossiers sources restent intacts. Les préparations isolées beta.297,
beta.322 et beta.323 ne remplacent aucune ancienne release ; leur regroupement
est publié uniquement en beta.324. Aucun prototype Under activé.
Sorties opérationnelles dans `build/release324/`, hors de Git.
+205
View File
@@ -0,0 +1,205 @@
{
"date": "2026-11-01",
"version": "beta.325",
"source_branch": "codex/chicken-flight",
"source_commit": "aabc867a5cb95b4bf7e61d65d4700d8cb2c03e3d",
"channel_commit": "0a6effc6c35bd58d872467a6c4c0c6864616c852",
"release_url": "https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.325",
"artifacts": {
"sanctuary-beta.325.jar": {
"bytes": 19179464,
"sha256": "50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5"
},
"Sanctuary-beta.325.mrpack": {
"bytes": 17432735,
"sha256": "a52f5f6f14d7590f726323b12a24c812d75bc33d2e01b390e8febc225d132da3"
},
"Sanctuary-Prism-beta.325.zip": {
"bytes": 3928525,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9"
},
"Sanctuary-Server-beta.325.zip": {
"bytes": 4036721,
"sha256": "c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43"
}
},
"build_verification": {
"server_tests_passed": 25,
"client_vulkan_sodium_passed": true,
"jar_matches_tested_classes": true,
"binary_diff_from_published_beta324": [
"fabric.mod.json",
"fr/koka/sanctuary/boats/FlightMotors.class",
"fr/koka/sanctuary/cosmetics/CarryGlide.class"
]
},
"backup": {
"version_before": "beta.324",
"service_before": "active",
"service_after": "stopped (wrapper 143)",
"backup": "/root/sanctuary-beta-backups/before-beta325-20261101T214559Z",
"backup_sha256": "5bcb64423cc76a13925195eb65a54ccc388c20f4813462c0cf54cefd73af301a",
"backup_bytes": 248929074,
"protected_files": 46,
"world_files": 171,
"java_exit_confirmed": true,
"forced_kill_used": false,
"channel_before": "d71cc7ff65fa2b5b3070d3ffb9786783ab9ca5b5"
},
"server_update": {
"version": "beta.325",
"sanctuary_sha256": "50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5",
"server_jars": 5,
"protected_files_unchanged": 46,
"world_files_identical_before_start": 171,
"private_env_unchanged": true,
"existing_dependencies_unchanged": true,
"started_since": "2026-11-01T21:47:59.511503+00:00",
"backup": "/root/sanctuary-beta-backups/before-beta325-20261101T214559Z"
},
"server": {
"service": "active",
"loaded_version": "beta.325",
"started": true,
"startup_error_count": 0,
"runtime_netty_disconnect_errors": 1,
"baseline_netty_disconnect_errors": 29,
"unexpected_runtime_errors": 0,
"nested": {
"META-INF/jars/jei-sanctuary-26.3-30.32.0-sanctuary.5.jar": "30.32.0-sanctuary.5",
"META-INF/jars/sanctuary-media-0.3.2.jar": "0.3.2"
},
"protected_configuration_unchanged": true,
"server_properties_values_unchanged": true,
"server_properties_comment_only_changed": true,
"private_env_unchanged": true,
"community_uuid_unchanged": true,
"admission_status": 200,
"admission_reason": "invalid",
"no_redeem_called": true
},
"web": {
"current": "releases/beta.325/prism",
"head": "eadc30e8c7b6dda50bc810584af057235e7fdba8",
"status_sha256": "4c43579292d7a800aba013921f6606ea95a8857231d5d46a2136bc2fa772c555",
"status_entries": 73,
"protected_source_files_unchanged": 413,
"private_env_unchanged": true,
"previous_release_retained": true,
"community_uuid_unchanged": true,
"metrics": {
"days": 7,
"deaths": 5,
"online": 0,
"running": true,
"fresh": true,
"measuredAt": 1793569990716
}
},
"web_publisher": {
"path": "/root/sanctuary-beta-maintenance/beta325/publish_web_pack.py",
"sha256": "a1543aa5ec23454370739d9d09c80bad07a3e466843cf0d16a0838f4d5357f84"
},
"web_dry_run": {
"verified": {
"version": "beta.325",
"minecraft": "26.3",
"fabric": "0.19.5",
"mrpack_sha256": "a52f5f6f14d7590f726323b12a24c812d75bc33d2e01b390e8febc225d132da3",
"mrpack_size": 17432735,
"sanctuary_sha256": "50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5",
"prism_size": 3928525,
"prism_sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"packwiz_url": "https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml",
"source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.325/Sanctuary-beta.325.mrpack",
"prism_source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.325/Sanctuary-Prism-beta.325.zip"
},
"web_ct": 320,
"server_ct": 350
},
"web_publication": {
"published": {
"version": "beta.325",
"minecraft": "26.3",
"fabric": "0.19.5",
"mrpack_sha256": "a52f5f6f14d7590f726323b12a24c812d75bc33d2e01b390e8febc225d132da3",
"mrpack_size": 17432735,
"sanctuary_sha256": "50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5",
"prism_size": 3928525,
"prism_sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"packwiz_url": "https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml",
"source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.325/Sanctuary-beta.325.mrpack",
"prism_source_url": "https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.325/Sanctuary-Prism-beta.325.zip"
},
"previous": "releases/beta.324/prism",
"current": "/var/www/sanctuary/storage/app/distribution/current"
},
"public": {
"/downloads/sanctuary-prism.zip": {
"status": 200,
"bytes": 3928525,
"sha256": "95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9",
"content_disposition": "attachment; filename=Sanctuary-Beta.zip"
},
"/downloads/sanctuary-beta.mrpack": {
"status": 200,
"bytes": 17432735,
"sha256": "a52f5f6f14d7590f726323b12a24c812d75bc33d2e01b390e8febc225d132da3",
"content_disposition": "attachment; filename=Sanctuary-Beta.mrpack"
},
"html_beta325": true,
"direct_prism_download": true,
"footer_beta325": true,
"version_attributes": [
{
"tag": "a",
"attribute": "title",
"value": "Sanctuary Beta · beta.325 · Prism"
}
],
"minecraft_ping": {
"version": "26.3",
"online": 0,
"max": 20,
"icon_sha256": "2b8966e8f2a0cfe064a1dfac4205874216373f8bb4c59e8eb712d5e7d204fce7",
"srv_target": "beta.sanctuary-minecraft.net",
"srv_port": 25567,
"origin": "LAN via public DNS/SRV"
},
"channel_commit": "0a6effc6c35bd58d872467a6c4c0c6864616c852",
"source_tag": "aabc867a5cb95b4bf7e61d65d4700d8cb2c03e3d"
},
"isolated_installs": {
"version": "beta.325",
"passes": 2,
"jars": {
"bobby-5.2.16+mc26.3.jar": "9d24790d45ccc2cf45ccb20eeea3eb72b51f5e8d34b1b0d221e24b259e599398",
"dreamdisplays-fabric-26.3-1.10.4.jar": "a7b6520a007b2683685cd42b6f5983d5d14b1923d37375eb52180c31156b2966",
"entityculling-fabric-1.11.3-mc26.3.jar": "d2f80514ee3382b1fa7afda4df762df50743226e3cd320b829ee507357aeafbc",
"fabric-api-0.160.5+26.3.jar": "5096e9774d629850338fc1c73b5571b527171374b11ac231691fb93731ee0ae6",
"lithium-fabric-0.26.2+mc26.3.jar": "0be5b17ef9f6e9244cd07b24b227553a73aec0cf93158cf28099f3094c167f1b",
"sanctuary-beta.325.jar": "50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5",
"sodium-fabric-0.9.2+mc26.3.jar": "87a5bb39f7e6e41106e77f122f82fc93f9d3bc0b6ebcb746b314172a446a287a",
"sound-physics-remastered-fabric-1.5.1+26.3.jar": "a27bb5e02315b5c9dafefd2763ca1a427b8de4f66c5b500678e368f3668324ae",
"voicechat-fabric-2.6.24+26.3.jar": "97074fa1d094a22f17d5ac11282176965a45137950b66627d3813618810c3d00"
},
"second_pass_identical": true,
"witnesses_preserved": 4,
"personal_instance_modified": false
},
"personal_prism": {
"public_channel": true,
"branded_installer_pinned": true,
"instance_modified": false,
"mods_synchronized": false,
"updates_on_next_launch": true
},
"limits": [
"Ping depuis le LAN via le DNS/SRV public ; réseau extérieur et voix audible à deux joueurs non testés.",
"Instance Prism personnelle non synchronisée manuellement ; commande publique vérifiée, mise à jour au prochain lancement.",
"Un message Netty de déconnexion apparaît après le démarrage ; sa signature était déjà présente dans le journal beta.324. Aucune erreur pendant le démarrage."
],
"no_world_regeneration": true,
"no_alpha_or_network_changes": true,
"private_secrets_included": false
}
+103
View File
@@ -0,0 +1,103 @@
# beta.325 — plané et bateaux des poules colorées publiés
Livraison demandée et vérifiée le **1er novembre 2026**. Les quatre poules rares,
adultes et poussins, utilisent les déplacements de la poule classique.
[Contrat et tests](chicken-flight-beta325.md) · [Notes de version](notes-beta325.md).
## État livré
| Cible | Vérification |
| --- | --- |
| Source/tag `beta.325` | `aabc867a5cb95b4bf7e61d65d4700d8cb2c03e3d` |
| Branche source | `codex/chicken-flight`, au-dessus des intégrations beta.324 |
| Canal client/serveur | `0a6effc6c35bd58d872467a6c4c0c6864616c852`, version beta.325 |
| Release | [beta.325](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.325), quatre artefacts anonymes vérifiés |
| Beta CT 350 | Active, `Done`, Sanctuary beta.325, cinq JAR et aucune erreur au démarrage |
| Site CT 320 | `releases/beta.325/prism`, publication beta.324 conservée |
| Prism existant | Canal public et installateur au logo vérifiés en lecture seule ; mise à jour au prochain lancement |
Le tag immuable garde le commit source ci-dessus. Ce reçu est committé après
publication ; il ne déplace pas le tag.
## Intégrations et validation conservées
- Les **25 tests serveur**, `check build assemblePack` et le parcours
**Vulkan avec Sodium** ont réussi sur ce binaire pendant la préparation.
Pas de nouvelle passe graphique au déploiement ; les classes du JAR livré
sont identiques à celles du parcours vérifié.
- Le JAR ne diffère de celui publié en beta.324 que par `CarryGlide.class`,
`FlightMotors.class` et la version de `fabric.mod.json`. Aucun fichier
interne ajouté ou retiré. Cuisine It's Alive, séchoir, aptitudes et achats,
recherche JEI `.5`, Media 0.3.2 et toutes les ressources sont conservés.
- Les huit dépendances client et quatre dépendances serveur sont identiques
à beta.324. Dream Displays, voix, Sodium, Sound Physics, Bobby, Lithium
et Entity Culling gardent leurs versions et leurs hashes.
- ZIP Prism et kit serveur identiques à beta.324 ; leurs canaux stables
apportent le nouveau mod. L'installateur habillé reste conservé par
`--bootstrap-no-update`.
- Deux vrais passages packwiz isolés réussissent : neuf JAR, un seul Sanctuary,
deuxième passage identique ; quatre témoins de réglages, favoris et
sauvegarde conservés. Aucun jeu ou monde personnel ouvert.
## Artefacts immuables
| Artefact | Octets | SHA-256 |
| --- | ---: | --- |
| `sanctuary-beta.325.jar` | 19179464 | `50b6f6cddf3fb434063066347aeec77bb22fd1d6e628a6507c6a472cc61826b5` |
| `Sanctuary-beta.325.mrpack` | 17432735 | `a52f5f6f14d7590f726323b12a24c812d75bc33d2e01b390e8febc225d132da3` |
| `Sanctuary-Prism-beta.325.zip` | 3928525 | `95c57f5e70627a2847d1cc2033c8d9f50f44ef4a302ca892bc727e0c37ece0a9` |
| `Sanctuary-Server-beta.325.zip` | 4036721 | `c33ac4c08bb8b99598c71d44e1e5047f0810c4938f68d9d393507b950e865d43` |
## Serveur et sauvegarde
La Beta est arrêtée avant l'avancement du canal. Le lanceur sort avec le
statut 143 déjà documenté ; l'absence de Java est confirmée, sans SIGKILL.
Sauvegarde complète privée avant mise à jour :
`/root/sanctuary-beta-backups/before-beta325-20261101T214559Z/instance.tar.gz`
248929074 octets, SHA-256
`5bcb64423cc76a13925195eb65a54ccc388c20f4813462c0cf54cefd73af301a`. Archive et environnement privé en mode 600,
dans un dossier root privé. Le monde et l'instance existants sont conservés.
Les **46 fichiers de configuration/outillage protégés** et les
**171 fichiers du monde** sont identiques avant/après l'installation,
avant redémarrage. L'environnement privé est identique. Après démarrage,
les valeurs de `server.properties` sont inchangées ; seul son commentaire
d'horodatage est réécrit. UUID communautaire conservé.
Le service charge beta.325, JEI `30.32.0-sanctuary.5` et Media 0.3.2.
Démarrage `Done`, zéro erreur pendant le démarrage. Vérification d'admission
avec un faux code : HTTP 200, `valid=false`, `reason=invalid`, aucun appel
`redeem`. Le ping répond en Minecraft 26.3, 0/20 au contrôle, port et icône
conservés. Ni Alpha ni réseau ne sont modifiés.
Après le démarrage, un message Netty `Error sending packet ... disconnect`
est observé ; cette signature était déjà présente 29 fois dans le journal
sauvegardé de beta.324. Ce constat n'est pas présenté comme une erreur du
correctif ni comme un correctif réseau livré.
## Site et contrôles publics
Le script versionné `publish_web_pack.py`, copié sur `gpu` et contrôlé par
SHA-256, passe d'abord en `--dry-run`, puis publie atomiquement les archives.
Il vérifie le JAR et les dépendances de la CT, les profils client/serveur,
le MRpack et le ZIP Prism avant de basculer le lien `current`.
Le checkout Web garde le HEAD `eadc30e8c7b6dda50bc810584af057235e7fdba8`, les **73
changements Git préexistants**, les **413 fichiers source suivis ou non ignorés
contrôlés** et son environnement privé. Aucun code Web, cache, compte,
permission ou schéma de base n'est remplacé.
Téléchargements anonymes HTTP 200, noms `Sanctuary-Beta.zip` et
`Sanctuary-Beta.mrpack`, hashes exacts. Bouton direct, survol et footer en
beta.325. Métriques `running=true`, `fresh=true`, même UUID communautaire.
Prism personnel reste sur le canal public ; aucune synchronisation manuelle
ni réimportation d'instance n'a été effectuée pour cette demande.
Limites : ping depuis le LAN via le DNS/SRV public ; accès depuis un autre
réseau et échange vocal audible à deux joueurs non testés.
[Reçu structuré](release-beta325-verification.json). Les journaux et scripts
opérationnels ignorés dans `build/release325/` sont historiques et ne doivent
pas être rejoués sans revalidation de leurs versions et chemins.
@@ -0,0 +1,77 @@
{
"version": "beta.315",
"jar": "mods/sanctuary/build/libs/sanctuary-beta.315.jar",
"sha256": "3767fe61832e1193367a09fa9e8c9c1df1a2f5ccf4802bc7280d2cfbe665ce78",
"previous_verified_sha256": "82a2a6d8d4e2ad9d0aab754037995609722bbebac28db89a6e641c851ccb3ceb",
"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/KitchenAppliances.class",
"fr/koka/sanctuary/cuisine/KitchenClient$1.class",
"fr/koka/sanctuary/cuisine/KitchenClient.class",
"resourcepacks/template/THIRD_PARTY_NOTICES.md"
],
"added_jar_entries": [
"assets/sanctuary/blockstates/cured_sausage.json",
"assets/sanctuary/models/block/cured_sausage.json",
"assets/sanctuary/models/block/cured_sausage_slice_1.json",
"assets/sanctuary/models/block/cured_sausage_slice_2.json",
"assets/sanctuary/models/block/cured_sausage_slice_3.json",
"data/sanctuary/loot_table/blocks/cured_sausage.json",
"fr/koka/sanctuary/cuisine/culinary/block/CuredSausageBlock.class"
],
"removed_jar_entries": [],
"generated_json": {
"cuisine": 432,
"kitchen": 234,
"agriculture": 376
},
"additive_sausage_json": 6,
"culinary_source_classes": 53,
"culinary_compiled_classes_verified": 73,
"sausage_slices": 4,
"food_per_slice": 2,
"total_food": 8,
"saturation_modifier": 1.2,
"horizontal_orientations": 4,
"block_states": 16,
"existing_drying_recipe_and_raw_cured_item_models_unchanged": true,
"old_pngs_unchanged": 1108,
"new_pngs": 0,
"server_required": 134,
"sausage_scenarios": 8,
"client_vulkan": {
"log": "build/sausage315-client.log",
"screenshots": "build/sausage315-screenshots",
"screenshot_count": 12,
"world_seed": 315,
"sodium": "0.9.2+mc26.3",
"native_paid_rack_insertion_and_collection": true,
"native_crosshair_key_placement_and_eating": true,
"actual_disk_orientation_and_partial_sausage_reopen": true,
"four_native_eating_sounds": true,
"fixture_advances_only_drying_progress": true
},
"drying_regression_vulkan": {
"log": "build/sausage315-drying-regression.log",
"native_four_preparations_and_hooks": true,
"actual_bucket_and_disk": true,
"placed_slice_tasting": 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/cured_sausage.json",
"assets/sanctuary/models/block/cured_sausage.json",
"assets/sanctuary/models/block/cured_sausage_slice_1.json",
"assets/sanctuary/models/block/cured_sausage_slice_2.json",
"assets/sanctuary/models/block/cured_sausage_slice_3.json"
],
"build_log": "build/sausage315-build.log"
}
+111
View File
@@ -0,0 +1,111 @@
# IA-10 — saucisson posé à partager — beta.315 locale
Demande du 29 octobre 2026 : poser le saucisson séché puis en manger des tranches,
comme le fromage. Même branche `codex/itsalive-26-3`, sans publication ni
installation. Premier réglage : quatre tranches de deux points de nourriture,
pour conserver les huit points du saucisson entier de beta.313.
## Contrat de continuité avant modification
L'objet `sanctuary:cured_sausage`, sa recette et son modèle restent stables.
Il devient le BlockItem du nouveau bloc du même identifiant. Comme le fromage,
il se mange désormais après la pose plutôt qu'entier dans la main. Les objets
existants deviennent posables sans conversion. Le cru, les quatre crochets,
les cinq minutes et les règles d'humidité du séchoir restent inchangés.
Le bloc n'a pas de block entity. Son état natif conserve `bites=0..3` et les
quatre orientations horizontales `facing`. Ces données additives se sauvegardent
par les mécanismes standard des blocs. Le modèle et la forme raccourcissent à
chaque tranche. Aucune migration de chunk, génération ou monde personnel n'est
nécessaire ou exécutée. Comme le gâteau et le fromage, casser le saucisson ou
lui enlever son support ne rend pas un saucisson entier ; les tranches mangées
ne peuvent pas être reconstituées gratuitement. Avant un retour à beta.314,
manger les saucissons posés ; les objets non posés gardent leur identifiant.
## Geste et apparence
Poser sur un bloc solide consomme un saucisson séché. Clic droit pour manger
une tranche si le joueur a faim ; la quatrième enlève le bloc. Aucun couteau,
menu, combustible ou nouvel objet « tranche » n'est ajouté. Chaque tranche
conserve le modificateur de saturation de 1,2 ; la faim totale reste de huit.
Un comparateur lit 8/6/4/2 selon les tranches restantes.
Les nouvelles géométries cubiques reprennent les références du modèle d'objet :
terre cuite rouge, laine blanche et bloc de champignon rouge pour la coupe.
La ficelle du bout coupé disparaît à la première tranche ; la ficelle et les
bandes encore présentes restent à leur vraie position sur le morceau restant.
Les modèles d'objet cru/séché et leurs rendus sur le séchoir restent intacts.
Aucun PNG ou son n'est ajouté. Les sons natifs de mastication sont référencés.
## Vérifications
Huit cas serveur natifs vérifient le paiement de la pose, les quatre vraies
prises de tranches et leurs huit points de nourriture, la faim pleine,
les bougies, les seize états de forme et de comparateur, la rotation et le
miroir, le codec standard de sauvegarde d'un saucisson entamé et orienté,
la casse de chacun des quatre états, la perte de support et la pose refusée
sans consommation. Le dernier cas exécute **6 000 ticks complets** du séchoir
sur une vraie préparation, puis pose le résultat payé du même identifiant.
Le parcours **Vulkan / Apple M1 / Sodium 0.9.2+mc26.3** utilise un monde plat
jetable de graine **315**, une préparation crue fournie en fixture et de vraies
touches d'utilisation pour l'accrocher, récupérer le résultat, poser le
saucisson puis manger ses quatre tranches. Le viseur doit réellement toucher
la forme du bloc avant chaque action. Le serveur confirme le paiement de
chaque étape et les deux points de nourriture de chaque tranche.
Les seize modèles sont chargés : huit cuboïdes pour l'entier, cinq pour chaque
portion raccourcie, références de textures natives valides et tous les sommets
à l'intérieur de la forme orientée correspondante. L'objet reste dans l'onglet
Nourriture et boissons et son modèle historique reste valide. FR/EN et GUI
2/3/4 sont contrôlés. Une fermeture/réouverture réelle conserve le bloc avec
**deux tranches déjà mangées** et la même orientation ; les deux autres se
mangent sur ce même morceau. Les quatre sons natifs de mastication sont captés.
Douze images sont conservées dans `build/sausage315-screenshots/` (ignoré).
Ce parcours graphique rapproche seulement la progression du séchage à dix
ticks de sa fin pour ne pas attendre cinq minutes ; les derniers ticks et
toutes les interactions restent natifs. Les cas serveur exécutent la durée
complète. Le parcours graphique a réussi en **1 min 14 s**. Le contrôle
historique beta.313 est adapté pour goûter le résultat après sa pose, et son
assertion d'objet comestible devient celle d'un BlockItem à partager.
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=sausage315,cheesewine314,drying313,cauldron312,cauldron311,pan310,oven308,mill306,kitchen304,cuisine303,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuarySausage315ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=sausage315 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Le parcours historique complet du séchoir est également rejoué sous Vulkan
avec Sodium et réussit en **1 min 16 s** : fabrication payée des quatre
préparations, quatre crochets, retrait/raccrochage, seau d'eau, sauvegarde et
vidage au seau, quatre saucissons récupérés puis pose et dégustation d'une
tranche du même résultat. Sa table de dégustation est surélevée pour rester
au sec après l'essai d'écoulement. Les miroirs de structure vérifient aussi
la réflexion réelle de la forme restante sur X et Z pour les seize états,
et pas seulement la conservation du nombre de tranches.
`check build assemblePack` a réussi en **3 min 19 s**, avec **134 tests serveur
obligatoires**, dont les assertions de réflexion de coupe. L'audit strict à
beta.314 vérifie le nouveau bloc, ses six JSON ajoutés et les modifications
prévues de registre, libellés et crédits. Les **1 108 PNG** et tous les anciens
JSON de recettes/modèles sont inchangés. Les générateurs sont comparés au JAR :
432 JSON de cuisine, 234 d'appareils et 376 d'agriculture. Les 53 sources et
73 classes compilées culinaires sont vérifiées. Les assemblages client/serveur
embarquent exactement le même JAR et le modèle de pack de ressources reprend
les cinq nouveaux JSON visuels. Aucun fichier d'objet ou de modèle de séchoir
historique n'a changé.
[Reçu d'audit](sausage-slices-beta315-verification.json).
JAR local : `mods/sanctuary/build/libs/sanctuary-beta.315.jar`.
SHA-256 :
`3767fe61832e1193367a09fa9e8c9c1df1a2f5ccf4802bc7280d2cfbe665ce78`
Aucun push, tag, publication, canal packwiz public, installation Prism ou
serveur personnel n'a été modifié.
+7 -2
View File
@@ -8,7 +8,7 @@ Plateforme épinglée : Minecraft **26.3**, Fabric Loader **0.19.5**, Fabric API
## Préparer le kit
Dans les sources : `./gradlew check build assemblePack assembleServerPack`.
Le kit de la livraison courante est `build/Sanctuary-Server-beta.293.zip` ; les manifestes locaux sont
Le kit de la livraison courante est `build/Sanctuary-Server-beta.298.zip` ; les manifestes locaux sont
dans `build/packwiz-server/`. Le ZIP est un amorçage : il télécharge les mods
depuis le canal au premier démarrage, il n'est pas une copie hors ligne du pack.
Il n'est utilisable sur le canal public qu'après publication de cette version.
@@ -56,6 +56,10 @@ avant de rendre le verrou de mise à jour.
L'API d'accueil et la communauté sont deux services existants distincts.
Le pack ne contient ni secret ni configuration de production.
Depuis beta.295, le profil serveur gère aussi `server-icon.png`, le logo du
pack en 64 × 64. La synchronisation le pose à la racine ; Minecraft l'annonce
aux clients au démarrage suivant. Le favori client est ajouté séparément au
premier lancement, sans indexer le fichier personnel `servers.dat`.
Pour l'accès/candidature, fournir dans l'environnement du service Minecraft :
@@ -87,7 +91,8 @@ Le kit n'effectue aucune migration SQL ni modification de sauvegarde.
Arrêter le service, sauvegarder, lancer `./server.sh update`, vérifier les logs,
puis redémarrer le même dossier serveur. `packwiz.json` doit rester présent.
Depuis la préparation beta.292, le pack serveur possède Fabric API, Sanctuary,
Lithium et Simple Voice Chat. Bobby et Entity Culling restent uniquement
Lithium, Simple Voice Chat et, depuis beta.296, Dream Displays 1.10.4.
Le module Sanctuary Media est embarqué dans le même JAR Sanctuary. Bobby et Entity Culling restent uniquement
clients. [Versions, validation et port UDP vocal](optional-mods-beta292.md).
Il ne gère ni monde,
`server.properties`, `eula.txt`, `config/`, listes de joueurs, permissions,
+35
View File
@@ -43,6 +43,8 @@ changement de Minecraft/Fabric ou de format de sauvegarde n'est implicite.
```sh
./gradlew check build assemblePack assembleServerPack
# Remplacer beta.xxx par la version choisie ; exporter depuis le dossier assemblé.
(cd build/packwiz && packwiz modrinth export -o ../Sanctuary-beta.xxx.mrpack)
python3.14 scripts/pack.py prism https://git.botsu.net/koka/sanctuary-beta/raw/branch/packwiz/pack.toml
```
@@ -69,6 +71,12 @@ les mods. [Contrat et maintien de l'outil](packwiz-logo-beta291.md). L'option
`--bootstrap-no-update` conserve cet installateur vérifié ; elle ne désactive
pas les mises à jour du pack. Ne pas ajouter de réglages ou sauvegardes personnels.
Depuis beta.295, le JAR client initialise une seule fois le favori Sanctuary,
pour les nouvelles installations comme pour les instances déjà reliées au
canal. `servers.dat` reste personnel et hors index. Le profil serveur distribue
en revanche `server-icon.png` (logo 64 × 64) ; vérifier son hash et l'icône
annoncée par le ping après redémarrage. [Contrat](default-server-beta295.md).
## Publier les artefacts et le canal
Committer et pousser la branche source vérifiée, puis exécuter depuis cette
@@ -234,6 +242,27 @@ gérés au second passage, mêmes données personnelles avant/après. Conserver
`saves/`, captures, favoris, réglages, packs graphiques et configurations tierces.
Ne pas ouvrir un monde personnel pour prouver une simple synchronisation.
### Essai local explicitement demandé sans publication
Pour ce périmètre, ne pas publier le canal et ne pas remplacer seulement le JAR
alors que le pré-lancement suit une ancienne version publique. La beta.318 a
validé un profil packwiz autonome copié dans l’instance existante sous
`sanctuary-local-packs/beta.318/`. L’installateur v0.5.14 accepte un chemin local
pour le pack ; le JAR Sanctuary est une entrée directe de cet index local.
Les huit métadonnées des dépendances et leurs choix restent inchangés.
Après les essais isolés et la sauvegarde, remplacer seulement l’argument du
pack dans les deux `PreLaunchCommand` par le chemin cité
`"$INST_DIR/sanctuary-local-packs/beta.318/pack.toml"`. Garder le bootstrap au logo,
`--bootstrap-no-update` et tous les autres réglages. Vérifier deux passages réels,
l’unicité du JAR et les hashes personnels ; ne pas lancer un monde personnel.
Le profil doit être hors du worktree pour rester disponible aux lancements suivants.
Le pré-lancement demeure sur ce profil pendant l’essai. Le rétablissement de la
commande publique est une étape explicite d’une future livraison compatible,
après lecture de la configuration courante et de sa sauvegarde. Ne pas réutiliser
les scripts ponctuels d’une ancienne intervention. [Reçu beta.318](local-beta318.md).
## Reprise et reçu de livraison
Pour un échec, conserver l'état/les logs, revenir au dernier artefact immuable
@@ -243,6 +272,12 @@ rebascule son lien `current` vers une publication complète conservée ; elle ne
change pas à elle seule le serveur ou le canal. Ne pas démarrer un ancien JAR
sur des données migrées sans vérifier le contrat de sauvegarde.
Depuis beta.324, les tarifs d’aptitudes font évoluer `progression.json` de
schéma 5 à 6 et `companion-powers.json` de 1 à 2, et de nouveaux reçus peuvent
contenir les nouveaux prix. Un retour à beta.321 doit restaurer la sauvegarde
compatible complète avec les configurations et reçus, jamais le JAR seul.
[Contrat](aptitude-prices-beta297.md) et [livraison vérifiée](release-beta324.md).
Consigner pour chaque livraison : commit source, version/tag, commit du canal,
hashes et URL des artefacts, CT/service et version chargée, publication Web,
version locale effectivement synchronisée, sauvegardes, vérifications et limites.
+57
View File
@@ -0,0 +1,57 @@
# IA-03 — Vanille en 16 × 16, beta.302 locale
Correction du 28 octobre 2026 sur `codex/itsalive-26-3`, après le retour du
créateur sur les textures 32 × 32 de beta.301. Les quatre stades de vanille
doivent être des **PNG de 16 × 16 pixels réels**, comme les textures vanilla.
Le dessin est simplifié pour cette grille : jeune tige, feuillage, fleurs,
puis gousses vertes. Feuilles et gousses restent dans un même sprite sur le
plan unique contre le tronc. Les fichiers conservent leurs identifiants
`sanctuary:block/vanilla_climbing_stage0` à `3` ; la pousse ascendante, la
récolte, les supports et les onglets créatifs de beta.301 sont conservés.
L'[atlas de production et le prompt](../ressources-pack/sources/vanilla-beta301/README.md)
documentent le travail avec l'outil intégré imagegen. L'atlas contient quatre
cellules 16 × 16 ; les PNG de jeu sont extraits de ces cellules. L'ancien
atlas conceptuel reste une référence historique. Les 343 PNG du reçu beta.299
ne sont pas modifiés. Aucune génération, migration ou installation modifiée.
Le parcours client vérifie désormais la taille **16 × 16 de chaque sprite
effectivement chargé dans l'atlas Minecraft**, pour tous les modèles de
vanille, en plus du plan unique, de la culture en survie et du rechargement.
Le parcours **Vulkan avec Sodium 0.9.2** passe en **1 min 16 s** : les
64 états sont contrôlés, avec les quatre sprites chargés en 16 × 16 et un
plan recto verso par face. Après fermeture et réouverture du monde de test,
les 24 segments conservent exactement leurs faces et leur maturité.
Commandes de vérification :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=vanilla301,agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryVanilla301ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=vanilla301 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
`check build assemblePack` passe en **3 min 18 s**, avec **46 tests serveur
requis** réussis. Le JAR, ses copies packwiz client/serveur et le template
contiennent les quatre nouveaux PNG 16 × 16 identiques aux sources. Les
**13 PNG de vanille présents dans le mod** sont tous contrôlés en 16 × 16.
Les 376 JSON agricoles et les notices sont vérifiés dans les archives ; les
343 PNG historiques restent identiques, dont les 38 images fournies.
SHA-256 de `sanctuary-beta.302.jar` :
```text
5959fa5e2fab808c55e011fc578171bc8cadca9d89d7170795051fc19fa01c0c
```
Journaux et reçu dans `build/vanilla302-*`, captures `vanilla302-16px-*`
dans le dossier de test client ignoré. Minecraft 26.3, graine de test 301,
Vulkan exclusivement.
Même branche en local, aucun push, tag, publication, serveur ou Prism mis à jour.
+146
View File
@@ -0,0 +1,146 @@
# IA-03 — Vanille grimpante, beta.301 locale
**Suite en beta.302 :** [les quatre textures sont reprises en 16 × 16](vanilla-16px-beta302.md).
Le reçu ci-dessous conserve la préparation initiale beta.301 en 32 × 32.
Préparation du **28 octobre 2026**, même branche `codex/itsalive-26-3`, sur
le port agricole beta.300 (`ed11cd77`). Minecraft 26.3, Java 25 et les
dépendances sont inchangés. Aucun push, tag, publication, serveur ou Prism
mis à jour ; seuls les mondes de développement neufs servent aux essais.
## Plante attachée aux arbres
La bouture se pose **contre une face latérale d'une bûche**, à n'importe
quelle hauteur, sans exiger de terre au pied. Les supports par défaut sont
les bûches et bois des arbres de l'Overworld, y compris les variantes
écorcées : tag `sanctuary:vanilla_supports`, qui reprend
`#minecraft:logs_that_burn`. La pierre, le feuillage, le sol sous le plant
et les tiges du Nether ne sont pas des supports. La plantation sous l'eau
est refusée sans consommer de bouture.
Chaque segment peut porter plusieurs faces attachées, à la manière des
lianes. Poser une autre bouture ajoute une face disposant de sa propre bûche
sans réinitialiser l'âge du segment. Aucun plafond ou segment flottant ne
sert d'appui. La plante n'a pas de collision centrale et le tag vanilla
`minecraft:climbable` permet l'escalade native.
Le rendu reste **plaqué dans le premier seizième de bloc contre l'écorce**.
À la demande du créateur, feuilles, fleurs et gousses sont réunies dans
**une seule texture sur un seul plan**, sans couches décalées. Quatre nouveaux
sprites RGBA de 32 × 32 pixels suivent la maturité : jeune plant, feuillage,
fleurs, gousses vertes. Ils prennent la liane Minecraft comme référence de
structure et de style. Leurs couleurs sont intégrées, sans teinte de biome.
Aucun modèle en croix, cadre ou colonne au centre de la cellule.
L'[atlas source et les prompts](../ressources-pack/sources/vanilla-beta301/README.md)
sont conservés ; les quatre anciens PNG de vanille restent intacts.
## Croissance et récolte
Les quatre âges sont **0 à 3**. Sous une lumière d'au moins 9, les ticks
aléatoires font mûrir le segment. À maturité, la croissance crée uniquement
un **nouveau segment au-dessus**, âge 0, sur les faces qui trouvent encore
une bûche à cette hauteur. Il n'y a ni propagation vers le bas ni propagation
latérale automatique.
La pousse s'arrête à la fin du tronc, devant un bloc, une autre plante, de
l'eau ou à la limite de hauteur du monde. Elle ne remplace que l'air.
La règle native `minecraft:spread_vines` contrôle l'extension naturelle ;
la maturation reste possible lorsqu'elle est désactivée.
La poudre d'os ajoute un âge, puis fait pousser le segment supérieur lorsque
celui-ci est possible. Une tentative d'extension bloquée ne consomme rien.
Cette action volontaire reste disponible lorsque la propagation naturelle
des lianes est désactivée.
Un clic droit à maturité donne **une à trois gousses vertes**, conserve les
faces et remet le segment à l'âge 1. Même une interaction obsolète ne peut
récompenser deux fois la même récolte. Une bouture en main sert à ajouter
une face ; la poudre d'os garde son usage de croissance. La perte d'une
bûche retire seulement les faces qu'elle portait. Si plus aucune face n'a
d'appui, le bloc disparaît et rend **une bouture par segment**, indépendamment
du nombre de faces. Les autres segments soutenus par leur propre tronc restent.
Le fumoir transforme une gousse verte en une gousse de vanille préparée,
comme dans le catalogue historique. Aucun nouvel appareil culinaire n'est
introduit. Le séchoir/saucisson et les autres machines restent
dans leurs tickets respectifs.
## Objets et sauvegardes
- `sanctuary:vanilla_cutting` : bouture, dans **Naturel**, avec aide FR/EN.
- `sanctuary:green_vanilla_pod` et `sanctuary:vanilla_pod` : ingrédients dans
**Nourriture et boissons**.
- `sanctuary:vanilla_vine` : bloc, états `north`, `east`, `south`, `west` et `age`.
Le catalogue agricole contient désormais **48 objets** distincts, sans
nouvel onglet créatif. La vanille n'était pas enregistrée en beta.300 : ces
identifiants et états sont additifs, sans conversion de données existantes.
Les états sont sauvegardés par Minecraft ; aucune donnée persistante annexe.
Le modèle prend en charge les rotations et miroirs des structures natives.
Les 343 PNG du reçu beta.299 restent inchangés ; les quatre nouveaux sprites
`vanilla_climbing_stage0` à `3` s'y ajoutent. Aucune génération de biome,
apparition naturelle, expansion, réécriture de chunk ou migration du monde
26.2 n'est ajoutée. L'obtention des premières boutures en survie naturelle
reste à traiter avec le peuplement agricole.
```mcfunction
/give @s sanctuary:vanilla_cutting 16
```
## Implémentation et vérification
`VanillaVineBlock` reprend le cycle de maturité et de récolte de l'historique
26.2, avec un nouvel attachement à plusieurs faces et une croissance strictement
ascendante. Les modèles multipart, le butin, la recette et les tags sont
produits par `generateAgricultureResources` pour les formats exacts 26.3.
La session ciblée passe **13 tests serveur**, dont **12 scénarios vanille**.
Ils couvrent la pose sur les quatre côtés,
les refus de plantation, plusieurs faces et leur conservation, poudre d'os,
obstacles, appuis en hauteur, ticks naturels et règle des lianes, récolte
unique, perte du support, formes fines, escalade native, NBT, rotations,
miroirs et recette au fumoir.
Le parcours **Vulkan avec Sodium** vérifie la pose réelle en survie,
la consommation de bouture et de poudre d'os, la pousse ascendante et
la récolte par les interactions client/serveur natives. Les 64 états de modèle
sont compilés et contrôlés, dont 60 avec au moins une face ; leurs sommets
restent contre le tronc, avec un seul plan recto verso par face et le nouveau
sprite correspondant à l'âge. Les onglets créatifs et noms FR/EN sont vérifiés.
Le monde est fermé puis rouvert pour comparer les faces et la maturité des
segments réellement cultivés.
**Validation finale avec les nouvelles textures :** `check build assemblePack`
passe en **2 min 43 s**, avec **46 tests serveur requis** réussis : vanille,
agriculture beta.300, recettes, progression et connaissances alimentaires.
Le parcours Vulkan avec Sodium 0.9.2 passe en **50 s**, avec les 64 états,
un seul plan par face et **24 segments identiques après rechargement réel**.
Les captures finales montrent la galerie de troncs et un gros plan des gousses.
Le JAR et les copies packwiz client/serveur sont identiques. Les **376 JSON
agricoles générés**, classes agricoles compilées, quatre nouveaux sprites et
notices sont vérifiés dans l'archive ; le template contient les mêmes sprites.
Les 343 PNG historiques et les 38 sources fournies sont revérifiés octet pour
octet, y compris dans le JAR. SHA-256 de `sanctuary-beta.301.jar` :
```text
14057e91d6d0fa776ffc67543f8c9cd137e71d2c7616311053dd7db3b1a69043
```
Commandes de vérification :
```sh
./gradlew check build assemblePack \
-PsanctuaryFocusedTests=vanilla301,agriculture300,recipes,progression,foodknowledge \
-PsanctuaryAtlasOnly=true
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
-PsanctuaryVanilla301ClientTests=true -PsanctuarySodiumClientTests=true \
-PsanctuaryFocusedTests=vanilla301 -PsanctuaryQuickTests=true \
-PsanctuaryClientGraphicsBackend=vulkan -PsanctuaryClientHeapGb=4 \
-PsanctuaryClientNoVsync=true
```
Journaux et reçus ignorés dans `build/vanilla301-*`, captures et monde de test
dans `mods/sanctuary/build/run/clientGameTest/`, graine **301**. Les tests
graphiques ciblent Vulkan exclusivement.
+80
View File
@@ -0,0 +1,80 @@
# Alimentation — trouver, récolter, replanter
Catalogue **IA-09 / beta.316**, butins révisés en **beta.320**, préparation locale du 30 octobre 2026.
[Planche illustrée des neuf îles](planche.html) · [Contrat de génération](../../foraging-beta316.md).
[Produits du séchoir et 18 recettes culinaires, beta.318](sechoir.md).
[Baratte, crème et beurre, beta.320](laitages.md).
Les emplacements indiquent des **habitats**, pas des coffres garantis à des coordonnées fixes.
Une île peut contenir plusieurs biomes : regarder le sol et la végétation, pas seulement la direction.
Les plantes sauvages apparaissent uniquement à la décoration des **nouveaux chunks Sanctuary**.
Dans les zones déjà explorées, casser à la main les petites herbes/fougères du bon biome
donne parfois directement une semence (1 chance sur 8, puis choix parmi les cultures du climat).
Les tomates, raisins, légumes et herbes se récoltent sur leurs vraies plantes ; ils ne tombent plus de l’herbe.
Les grains de maïs, légumineuses et café sont eux-mêmes leurs semences naturelles ; la menthe donne une bouture.
Carottes, pommes de terre, oignons, ail et couronnes d’ananas se récupèrent sur les plantes sauvages,
ou se multiplient à partir des cultures déjà rapportées, pas dans les petites herbes.
Le blé garde ses graines vanilla. Les cisailles et Toucher de soie préservent le bloc et n'ajoutent pas de récolte.
Les grandes herbes/fougères à deux blocs ne donnent pas ces nouveaux butins : éviter un double paiement.
Pour le riz : herbes marines de jungle/mangrove (1 sur 8). Pour les boutures de vanille : lianes tropicales (1 sur 8).
Pour les arbres : feuilles de chêne/acacia des habitats chauds admissibles (1 sur 40, puis choix de la pousse).
Des chênes/acacias plantés sur place fonctionnent aussi.
Les semences des petites herbes restent renouvelables avec la végétation vanilla ; aucun chunk n'est repeuplé.
**Le climat détermine la découverte.** Une semence rapportée peut être cultivée chez soi,
sans verrou climatique supplémentaire. Le riz garde sa condition eau/boue, la vanille son support en bois.
Les cuissons, fermentations et séchages utilisent les appareils existants ; leurs recettes sont dans JEI.
Le chaudron doit être remué avec un bâton, le moulin est manuel, la cuisinière démarre avec son combustible.
## Les neuf îles
| Île | Habitat | Cultures et produits |
| --- | --- | --- |
| [Nord-Ouest](northwest.md) | Prairies et taïgas | Blé, Carotte, Pomme de terre, Betterave, Fraise, Laitue, Oignon, Ail, Chou, Menthe, Tomate, Maïs, Concombre, Poivron, Haricots secs, Basilic |
| [Nord](north.md) | Vallées boréales et clairières | Blé, Carotte, Pomme de terre, Betterave, Fraise, Laitue, Oignon, Ail, Chou, Menthe |
| [Nord-Est](northeast.md) | Marais frais et jardin pâle | Concombre, Laitue, Chou, Haricots secs, Menthe |
| [Ouest](west.md) | Oasis de l'archipel | Tomate, Maïs, Poivron, Aubergine, Raisin, Basilic, Citron, Olives |
| [Sanctuary](center.md) | Forêts, prairies et sous-bois tempérés | Blé, Carotte, Pomme de terre, Betterave, Fraise, Tomate, Maïs, Concombre, Poivron, Laitue, Oignon, Ail, Chou, Haricots secs, Basilic, Menthe |
| [Est](east.md) | Jungles autour du volcan | Ananas, Riz, Graines de soja, Piment, Cerises de café, Gousse de vanille verte |
| [Sud-Ouest](southwest.md) | Savane, prairie sèche et désert | Maïs, Raisin, Pois chiches, Piment, Coriandre, Olives |
| [Sud](south.md) | Bosquets et berges des canyons | Maïs, Raisin, Pois chiches, Piment, Coriandre, Olives |
| [Sud-Est](southeast.md) | Jungle, mangrove et bambou | Ananas, Riz, Graines de soja, Piment, Cerises de café, Gousse de vanille verte |
## Toutes les cultures et leurs semences
| Récolte | Où chercher | À replanter |
| --- | --- | --- |
| Fraise | Nord-Ouest, Nord, Sanctuary | Graines de fraise |
| Tomate | Nord-Ouest, Ouest, Sanctuary | Graines de tomate |
| Ananas | Est, Sud-Est | Couronne d'ananas |
| Maïs | Nord-Ouest, Ouest, Sanctuary, Sud-Ouest, Sud | Grains de maïs |
| Concombre | Nord-Ouest, Nord-Est, Sanctuary | Graines de concombre |
| Poivron | Nord-Ouest, Ouest, Sanctuary | Graines de poivron |
| Aubergine | Ouest | Graines d'aubergine |
| Laitue | Nord-Ouest, Nord, Nord-Est, Sanctuary | Graines de laitue |
| Oignon | Nord-Ouest, Nord, Sanctuary | Oignon |
| Ail | Nord-Ouest, Nord, Sanctuary | Ail |
| Chou | Nord-Ouest, Nord, Nord-Est, Sanctuary | Graines de chou |
| Raisin | Ouest, Sud-Ouest, Sud | Pépins de raisin |
| Riz | Est, Sud-Est | Riz |
| Graines de soja | Est, Sud-Est | Graines de soja |
| Haricots secs | Nord-Ouest, Nord-Est, Sanctuary | Haricots secs |
| Pois chiches | Sud-Ouest, Sud | Pois chiches |
| Piment | Est, Sud-Ouest, Sud, Sud-Est | Graines de piment |
| Basilic | Nord-Ouest, Ouest, Sanctuary | Graines de basilic |
| Menthe | Nord-Ouest, Nord, Nord-Est, Sanctuary | Bouture de menthe |
| Coriandre | Sud-Ouest, Sud | Graines de coriandre |
| Blé | Nord-Ouest, Nord, Sanctuary | Graines de blé |
| Carotte | Nord-Ouest, Nord, Sanctuary | Carotte |
| Pomme de terre | Nord-Ouest, Nord, Sanctuary | Pomme de terre |
| Betterave | Nord-Ouest, Nord, Sanctuary | Graines de betterave |
| Cerises de café | Est, Sud-Est | Grains de café verts |
| Gousse de vanille verte | Est, Sud-Est | Bouture de vanille |
| Citron | Ouest | Pousse de citronnier |
| Olives | Ouest, Sud-Ouest, Sud | Pousse d'olivier |
## Ingrédients vanilla et transformations
Pommes : feuilles de chêne. Baies sucrées : buissons des taïgas. Baies lumineuses : lianes des cavernes luxuriantes. Champignons : sous-bois et grottes admissibles. Canne à sucre : berges, puis sucre à l’établi. Cacao : cabosses des troncs de jungle. Miel : ruches avec une fiole, feu de camp conseillé. Œufs : poules ; lait : seau sur une vache ; viandes : élevage ou chasse ; poissons : pêche ou capture dans les eaux peuplées. Ces règles natives ne sont pas remplacées.
La farine et la levure alimentent les pâtes ; les récoltes servent aux recettes portées de la 26.2. Fromage, saucisson et vin sont des produits de préparation, pas des plantes à découvrir. Aucun nouveau thé, navet ou fruit absent du catalogue n’est annoncé comme jouable par cette répartition.
+125
View File
@@ -0,0 +1,125 @@
{
"temperate": [
"minecraft:plains",
"minecraft:sunflower_plains",
"minecraft:forest",
"minecraft:birch_forest",
"minecraft:old_growth_birch_forest",
"minecraft:flower_forest",
"minecraft:dark_forest",
"minecraft:dappled_forest",
"minecraft:cherry_grove",
"sanctuary_test:adventure_forest",
"sanctuary_test:adventure_flowers",
"sanctuary_test:adventure_autumn",
"sanctuary_test:adventure_cherry",
"sanctuary_test:adventure_jungle",
"sanctuary_test:adventure_swamp",
"sanctuary_test:adventure_grove",
"sanctuary_test:adventure_lush",
"sanctuary_test:adventure_marsh",
"sanctuary:cavern_bamboo_grove",
"sanctuary:cavern_birch_forest",
"sanctuary:cavern_clearing",
"sanctuary:cavern_dark_grove",
"sanctuary:cavern_dry_woodland",
"sanctuary:cavern_oak_forest",
"sanctuary:cavern_rocky_heath",
"sanctuary:layered_flower_meadow",
"sanctuary:layered_lower_grove",
"sanctuary:layered_meadow",
"sanctuary:layered_mossy_terraces",
"sanctuary:layered_rocky_terraces",
"sanctuary:population_bamboo_grove",
"sanctuary:population_birch_forest",
"sanctuary:population_clearing",
"sanctuary:population_dark_grove",
"sanctuary:population_dry_woodland",
"sanctuary:population_oak_forest",
"sanctuary:population_rocky_heath",
"sanctuary:rift_bamboo_grove",
"sanctuary:rift_birch_forest",
"sanctuary:rift_clearing",
"sanctuary:rift_dark_grove",
"sanctuary:rift_dry_woodland",
"sanctuary:rift_oak_forest",
"sanctuary:rift_rocky_heath",
"sanctuary:starter_forest",
"sanctuary:starter_forest_hydrology",
"sanctuary:temperate_birch_forest",
"sanctuary:temperate_dappled_forest",
"sanctuary:temperate_flower_forest",
"sanctuary:temperate_forest",
"sanctuary:temperate_plains",
"sanctuary:woodland_bamboo_grove",
"sanctuary:woodland_birch_forest",
"sanctuary:woodland_clearing",
"sanctuary:woodland_dark_grove",
"sanctuary:woodland_dry_woodland",
"sanctuary:woodland_oak_forest",
"sanctuary:woodland_rocky_heath"
],
"cool": [
"minecraft:meadow",
"minecraft:taiga",
"minecraft:old_growth_pine_taiga",
"minecraft:old_growth_spruce_taiga",
"minecraft:snowy_taiga",
"minecraft:snowy_plains",
"minecraft:grove",
"minecraft:windswept_hills",
"minecraft:windswept_gravelly_hills",
"minecraft:windswept_forest",
"sanctuary:north_meadow206",
"sanctuary:north_meadow207",
"sanctuary:north_old_growth206",
"sanctuary:north_old_growth207",
"sanctuary:north_snowy_old_growth207",
"sanctuary:north_snowy_plains206",
"sanctuary:north_snowy_plains207",
"sanctuary:north_snowy_taiga207",
"sanctuary:north_taiga206",
"sanctuary:north_taiga207"
],
"wet_cool": [
"minecraft:swamp",
"minecraft:pale_garden",
"sanctuary:diagonal_pale229",
"sanctuary:diagonal_pale230",
"sanctuary:diagonal_swamp226",
"sanctuary:diagonal_swamp229"
],
"warm_dry": [
"minecraft:savanna",
"minecraft:savanna_plateau",
"minecraft:windswept_savanna",
"minecraft:desert",
"minecraft:badlands",
"minecraft:eroded_badlands",
"minecraft:wooded_badlands",
"sanctuary:south_badlands209",
"sanctuary:south_badlands210",
"sanctuary:south_badlands211",
"sanctuary:south_badlands212",
"sanctuary:south_badlands213",
"sanctuary:south_badlands216"
],
"warm": [
"minecraft:beach",
"sanctuary:west_beach218",
"sanctuary:west_oasis218"
],
"tropical": [
"minecraft:jungle",
"minecraft:sparse_jungle",
"minecraft:bamboo_jungle",
"minecraft:mangrove_swamp",
"sanctuary:diagonal_mangrove226",
"sanctuary:east_bamboo223",
"sanctuary:east_bamboo224",
"sanctuary:east_giant_jungle223",
"sanctuary:east_giant_jungle224",
"sanctuary:east_sparse_jungle223",
"sanctuary:east_sparse_jungle224"
]
}

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