0.3.1-2-beta.1

This commit is contained in:
2026-09-21 07:47:08 +02:00
parent c806490212
commit d8e7951a04
9 changed files with 194 additions and 14 deletions

View File

@@ -1,5 +1,5 @@
# file: Cargo.toml
# version: 77
# version: 78
[workspace]
resolver = "3"
@@ -21,7 +21,7 @@ members = [
]
[workspace.package]
version = "0.3.1-0-pre.4.fix.1"
version = "0.3.1-2-beta.1"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/games"

View File

@@ -1,5 +1,5 @@
<!-- file: README.md -->
<!-- version: 48 -->
<!-- version: 49 -->
# games.sasedev
@@ -27,7 +27,7 @@ Workspace expérimental puis productif pour des jeux multiplateformes principale
Version stable de référence : `0.3.0`.
Version de développement courante : `0.3.1-0-pre.4.fix.1`.
Version de développement courante : `0.3.1-2-beta.1`.
Les deux premiers jeux sont des POC structurels : `game-reflex-poc` et `game-snake-poc`. Ils existent d'abord pour valider les frontières du workspace, le moteur, les assets et le packaging multiplateforme.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/apps/game-snake-poc-tauri/README.md -->
<!-- version: 7 -->
<!-- version: 8 -->
# game-snake-poc-tauri
@@ -38,7 +38,7 @@ Le host suspend explicitement sa boucle `requestAnimationFrame` lorsque la WebVi
Le POC reste mono-page et nenregistre volontairement aucun handler Tauri `onBackButtonPress`. La politique `EngineGame::quit_requested` de Snake est actuellement la politique moteur par défaut `Exit`, cohérente avec le Back Android/Tauri naturel. Un futur jeu retournant `Continue` devra introduire une intégration Back explicite au lieu de modifier ce POC silencieusement.
Le smoke ARM64 réel a cependant mis en évidence un abort natif pendant le teardown déclenché par Back sur le Galaxy S9+ de validation : `FORTIFY: pthread_mutex_lock called on a destroyed mutex`. Le crash arrive après le passage WebView en `visibility hidden` et avant le traitement `pagehide` du frontend. Le dépôt ne prétend donc pas corriger ce problème par un handler Back ad hoc ni par un patch du scaffold généré. Il est conservé comme limite du POC Tauri Android et doit être distingué du comportement d'un APK autonome lors de la beta.
Le premier smoke ARM64 réel a mis en évidence un abort natif pendant un teardown déclenché par Back : `FORTIFY: pthread_mutex_lock called on a destroyed mutex`. Après correction du tunnel HMR afin que HTTP et WebSocket partagent tous deux `1436`, le smoke `0-pre.4.fix.1` n'a pas reproduit cet abort : le Back a mené jusqu'au détachement de la fenêtre sans crash observé avant la fin volontaire de la commande. Le défaut reste toutefois considéré comme potentiellement intermittent tant que l'APK autonome beta n'a pas reproduit plusieurs cycles de sortie/lifecycle. Le dépôt ne le masque ni par un handler Back ad hoc ni par un patch du scaffold généré.
## Limite ergonomique connue

View File

