# Delta 0.0.1-alpha.3.fix.1 — correction `SourceId` et précision Web/Maud ## Base requise État `0.0.1-alpha.3` committé et poussé après application du history : ```text history/0.0.1/alpha.3.md = FAIL ``` La version devient : ```text 0.0.1-alpha.3.fix.1 ``` ## Cause du fix La gate `alpha.3` échoue avec `E0423` parce que `SourceId::new` construit le tuple struct privé via son re-export crate-root : ```text crate::SourceId(value.to_owned()) ``` Le type est public via re-export, mais son champ privé reste possédé par le module `source`. Le fix construit donc la valeur depuis le scope de l'implémentation avec : ```text Self(value.to_owned()) ``` Aucune visibilité de champ n'est élargie et aucune nouvelle API publique n'est ajoutée. ## Régression ajoutée `knowledge-domain-lib` reçoit un test direct qui prouve qu'un identifiant valide : ```text SourceId::new("pgr") ``` est construit et expose ensuite `pgr` via `as_str()`. Les tests précédents restent inchangés dans leur intention : rejet de l'identifiant vide et absence de limite codée à trois sources. ## Précision Web/Maud Une précision de trajectoire fournie avant clôture de `alpha.3` est intégrée au plan vivant sans démarrer le frontend : - le skeleton PGR `003-WEB_FRONTEND` est obligatoire pour `0.0.1` ; - Vite + TypeScript + Sass + Bootstrap servent notamment de laboratoire indépendant pour les templates statiques de référence et les assets ; - le markup runtime est ensuite adapté et rendu en Maud par les serveurs Actix ; - le build de production Vite doit produire un manifest d'entrées hashées ; - l'intégration Actix/Maud consommera ce mapping au lieu de coder des noms hashés ; - le pattern de `actix-auth-app` est étudié comme corpus, pas copié mécaniquement. La séparation de scope reste : ```text alpha.4 -> frontend indépendant, templates statiques, assets, manifest Vite alpha.5 -> Actix Web, Maud, résolution du manifest et intégration runtime ``` Aucun `package.json`, frontend, serveur Actix, loader Rust Vite ou dépendance Web n'est ajouté par le présent fix. ## Corpus Vite étudié Le nouveau document : ```text docs/studies/002-ACTIX_MAUD_VITE_CORPUS_STUDY.md ``` consigne le pattern réellement observé dans : ```text actix-auth-app-master.zip SHA-256 bcdf4c568c827b77c70ee476218c2b07ea0fca408ab87d2f044333309d19ab71 ``` Il distingue le contrat réutilisable des détails à ne pas importer tels quels, notamment : origin `localhost:5173`, préfixe `/res`, `panic!` sur manifest invalide, arborescence d'assets et dépendances TypeScript non justifiées. ## Fichier Rust corrigé ```text crates/knowledge-domain-lib/src/source.rs crates/knowledge-domain-lib/src/unit_tests.rs ``` ## Documentation remplacée ```text CHANGELOG.md Cargo.toml README.md ROADMAP.md RULES.md VERSION docs/000-README.md docs/architecture/001-PROJECT_PROFILE.md docs/architecture/002-KNOWLEDGE_ARCHITECTURE.md docs/plans/001-V0_0_1_FOUNDATION_PLAN.md docs/validation/001-VALIDATION_MATRIX.md ``` ## Documentation ajoutée ```text docs/studies/002-ACTIX_MAUD_VITE_CORPUS_STUDY.md deltas/0.0.1/alpha.3.fix.1.md ``` Aucun fichier n'est supprimé. ## `Cargo.lock` Le delta ne livre pas de `Cargo.lock` préfabriqué. Les trois packages héritent de la nouvelle version workspace `0.0.1-alpha.3.fix.1`; la toolchain opérateur doit donc régénérer le lockfile réel et sa modification doit être incluse au staging du fix si Cargo l'actualise. ## Validation attendue Après application du history `alpha.3 FAIL`, commit/push de `alpha.3`, puis extraction du présent delta : ```bash test "$(cat VERSION)" = "0.0.1-alpha.3.fix.1" git diff --check python3 - <<'PY' from pathlib import Path import tomllib with Path("Cargo.toml").open("rb") as handle: root_manifest = tomllib.load(handle) assert root_manifest["workspace"]["package"]["version"] == "0.0.1-alpha.3.fix.1" assert set(root_manifest["workspace"]["members"]) == { "crates/knowledge-domain-lib", "crates/knowledge-git-api", "crates/knowledge-sync-api", } source = Path("crates/knowledge-domain-lib/src/source.rs").read_text(encoding="utf-8") tests = Path("crates/knowledge-domain-lib/src/unit_tests.rs").read_text(encoding="utf-8") study = Path("docs/studies/002-ACTIX_MAUD_VITE_CORPUS_STUDY.md").read_text(encoding="utf-8") plan = Path("docs/plans/001-V0_0_1_FOUNDATION_PLAN.md").read_text(encoding="utf-8") rules = Path("RULES.md").read_text(encoding="utf-8") assert "return Ok(Self(value.to_owned()));" in source assert "return Ok(crate::SourceId(value.to_owned()));" not in source assert "source_id_constructs_and_exposes_valid_values" in tests assert 'SourceId::new("pgr")' in tests for phrase in ( "build.manifest = true", "src/app/vite.rs", "dev -> URL d’entrée Vite directe", "release -> entrée stable -> manifest Vite -> URL d’asset hashé", "http://localhost:5173", ): assert phrase in study, phrase for phrase in ( "### alpha.4 — baseline Web indépendante et templates de référence", "### alpha.5 — composition Actix/Maud et manifest Vite", ): assert phrase in plan, phrase for phrase in ( "Le skeleton Web PGR `003-WEB_FRONTEND`", "Le build Vite de production MUST produire", "le HTML servi en production par les applications Actix est rendu avec Maud", ): assert phrase in rules, phrase for forbidden in ( "package.json", "vite.config.ts", "crates/knowledge-pgr-server", "crates/knowledge-howtos-server", "crates/knowledge-snippets-server", "crates/knowledge-web-lib", "migrations", ): assert not Path(forbidden).exists(), forbidden print("Knowledge 0.0.1-alpha.3.fix.1 structural audit: clean") PY cargo metadata --format-version 1 --no-deps \ > /tmp/sasedev-knowledge-alpha3-fix1-metadata.json cargo fmt --all cargo fmt --all -- --check python3 -B scripts/audit_rust_blank_lines.py crates python3 -B scripts/audit_rust_item_spacing.py crates python3 -B scripts/audit_rust_module_order.py crates python3 -B scripts/audit_rust_trait_import_blocks.py crates python3 -B scripts/audit_rust_reexport_blocks.py crates python3 -B scripts/audit_rust_export_completeness.py --root . cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p knowledge-domain-lib --all-targets --all-features cargo test -p knowledge-git-api --all-targets --all-features cargo test -p knowledge-sync-api --all-targets --all-features test -f Cargo.lock if git check-ignore -q Cargo.lock; then echo 'Cargo.lock must remain versioned' >&2 exit 1 fi python3 - <<'PY' import json from pathlib import Path metadata = json.loads( Path("/tmp/sasedev-knowledge-alpha3-fix1-metadata.json").read_text(encoding="utf-8") ) packages = {package["name"] for package in metadata["packages"]} assert packages == { "knowledge-domain-lib", "knowledge-git-api", "knowledge-sync-api", }, packages for package in metadata["packages"]: assert package["version"] == "0.0.1-alpha.3.fix.1", ( package["name"], package["version"], ) print("Knowledge 0.0.1-alpha.3.fix.1 Cargo metadata audit: clean") PY git add -A git diff --cached --check git status --short ``` Ne pas committe `alpha.3.fix.1` avant production de son history à partir des résultats opérateur.