0.3.0-0-pre.5-fix.1

This commit is contained in:
2026-09-20 14:03:04 +02:00
parent 7f0635ec9d
commit 3e1153eb8c
8 changed files with 144 additions and 12 deletions

View File

@@ -20,7 +20,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.3.0-0-pre.5" version = "0.3.0-0-pre.5.fix.1"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/games" repository = "https://git.sasedev.com/Sasedev/games"

View File

@@ -1,5 +1,5 @@
<!-- file: README.md --> <!-- file: README.md -->
<!-- version: 35 --> <!-- version: 36 -->
# games.sasedev # 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 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. 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: Web/game-snake-poc/vite.config.ts // file: Web/game-snake-poc/vite.config.ts
// version: 2 // version: 3
import { NodePackageImporter } from "sass-embedded"; import { NodePackageImporter } from "sass-embedded";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
@@ -22,8 +22,8 @@ export default defineConfig({
plugins: [ plugins: [
viteStaticCopy({ viteStaticCopy({
targets: [ targets: [
{ src: commonRuntimeAsset, dest: "common/data" }, { src: commonRuntimeAsset, dest: "common/data", rename: { stripBase: true } },
{ src: gameRuntimeAsset, dest: "game/data" }, { src: gameRuntimeAsset, dest: "game/data", rename: { stripBase: true } },
], ],
}), }),
], ],

View File

@@ -0,0 +1,77 @@
<!-- file: deltas/0.3.0/0-pre.5.fix.1.md -->
<!-- version: 1 -->
# 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.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/development/010-SNAKE_WEB_FRONTEND.md --> <!-- file: docs/development/010-SNAKE_WEB_FRONTEND.md -->
<!-- version: 4 --> <!-- version: 5 -->
# Frontend du POC Snake Web direct # 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 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 ## Logging frontend

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md --> <!-- file: docs/plans/001-V0_3_0_WEB_SNAKE_POC_PLAN.md -->
<!-- version: 10 --> <!-- version: 11 -->
# Plan v0.3.0 — baseline Snake et premier POC Web direct # 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. 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 ### `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. 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.

51
history/0.3.0/0-pre.5.md Normal file
View File

@@ -0,0 +1,51 @@
<!-- file: history/0.3.0/0-pre.5.md -->
<!-- version: 1 -->
# 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.

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# file: scripts/audit_distribution_layout.py # file: scripts/audit_distribution_layout.py
# version: 6 # version: 7
"""Audit the static distribution layout expected by supported POCs.""" """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 = ( required_fragments = (
(package, '"vite-plugin-static-copy"', "DIST-LAYOUT-007: Snake Web package must declare static asset packaging"), (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: "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"', "DIST-LAYOUT-009: game Web assets must retain the game/data namespace"), (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, '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"), (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"), (lifecycle, '"visibilitychange"', "DIST-LAYOUT-012: Snake Web lifecycle must observe visibility changes"),