@@ -1,5 +1,5 @@
<!-- file: crates/apps/game-snake-poc-tauri/USAGE.md -->
<!-- version: 7 -->
<!-- version: 8 -->
# Utilisation — Snake Tauri Android
@@ -101,4 +101,19 @@ Pendant `cargo tauri android dev` :
Le D-pad placé sous le Canvas est une limite ergonomique connue du POC de référence et nest pas un critère bloquant de cette gate.
Sur le Galaxy S9+ ARM64 utilisé pour la validation réelle, le chargement, WASM, Canvas, assets et touch ont fonctionné via le tunnel USB. En revanche, le Back système a provoqué pendant le teardown de l'Activity/WebView un abort natif `FORTIFY: pthread_mutex_lock called on a destroyed mutex`, après `visibility hidden` et avant `pagehide`. Ce comportement est enregistré comme limite de la pile Tauri/Wry/WebView observée et non contourné par une modification de `gen/android`. Il doit être retesté sur l'APK autonome de la beta afin de distinguer le mode `dev` d'un package embarqué.
Sur le Galaxy S9+ ARM64 utilisé pour la validation réelle, chargement, WASM, Canvas, assets et touch fonctionnent via le tunnel USB. Un premier smoke a observé un abort natif `FORTIFY: pthread_mutex_lock called on a destroyed mutex` pendant Back/teardown ; après passage de HTTP et HMR sur le même tunnel `1436`, le smoke `0-pre.4.fix.1` n'a pas reproduit l'abort et est allé jusqu'au détachement de la fenêtre. Le risque reste enregistré comme potentiellement intermittent et doit encore être retesté sur l'APK autonome beta ; il n'est pas contourné par une modification de `gen/android`.
## Packaging beta Android
À partir de `0.3.1-2-beta.1`, le packaging de validation utilise un APK Debug autonome contenant les deux ABI réellement testées par ce POC : `arm64-v8a` pour l'appareil physique et `x86_64` pour l'AVD. Le build reste possédé par Tauri ; son hook `beforeBuildCommand` construit le WASM release, génère les bindings, exécute TypeScript/Vite et copie les assets.
```bash
export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64
(cd crates/apps/game-snake-poc-tauri && \
cargo tauri android build --debug --apk --target aarch64 --target x86_64)
```
Ne pas lancer `npm run build` séparément pour cette gate. Tauri affiche le chemin de l'APK produit ; les outputs sous `gen/android/**/build/` sont générés et ignorés. Vérifier ensuite que l'APK contient les bibliothèques `arm64-v8a` et `x86_64`, puis installer ce même APK successivement sur l'AVD et l'appareil réel avec `adb install -r`.
Le package autonome ne doit dépendre ni de Vite, ni du port `1436`, ni d'un tunnel ADB. Le smoke beta revalide Canvas, assets, WASM, touch, lifecycle et plusieurs sorties Back.

View File

