From 3e1153eb8c68e1b4260dd2111fdf802a43721a81 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sun, 20 Sep 2026 14:03:04 +0200 Subject: [PATCH] 0.3.0-0-pre.5-fix.1 --- Cargo.toml | 2 +- README.md | 4 +- Web/game-snake-poc/vite.config.ts | 6 +- deltas/0.3.0/0-pre.5.fix.1.md | 77 +++++++++++++++++++++ docs/development/010-SNAKE_WEB_FRONTEND.md | 6 +- docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md | 4 +- history/0.3.0/0-pre.5.md | 51 ++++++++++++++ scripts/audit_distribution_layout.py | 6 +- 8 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 deltas/0.3.0/0-pre.5.fix.1.md create mode 100644 history/0.3.0/0-pre.5.md diff --git a/Cargo.toml b/Cargo.toml index 0d70941..b0abcab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ members = [ ] [workspace.package] -version = "0.3.0-0-pre.5" +version = "0.3.0-0-pre.5.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/games" diff --git a/README.md b/README.md index 4247729..1cb4f1f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - + # games.sasedev @@ -26,7 +26,7 @@ Workspace expérimental puis productif pour des jeux multiplateformes principale Version stable de référence : `0.2.0`. -Version de développement : `0.3.0-0-pre.5`. +Version de développement : `0.3.0-0-pre.5.fix.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. diff --git a/Web/game-snake-poc/vite.config.ts b/Web/game-snake-poc/vite.config.ts index f4951d0..3eb480a 100644 --- a/Web/game-snake-poc/vite.config.ts +++ b/Web/game-snake-poc/vite.config.ts @@ -1,5 +1,5 @@ // file: Web/game-snake-poc/vite.config.ts -// version: 2 +// version: 3 import { NodePackageImporter } from "sass-embedded"; import { fileURLToPath } from "node:url"; @@ -22,8 +22,8 @@ export default defineConfig({ plugins: [ viteStaticCopy({ targets: [ - { src: commonRuntimeAsset, dest: "common/data" }, - { src: gameRuntimeAsset, dest: "game/data" }, + { src: commonRuntimeAsset, dest: "common/data", rename: { stripBase: true } }, + { src: gameRuntimeAsset, dest: "game/data", rename: { stripBase: true } }, ], }), ], diff --git a/deltas/0.3.0/0-pre.5.fix.1.md b/deltas/0.3.0/0-pre.5.fix.1.md new file mode 100644 index 0000000..f37350e --- /dev/null +++ b/deltas/0.3.0/0-pre.5.fix.1.md @@ -0,0 +1,77 @@ + + + +# Delta 0.3.0-0-pre.5.fix.1 + +## Objectif + +Corriger uniquement l'exposition des assets runtime du host Snake Web en développement, après validation partielle de `0-pre.5`. + +## Défaut confirmé + +`cargo`, WASM, `wasm-bindgen` et le build Vite passent. Sous `vite dev`, le frontend échoue néanmoins avant le démarrage du jeu lors de `fetchJson()` : les routes `common/data/runtime.json` et `game/data/game.json` ne sont pas servies comme attendu. + +Les targets `vite-plugin-static-copy` utilisent des chemins source absolus. Le plugin conserve la structure source par défaut ; le `dest` seul ne constitue donc pas le contrat de route recherché. + +## Correction + +Les deux targets Vite utilisent désormais : + +```text +rename: { stripBase: true } +``` + +Le contrat devient explicitement : + +```text +assets/common/data/runtime.json -> /common/data/runtime.json +assets/game-snake-poc/data/game.json -> /game/data/game.json +``` + +Ces routes doivent être identiques sous `vite dev` et dans `dist/`. Aucun asset source n'est dupliqué sous `Web/`. + +## Garde-fou + +`audit_distribution_layout.py` exige désormais `stripBase: true` sur les deux targets, en plus des namespaces `common/data` et `game/data`. + +## Historique + +`history/0.3.0/0-pre.5.md` consigne la validation partielle fournie par l'utilisateur et le défaut runtime exact. + +## Non modifié + +- gameplay Snake ; +- adapter WASM/provenance ; +- lifecycle/resize ; +- logging frontend ; +- SimpleBar/Canvas ; +- runner Desktop SDL3 ; +- ROADMAP et CHANGELOG. + +## Validation demandée + +Depuis la racine : + +```bash +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 -p engine-v1-platform-api --all-targets --all-features +cargo test -p game-snake-poc-wasm --all-targets --all-features +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-web/wasm --out-name game_snake_poc_wasm +cargo tree -p game-snake-poc-wasm --edges normal +(cd Web/game-snake-poc && npm install && npm run build && npm run dev) +``` + +Smoke sur `http://127.0.0.1:1434/main.html` : + +1. `Assets` doit passer de `chargement…` à `snake / engine-v1` ; +2. Snake doit démarrer ; +3. la provenance doit quitter `unknown / unknown` dès qu'une classe/device et une entrée sont observées ; +4. revalider lifecycle/resize/SimpleBar/Canvas/contrôles ; +5. terminer par `cargo run -p game-snake-poc-desktop` pour la non-régression SDL3. diff --git a/docs/development/010-SNAKE_WEB_FRONTEND.md b/docs/development/010-SNAKE_WEB_FRONTEND.md index 0298595..4c483f9 100644 --- a/docs/development/010-SNAKE_WEB_FRONTEND.md +++ b/docs/development/010-SNAKE_WEB_FRONTEND.md @@ -1,5 +1,5 @@ - + # Frontend du POC Snake Web direct @@ -148,7 +148,9 @@ assets/common/data/runtime.json -> dist/common/data/runtime.json assets/game-snake-poc/data/game.json -> dist/game/data/game.json ``` -Le serveur Vite de développement expose les mêmes routes. Le frontend charge et valide les deux JSON avant le démarrage WASM. Le statut visible `Assets` permet de confirmer le chargement pendant le smoke. Aucune copie source n'est ajoutée sous `Web/`. +Les deux targets utilisent explicitement `rename: { stripBase: true }`. Ce point est nécessaire puisque les sources sont résolues en chemins absolus : seule la basename (`runtime.json` / `game.json`) doit être placée sous le `dest` canonique, sans conserver l'arborescence du chemin source. Le serveur Vite de développement expose ainsi les mêmes routes `/common/data/runtime.json` et `/game/data/game.json` que le build de production. + +Le frontend charge et valide les deux JSON avant le démarrage WASM. Le statut visible `Assets` permet de confirmer le chargement pendant le smoke. Aucune copie source n'est ajoutée sous `Web/`. ## Logging frontend diff --git a/docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md b/docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md index caa181d..8d8280d 100644 --- a/docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md +++ b/docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md @@ -1,5 +1,5 @@ - + # Plan v0.3.0 — baseline Snake et premier POC Web direct @@ -89,6 +89,8 @@ Livraison candidate : le host suspend la simulation sur `visibilitychange`/`page Gate : audits statiques, `cargo check --workspace`, Clippy workspace strict, tests `engine-v1-platform-api` et `game-snake-poc-wasm`, build WASM + `wasm-bindgen`, build Vite, smoke navigateur couvrant assets/provenance/lifecycle/resize/inputs/SimpleBar, puis smoke `game-snake-poc-desktop` pour la non-régression SDL3. +Suivi `0-pre.5.fix.1` : la validation de `0-pre.5` confirme les gates Rust/WASM et le build Vite production, mais le smoke `vite dev` reste bloqué sur le chargement des assets. Les targets `vite-plugin-static-copy` utilisent des sources absolues sans `rename.stripBase`, ce qui ne garantit pas les routes runtime canoniques. Le fix impose `stripBase: true` aux deux targets afin que dev et build exposent exactement `/common/data/runtime.json` et `/game/data/game.json`. + ### `0-pre.6` — correction/extraction seulement si prouvée Tranche conditionnelle. Elle n'existe que si les POC précédents révèlent une duplication réelle, une frontière mal placée ou un défaut nécessitant une correction structurante avant stabilisation. Sinon elle est omise. diff --git a/history/0.3.0/0-pre.5.md b/history/0.3.0/0-pre.5.md new file mode 100644 index 0000000..cc2dadd --- /dev/null +++ b/history/0.3.0/0-pre.5.md @@ -0,0 +1,51 @@ + + + +# Historique 0.3.0-0-pre.5 + +## Statut + +Validation technique partielle fournie par l'utilisateur le 2026-09-20. Les gates Rust/WASM et le build Vite passent, mais le smoke navigateur est bloqué par le chargement des assets runtime ; `0-pre.5` nécessite donc `0-pre.5.fix.1`. + +## Validations réussies + +La sortie utilisateur confirme : + +```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), 189 file(s)) +Distribution layout audit: clean (31 required path(s), 1 forbidden path(s) absent) +cargo fmt --all -- --check: clean +cargo check --workspace: clean +cargo clippy --workspace --all-targets --all-features -- -D warnings: clean +cargo test -p engine-v1-platform-api --all-targets --all-features: 3 passed +cargo test -p game-snake-poc-wasm --all-targets --all-features: 4 passed +cargo build -p game-snake-poc-wasm --target wasm32-unknown-unknown: clean +wasm-bindgen --target web: clean +cargo tree -p game-snake-poc-wasm --edges normal: frontière attendue +npm install: 64 packages audités, 0 vulnérabilité +npm run build: clean, 30 modules transformés, 2 assets collectés +npm run dev: Vite démarré sur 127.0.0.1:1434 +``` + +Le warning npm relatif au script d'installation de `@parcel/watcher@2.6.0` reste non bloquant. + +Le smoke `cargo run -p game-snake-poc-desktop` n'a pas été exécuté dans cette tentative, le smoke Web étant déjà bloqué par les assets. + +## Défaut observé + +Le shell démarre, mais les sondes visibles restent : + +```text +Provenance: web / browser / wasm / unknown / unknown +Assets: chargement… +Impossible de démarrer Snake : fetchJson@http://127.0.0.1:1434/ts/assets.ts:4:9 +``` + +Le build production copie les deux assets, mais le serveur de développement ne les expose pas aux routes attendues par `fetchJson()`. Les targets de `vite-plugin-static-copy` partent de chemins absolus sans suppression explicite du préfixe source. + +## Suite + +`0-pre.5.fix.1` impose `rename: { stripBase: true }` aux deux targets afin de rendre les routes runtime identiques en `vite dev` et dans `dist/`, puis rejoue le smoke assets/provenance/lifecycle avant toute entrée en beta. diff --git a/scripts/audit_distribution_layout.py b/scripts/audit_distribution_layout.py index f83a89d..e027d79 100644 --- a/scripts/audit_distribution_layout.py +++ b/scripts/audit_distribution_layout.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # file: scripts/audit_distribution_layout.py -# version: 6 +# version: 7 """Audit the static distribution layout expected by supported POCs.""" @@ -117,8 +117,8 @@ def audit_snake_web_integration(root: pathlib.Path) -> list[str]: required_fragments = ( (package, '"vite-plugin-static-copy"', "DIST-LAYOUT-007: Snake Web package must declare static asset packaging"), - (vite, 'dest: "common/data"', "DIST-LAYOUT-008: common Web assets must retain the common/data namespace"), - (vite, 'dest: "game/data"', "DIST-LAYOUT-009: game Web assets must retain the game/data namespace"), + (vite, 'dest: "common/data", rename: { stripBase: true }', "DIST-LAYOUT-008: common Web assets must retain the common/data namespace without absolute source prefixes"), + (vite, 'dest: "game/data", rename: { stripBase: true }', "DIST-LAYOUT-009: game Web assets must retain the game/data namespace without absolute source prefixes"), (main, 'loadSnakeWebAssets()', "DIST-LAYOUT-010: Snake Web startup must load runtime asset probes"), (main, 'bindBrowserLifecycle(session, stage)', "DIST-LAYOUT-011: Snake Web startup must bind browser lifecycle"), (lifecycle, '"visibilitychange"', "DIST-LAYOUT-012: Snake Web lifecycle must observe visibility changes"),