# Delta 0.1.4-alpha.3 — skeleton Tauri contrôlé ## Précondition `0.1.4-alpha.2.fix.1` doit être committée avec son history `PASS` avant application de ce delta. Version après application : ```text 0.1.4-alpha.3 ``` ## Objet Matérialiser le skeleton Tauri 2 autorisé par les gates précédentes, sans créer de template technique universel ni absorber les owners Rust/Web/plateforme. La tranche corrige également le contrat de packaging des archives delta/history après l'observation opérateur d'un répertoire englobant `pgr/` dans deux ZIP remis : les entrées doivent désormais être directement relatives à la racine du dépôt. ## Scope ADD : ```text deltas/0.1.4/alpha.3.md docs/skeletons/004-TAURI.md ``` REPLACE : ```text VERSION docs/000-README.md docs/plans/010-V0_1_4_TAURI_REEVALUATION_PLAN.md docs/rules/210-WORKFLOW.md docs/skeletons/000-README.md ``` Aucun template Tauri, contrat de validation Tauri séparé, changement de roadmap ou adoption Games/KSP n'appartient à cette tranche. ## Skeleton `004-TAURI` La nouvelle specification : - compose `001-PROJECT_GOVERNANCE_FOUNDATION`, `002-RUST_CARGO_WORKSPACE`, `003-WEB_FRONTEND` et `710-TAURI` ; - conserve `src-tauri/` comme layout valide pour un projet existant tout en recommandant une crate Cargo directement lisible pour une nouvelle baseline contrôlée ; - rend obligatoires les décisions de version, frontend, package manager, hooks, `devUrl`, `frontendDist`, capabilities, permissions, plugins, fenêtres, bundles et plateformes ; - distingue recommandations de baseline et options locales ; - garde WASM séparé par défaut ; - définit un ordre d'initialisation ; - définit une gate initiale séparant preuves Rust, frontend, intégration Tauri, packaging et plateforme ; - conclut qu'aucun template Tauri technique supplémentaire n'est actuellement justifié. ## Packaging delta/history `docs/rules/210-WORKFLOW.md` passe en révision `9` et rend explicite que : ```text archive.delta/history.zip ├── VERSION # si présent dans le delta ├── docs/... ├── deltas/... └── history/... ``` est valide, tandis que : ```text archive.zip └── pgr/ ├── docs/... └── history/... ``` est invalide pour le handoff canonique `unzip -o -d .`. Le générateur doit vérifier la liste des entrées du ZIP avant remise. ## Gate opérateur Après commit/push du history `PASS` de `alpha.2.fix.1`, appliquer ce delta puis exécuter : ```bash cat VERSION test -f history/0.1.4/alpha.2.fix.1.md grep -A2 '^## Statut$' history/0.1.4/alpha.2.fix.1.md | grep -Fx 'PASS' test -f deltas/0.1.4/alpha.3.md test -f docs/skeletons/004-TAURI.md test ! -e history/0.1.4/alpha.3.md python3 -B -m unittest discover -s tests -v python3 -B scripts/audit_text_hygiene.py \ VERSION README.md RULES.md ROADMAP.md CHANGELOG.md \ docs deltas history prompts scripts tests templates .gitignore .settings python3 -B scripts/audit_markdown_headers.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_tables.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_links.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B - <<'PY' from pathlib import Path import re assert Path('VERSION').read_text(encoding='utf-8').strip() == '0.1.4-alpha.3' history = Path('history/0.1.4/alpha.2.fix.1.md').read_text(encoding='utf-8') assert re.search(r'## Statut\s+PASS', history) skeleton = Path('docs/skeletons/004-TAURI.md').read_text(encoding='utf-8') assert skeleton.startswith( '\n' '' ) for phrase in ( '## Décisions obligatoires avant matérialisation', '## Baseline organisationnelle recommandée', '## Capabilities, permissions et commandes', '## Ordre d\'initialisation', '## Validation initiale', '## Templates techniques', 'Aucun template Tauri technique supplémentaire n\'est requis', 'ADOPT / KEEP-LOCAL / OVERRIDE / DEFER', ): assert phrase in skeleton, phrase for path, version in ( ('docs/rules/210-WORKFLOW.md', '9'), ('docs/skeletons/000-README.md', '7'), ('docs/000-README.md', '43'), ('docs/plans/010-V0_1_4_TAURI_REEVALUATION_PLAN.md', '3'), ('docs/rules/710-TAURI.md', '7'), ('docs/studies/002-TAURI_SKELETON_DECISION.md', '3'), ): lines = Path(path).read_text(encoding='utf-8').splitlines() assert lines[1] == f'', (path, lines[1]) workflow = Path('docs/rules/210-WORKFLOW.md').read_text(encoding='utf-8') for phrase in ( 'Les entrées des archives delta/history MUST utiliser directement les chemins relatifs à la racine du dépôt', 'MUST NOT ajouter un répertoire englobant portant le nom du projet', 'vérifier la liste des entrées du ZIP avant remise', ): assert phrase in workflow, phrase index = Path('docs/skeletons/000-README.md').read_text(encoding='utf-8') assert '[`004-TAURI.md`](004-TAURI.md)' in index doc_index = Path('docs/000-README.md').read_text(encoding='utf-8') assert '[`skeletons/004-TAURI.md`](skeletons/004-TAURI.md)' in doc_index assert not Path('history/0.1.4/alpha.3.md').exists() assert not Path('docs/templates/011-TAURI.md').exists() assert not Path('docs/validation/006-TAURI_VALIDATION.md').exists() print( '0.1.4 alpha.3 skeleton audit: clean ' '(004 materialized, owners composed, no premature template/validation artifact, ZIP root contract explicit)' ) PY git diff --check git add VERSION \ deltas/0.1.4/alpha.3.md \ docs/000-README.md \ docs/plans/010-V0_1_4_TAURI_REEVALUATION_PLAN.md \ docs/rules/210-WORKFLOW.md \ docs/skeletons/000-README.md \ docs/skeletons/004-TAURI.md git diff --cached --check git status --short ``` Le scope attendu est : ```text M VERSION A deltas/0.1.4/alpha.3.md M docs/000-README.md M docs/plans/010-V0_1_4_TAURI_REEVALUATION_PLAN.md M docs/rules/210-WORKFLOW.md M docs/skeletons/000-README.md A docs/skeletons/004-TAURI.md ``` ## Transition ### PASS Produire `history/0.1.4/alpha.3.md`, commit/push sous l'identité `0.1.4-alpha.3`, puis ouvrir `beta.1` pour la réconciliation globale et la décision explicite sur les artefacts Tauri supplémentaires. ### FAIL Enregistrer le résultat réel dans `history/0.1.4/alpha.3.md` et poursuivre sous `alpha.3.fix.N`. Ne pas ouvrir `beta.1` tant que la composition du skeleton et le scope ne sont pas propres.