@@ -1,7 +1,7 @@
{
"name": "game-snake-poc-tauri",
"private": true,
"version": "0.1.0",
"version": "0.3.1-2-beta.1",
"type": "module",
"scripts": {
"wasm:dev": "cargo build -p game-snake-poc-wasm --target wasm32-unknown-unknown && wasm-bindgen ../../../../builds/sasedev-games/target/wasm32-unknown-unknown/debug/game_snake_poc_wasm.wasm --target web --out-dir ../../../../builds/sasedev-games/game-snake-poc-tauri/wasm --out-name game_snake_poc_wasm",

76
deltas/0.3.1/2-beta.1.md Normal file
View File

@@ -0,0 +1,76 @@
<!-- file: deltas/0.3.1/2-beta.1.md -->
<!-- version: 1 -->
# Delta 0.3.1-2-beta.1
## Objectif
Entrer en beta avec le POC Snake Tauri Android fonctionnel de bout en bout et exécuter la validation large ainsi que le premier packaging APK autonome, sans ajouter de fonctionnalité.
## Baseline acceptée
`0.3.1-0-pre.4.fix.1` est validée sur AVD x86_64 et appareil ARM64 réel. Les audits/check/Clippy/tests ciblés passent, HTTP et HMR partagent le tunnel `1436`, le frontend atteint `ready` et le touch est observé. L'abort natif Back vu pendant un smoke antérieur n'est pas reproduit lors de la gate `fix.1`; il reste à caractériser sur package autonome.
Aucune extraction `0-pre.5` n'est justifiée : Tauri Android reste un POC de référence et ne devient pas une voie de production.
## Changements
- passage de `workspace.package.version` à `0.3.1-2-beta.1` ;
- passage du package frontend Tauri Snake au jalon `0.3.1-2-beta.1` conformément au workflow Tauri/frontend ;
- ajout de l'historique validé `0-pre.4.fix.1` ;
- réconciliation du plan et des gates avec la validation réelle ARM64 ;
- ajout de la procédure de packaging beta APK Debug x86_64 + ARM64 ;
- maintien explicite de l'absence d'AAB à ce jalon.
Aucun gameplay, adapter WASM, bridge Tauri, lifecycle, input, asset ou scaffold Android généré n'est modifié par cette tranche.
## Validation beta attendue
Depuis la racine :
```bash
export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64
cargo fmt --all
cargo fmt --all -- --check
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates Android Web deltas history
python3 scripts/audit_distribution_layout.py
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-targets --all-features
```
Installer/actualiser les dépendances frontend, puis laisser Tauri posséder entièrement le build WASM release + bindings + TypeScript/Vite :
```bash
(cd crates/apps/game-snake-poc-tauri && npm install)
(cd crates/apps/game-snake-poc-tauri && \
cargo tauri android build --debug --apk --target aarch64 --target x86_64)
```
Ne pas lancer `npm run build` séparément. Le build Tauri doit terminer en affichant le chemin de l'APK produit. Aucun AAB n'est requis pour cette beta.
## Contrôle de l'APK
À partir du chemin `<apk>` affiché par Tauri :
```bash
unzip -l <apk> | grep -E 'lib/(arm64-v8a|x86_64)/libgame_snake_poc_tauri_lib\.so'
```
Les deux ABI doivent être présentes. Le package est ensuite installé successivement sur l'AVD x86_64 et l'appareil ARM64 réel :
```bash
adb -s <serial> install -r <apk>
adb -s <serial> shell am start -n com.sasedev.games.snake.tauri/.MainActivity
```
Le smoke autonome vérifie au minimum : Canvas, assets `snake / engine-v1`, WASM, contrôles, provenance, background/foreground, reprise sans rattrapage, rotation/resize si disponible et plusieurs sorties Back. Le package ne doit dépendre ni de Vite, ni du port `1436`, ni de `adb reverse`.
## Après validation
Si la gate beta et les deux smokes APK sont propres, `2-beta.2` reste omise sauf besoin documentaire substantiel. La tranche suivante est alors `0.3.1-3-rc.1`, avec gel fonctionnel, packaging RC et matrice finale x86_64 + ARM64.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/002-V0_3_1_TAURI_ANDROID_SNAKE_PLAN.md -->
<!-- version: 8 -->
<!-- version: 9 -->
# Plan v0.3.1 — second host Snake Tauri Android
@@ -127,7 +127,7 @@ Cette tranche doit rendre le second host fonctionnel de bout en bout et suffisam
La gate AVD `0-pre.4` est propre. Le smoke supplémentaire sur Galaxy S9+ ARM64 a confirmé compilation `aarch64-linux-android`, installation, Canvas, assets, WASM, touch et lifecycle visible/hidden via un tunnel ADB USB. Deux écarts ont été observés : le HMR utilisait encore un port WebSocket séparé, défaut local corrigé par `0-pre.4.fix.1`, et le Back système a déclenché un abort natif `FORTIFY: pthread_mutex_lock called on a destroyed mutex` pendant le teardown de l'Activity/WebView. Les logs placent cet abort après `visibility hidden` et avant `pagehide`, sans `runtime disposed`.
`0-pre.4.fix.1` ne tente pas de migrer manuellement Tauri/Wry ni de patcher `gen/android`. Le smoke résout `tauri 2.11.5` avec `wry 0.55.1`; les versions Wry postérieures comportent des changements Android de lifecycle et de synchronisation, mais elles ne doivent pas être forcées derrière la pile stable Tauri actuelle sans intégration upstream. Le crash Back réel reste donc une limite externe du POC à retester avec l'APK autonome `2-beta.1`.
`0-pre.4.fix.1` ne tente pas de migrer manuellement Tauri/Wry ni de patcher `gen/android`. Il unifie HTTP et HMR sur le port `1436` et sa gate réelle ARM64 est validée : le frontend atteint `ready`, le touch est observé et l'erreur WebSocket Vite a disparu. Le Back n'a pas reproduit l'abort `FORTIFY` du smoke précédent et est allé jusqu'au détachement de la fenêtre ; le défaut reste néanmoins considéré comme potentiellement intermittent jusqu'au smoke de l'APK autonome `2-beta.1`.
### `0-pre.5` — extraction conditionnelle
@@ -139,6 +139,8 @@ Si aucune extraction n'est justifiée, cette tranche est omise.
### `2-beta.1` — validation large et packaging Android
Tranche ouverte après validation de `0-pre.4.fix.1`. Aucun `0-pre.5` n'est justifié : aucune extraction Web/Tauri ne conserve assez de valeur maintenant que le host Android Tauri est explicitement un POC de référence.
Prévoir :
- audits statiques applicables ;

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/001-VALIDATION_GATES.md -->
<!-- version: 10 -->
<!-- version: 11 -->
# Gates de validation
@@ -68,7 +68,7 @@ adb -s <serial> reverse tcp:1436 tcp:1436
(cd crates/apps/game-snake-poc-tauri && cargo tauri android dev --host 127.0.0.1)
```
La validation réelle de `0-pre.4` a confirmé le chemin ARM64 `aarch64-linux-android`, mais a aussi observé un abort natif lors du Back/teardown WebView sur le Galaxy S9+ de validation. Tant que ce comportement n'est pas résolu upstream ou reproduit sur l'APK autonome, il est enregistré comme limite du POC et ne doit pas être masqué par une modification du scaffold `gen/android`.
La validation réelle de `0-pre.4` a confirmé le chemin ARM64 `aarch64-linux-android`. Un premier smoke a observé un abort natif lors du Back/teardown WebView ; après correction du tunnel HMR dans `0-pre.4.fix.1`, un nouveau smoke ARM64 n'a pas reproduit cet abort et est allé jusqu'au détachement de la fenêtre. Le risque reste à revalider sur l'APK autonome beta et ne doit pas être masqué par une modification du scaffold `gen/android`.
Le host navigateur direct Snake possède désormais une gate réelle. Lorsqu'il est touché, construire d'abord l'adapter WASM et ses bindings hors dépôt, puis le frontend :
@@ -85,7 +85,32 @@ npm run build
Le smoke direct utilise ensuite `npm run dev` et `http://127.0.0.1:1434/main.html`. Pour le POC Snake feature-complete, vérifier aussi : assets `common` + `game` chargés avant le statut `Prêt`, provenance `Web/Wasm/Browser` visible et mise à jour par l'input, pause sans rattrapage lors d'un masquage d'onglet, reprise propre, resize sans tick artificiel, SimpleBar, clavier et contrôles pointer/tactiles.
Lorsque `0-pre.5` touche la frontière plateforme du bridge WASM, exécuter également `cargo test -p engine-v1-platform-api`, `cargo test -p game-snake-poc-wasm`, puis un smoke `cargo run -p game-snake-poc-desktop` pour confirmer la non-régression SDL3. Les frontends Tauri restent pilotés par leurs hooks Tauri et ne reprennent pas cette gate manuelle.
Si une future tranche touche de nouveau la frontière plateforme du bridge WASM, exécuter également `cargo test -p engine-v1-platform-api`, `cargo test -p game-snake-poc-wasm`, puis un smoke `cargo run -p game-snake-poc-desktop` pour confirmer la non-régression SDL3. Les frontends Tauri restent pilotés par leurs hooks Tauri et ne reprennent pas cette gate manuelle.
## Gate beta du POC Snake Tauri Android
À l'entrée en `0.3.1-2-beta.1`, la gate ajoute la suite Cargo workspace complète et un packaging Android autonome aux audits/check/Clippy habituels :
```bash
cargo test --workspace --all-targets --all-features
export JAVA_HOME=/usr/lib/jvm/temurin-17-jdk-amd64
(cd crates/apps/game-snake-poc-tauri && npm install)
(cd crates/apps/game-snake-poc-tauri && \
cargo tauri android build --debug --apk --target aarch64 --target x86_64)
```
Le hook Tauri `beforeBuildCommand` possède le build WASM release, `wasm-bindgen`, TypeScript et Vite ; `npm run build` n'est donc pas une gate manuelle. Le build beta vise un APK Debug contenant `arm64-v8a` et `x86_64`; aucun AAB n'est requis à ce jalon.
Après packaging, utiliser le chemin d'APK affiché par Tauri, vérifier son contenu ABI, puis installer le même package sur l'AVD x86_64 et l'appareil ARM64 réel :
```bash
unzip -l <apk> | grep -E 'lib/(arm64-v8a|x86_64)/libgame_snake_poc_tauri_lib\.so'
adb -s <serial> install -r <apk>
adb -s <serial> shell am start -n com.sasedev.games.snake.tauri/.MainActivity
```
Le smoke autonome vérifie Canvas, assets, WASM, input, provenance, background/foreground, reprise sans rattrapage, resize/rotation si disponible et plusieurs sorties Back. Il ne doit utiliser ni serveur Vite ni `adb reverse`.
## Gate beta du POC Snake Web

View File

@@ -0,0 +1,62 @@
<!-- file: history/0.3.1/0-pre.4.fix.1.md -->
<!-- version: 1 -->
# Historique 0.3.1-0-pre.4.fix.1
## Statut
Correctif validé par l'utilisateur le 2026-09-21. Le POC Tauri Android est jouable sur l'AVD x86_64 et sur un Galaxy S9+ ARM64 réel ; HTTP et HMR utilisent désormais le même tunnel USB `1436` sur appareil physique.
Aucune extraction `0-pre.5` n'est justifiée. La version peut entrer en `2-beta.1` pour la validation large et le packaging APK autonome.
## Gate workspace
Les validations suivantes passent :
```text
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
games.sasedev workspace audit: clean
Markdown table audit: clean (5 table(s), 222 file(s))
Distribution layout audit: clean (48 required path(s), 1 forbidden path(s) absent)
cargo fmt --all: clean
cargo fmt --all -- --check: clean
cargo check --workspace: clean
cargo clippy --workspace --all-targets --all-features -- -D warnings: clean
cargo test -p game-snake-poc-wasm --all-targets --all-features: 5 passed, 0 failed
```
## Smoke ARM64 réel
Le téléphone expose `arm64-v8a`; Tauri sélectionne `aarch64-linux-android`, compile `libgame_snake_poc_tauri_lib.so`, assemble puis installe l'application avec succès.
La gate utilise :
```text
adb reverse tcp:1436 tcp:1436
cargo tauri android dev --host 127.0.0.1
```
Les traces confirment :
```text
Snake Tauri frontend bootstrap started
Snake Tauri assets ready: game-snake-poc / snake / engine-v1
Snake Tauri WASM initialized
Snake Tauri provenance: android / tauri-webview / wasm / phone / unknown
Snake Tauri runtime resumed
Snake Tauri frontend ready
Snake Tauri provenance: android / tauri-webview / wasm / phone / touch
```
L'erreur Vite `failed to connect to websocket` observée avant le fix ne réapparaît pas.
## Back et teardown
Le premier smoke ARM64 de `0-pre.4` avait observé un abort `FORTIFY: pthread_mutex_lock called on a destroyed mutex` pendant le teardown. Le smoke `fix.1` ne le reproduit pas : après Back, les traces passent par `runtime paused`, `visibility hidden`, destruction de la surface EGL, `stopped(true)` puis `dispatchDetachedFromWindow`, sans crash observé avant l'arrêt volontaire de la commande.
Le défaut est donc traité comme un risque potentiellement intermittent plutôt que comme une régression reproductible du host. `2-beta.1` doit encore le retester sur un APK autonome, sans Vite ni tunnel ADB.
## Suite
`0.3.1-2-beta.1` exécute la suite Cargo workspace complète, package un APK Debug autonome contenant x86_64 et ARM64, puis le fume sur AVD et appareil réel.