# Delta 0.1.1-alpha.5 — CSS/Sass, validation frontend et skeleton Web ## Baseline et version Baseline attendue : commit opérateur de `0.1.1-alpha.4`, réalisé après application de `history/0.1.1/alpha.4.md` avec statut `PASS`. Le hash de ce commit n'est pas anticipé. Version avant application : ```text 0.1.1-alpha.4 ``` Version après application : ```text 0.1.1-alpha.5 ``` ## Objet Compléter l'owner `560-CSS_SASS.md`, définir une validation frontend réutilisable indépendante du host et matérialiser un skeleton Web uniquement parce que les owners `530/540/550/560` sont désormais suffisamment séparés et actionnables. La tranche conserve les décisions suivantes : - CSS reste valide sans Sass ; - Sass reste optionnel mais recommandé (`SHOULD`) lorsqu'il apporte une valeur réelle ; - `@use` / `@forward` sont préférés pour le nouveau Sass contrôlé ; - `@import` reste une compatibilité possible pour les dépendances qui l'exigent encore ; - les sources CSS/Sass et leurs outputs générés sont distingués sans ambiguïté ; - un package de styles est consommé via son entrypoint public/documenté plutôt que par un chemin interne arbitraire ; - Bootstrap/Tailwind CSS/alternative restent des choix de projet ou skeleton, pas des obligations de `560` ; - la validation frontend est séparée de la validation du host ; - le skeleton Web compose des owners existants et ne devient pas leur propriétaire. Le `DEFER` Tauri n'est pas levé par cette tranche. ## Validation frontend indépendante du host [`docs/validation/005-WEB_FRONTEND_VALIDATION.md`](../../docs/validation/005-WEB_FRONTEND_VALIDATION.md) définit les couches de preuve réutilisables : ```text restore reproductible TypeScript typecheck styles si preuve distincte build frontend de production browser smoke si nécessaire host integration séparée ``` La matrice évite les doublons : si Sass est déjà compilé par le build Vite et qu'aucun contrat Sass autonome n'existe, une seconde compilation identique n'est pas requise. Un `PASS` frontend ne vaut jamais automatiquement `PASS` du host. ## Skeleton Web [`docs/skeletons/003-WEB_FRONTEND.md`](../../docs/skeletons/003-WEB_FRONTEND.md) devient la première specialization Web PGR. Il peut composer : ```text GENERAL + 500 + 530 + 540 + 550 + 560 ``` mais chaque profil reste sélectionné selon les faits du projet. TypeScript et Vite restent des recommandations `SHOULD`; Sass reste conditionnel. Le skeleton MUST NOT imposer : ```text npm Bootstrap Tailwind CSS frontend/ vite.config.ts générique main.scss générique port fixe base fixe WASM Tauri backend deployment ``` ## Pas de faux templates techniques La tranche ajoute un guide CSS/Sass : ```text docs/templates/010-WEB_CSS_SASS.md ``` mais aucun `templates/web-css/main.scss` ni autre source de style factice. Le skeleton réutilise les templates TypeScript/package existants et les guides Vite/CSS-Sass. Les valeurs réellement dépendantes du projet restent à décider pendant l'instanciation. ## Scope REPLACE : ```text VERSION README.md docs/000-README.md docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md docs/rules/560-CSS_SASS.md docs/skeletons/000-README.md docs/validation/001-VALIDATION_MATRIX.md ``` ADD : ```text docs/skeletons/003-WEB_FRONTEND.md docs/templates/010-WEB_CSS_SASS.md docs/validation/005-WEB_FRONTEND_VALIDATION.md deltas/0.1.1/alpha.5.md ``` DELETE : aucun. ## Validation opérateur Après application du history `PASS`, commit/push de `alpha.4`, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.1.1-alpha.5' git cat-file -e HEAD:history/0.1.1/alpha.4.md test -f history/0.1.1/alpha.4.md test -f deltas/0.1.1/alpha.5.md test ! -e history/0.1.1/alpha.5.md grep -A2 '^## Statut$' history/0.1.1/alpha.4.md | grep -Fx 'PASS' grep -Fx '' README.md grep -Fx '' docs/000-README.md grep -Fx '' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md grep -Fx '' docs/rules/560-CSS_SASS.md grep -Fx '' docs/skeletons/000-README.md grep -Fx '' docs/skeletons/003-WEB_FRONTEND.md grep -Fx '' docs/templates/010-WEB_CSS_SASS.md grep -Fx '' docs/validation/001-VALIDATION_MATRIX.md grep -Fx '' docs/validation/005-WEB_FRONTEND_VALIDATION.md python3 -B - <<'PYGATE' from pathlib import Path import re history = Path("history/0.1.1/alpha.4.md").read_text(encoding="utf-8") assert re.search(r"## Statut\s+PASS\s", history) styles = Path("docs/rules/560-CSS_SASS.md").read_text(encoding="utf-8") for phrase in ( "Sass **SHOULD** être préféré", "Sass n'est donc jamais requis", "MUST NOT être modifié manuellement", "`@use` / `@forward`", "L'ancien `@import` Sass est déprécié", "entrypoint Sass public", "`sass-embedded` **SHOULD** être préféré", "Un package npm apportant uniquement des styles n'impose pas l'ajout de déclarations `@types/*`", "un build Vite réussi peut constituer la preuve de compilation des styles", "005-WEB_FRONTEND_VALIDATION.md", ): assert phrase in styles, phrase guide = Path("docs/templates/010-WEB_CSS_SASS.md").read_text(encoding="utf-8") for phrase in ( "ne fournit volontairement pas de `main.scss`", "CSS seul reste valide", "sass-embedded", "@use", "@forward", "Les dépendances `@types/*` ne concernent que les API JavaScript/TypeScript", "PGR ne fixe ni Bootstrap, ni Bootswatch", "host gate séparée", ): assert phrase in guide, phrase validation = Path("docs/validation/005-WEB_FRONTEND_VALIDATION.md").read_text(encoding="utf-8") for phrase in ( "Le frontend **SHOULD** être validable indépendamment du host", "Un résultat frontend `PASS`", "restauration reproductible des dépendances", "type-check TypeScript", "build frontend de production", "preview / smoke navigateur", "PGR MUST NOT imposer `npm ci`", "PGR SHOULD NOT lancer deux compilations équivalentes", "Un host tel que Tauri", "Il ne vaut pas `PASS` Tauri", ): assert phrase in validation, phrase skeleton = Path("docs/skeletons/003-WEB_FRONTEND.md").read_text(encoding="utf-8") for phrase in ( "GENERAL", "+ 530 TypeScript", "+ 540 JavaScript package ecosystem", "+ 550 Vite", "+ 560 CSS / Sass", "Le skeleton ne transforme pas une recommandation `SHOULD` en `MUST`", "PGR ne fournit pas de `vite.config.ts` universel", "PGR ne fournit pas non plus de `main.scss`", "Le nom `frontend/` est une convention possible", "le package manager réel", "Bootstrap, Tailwind CSS ou autre", "Le skeleton Tauri reste `DEFER` pendant `0.1.1`", ): assert phrase in skeleton, phrase matrix = Path("docs/validation/001-VALIDATION_MATRIX.md").read_text(encoding="utf-8") assert "005-WEB_FRONTEND_VALIDATION.md" in matrix index = Path("docs/000-README.md").read_text(encoding="utf-8") for target in ( "templates/010-WEB_CSS_SASS.md", "validation/005-WEB_FRONTEND_VALIDATION.md", "skeletons/003-WEB_FRONTEND.md", ): assert target in index, target skeleton_index = Path("docs/skeletons/000-README.md").read_text(encoding="utf-8") assert "003-WEB_FRONTEND.md" in skeleton_index assert "La création du skeleton Web ne lève pas automatiquement ce `DEFER`." in skeleton_index plan = Path("docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md").read_text(encoding="utf-8") for phrase in ( "### alpha.4 — Vite, dev server et outputs", "Statut opérateur : **PASS**.", "### alpha.5 — CSS/Sass et validation frontend", "Les owners `530/540/550/560` sont désormais assez complets", "Le skeleton ne lève pas le `DEFER` Tauri", ): assert phrase in plan, phrase study = Path("docs/studies/002-TAURI_SKELETON_DECISION.md").read_text(encoding="utf-8") assert "DEFER" in study for phrase in ( "TypeScript et conventions Web contrôlées", "Vite et ownership des commandes/dev server/build outputs", "Sass/CSS et statut des artefacts générés", "validation frontend indépendante de la validation Tauri", "choix Bootstrap ou alternative clairement classifié", ): assert phrase in study, phrase assert not Path("templates/web-vite/vite.config.ts").exists() assert not Path("templates/web-css/main.scss").exists() assert Path("docs/rules/530-TYPESCRIPT.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/550-VITE.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/710-TAURI.md").read_text(encoding="utf-8").splitlines()[1] == "" assert "0.1.8" not in Path("ROADMAP.md").read_text(encoding="utf-8") print("0.1.1 alpha.5 Web frontend audit: clean (CSS/Sass bounded, host-independent validation explicit, Web skeleton composable, Tauri DEFER preserved)") PYGATE python3 -B -m unittest discover -s tests -v 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 git diff --check git add VERSION README.md docs/000-README.md \ docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md \ docs/rules/560-CSS_SASS.md \ docs/skeletons/000-README.md docs/skeletons/003-WEB_FRONTEND.md \ docs/templates/010-WEB_CSS_SASS.md \ docs/validation/001-VALIDATION_MATRIX.md docs/validation/005-WEB_FRONTEND_VALIDATION.md \ deltas/0.1.1/alpha.5.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history de `alpha.5` est exactement : ```text M README.md M VERSION A deltas/0.1.1/alpha.5.md M docs/000-README.md M docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md M docs/rules/560-CSS_SASS.md M docs/skeletons/000-README.md A docs/skeletons/003-WEB_FRONTEND.md A docs/templates/010-WEB_CSS_SASS.md M docs/validation/001-VALIDATION_MATRIX.md A docs/validation/005-WEB_FRONTEND_VALIDATION.md ``` ## Revue opérateur complémentaire Confirmer que : - Sass reste `SHOULD` et conditionnel ; - CSS seul reste une baseline valide ; - `@use` / `@forward` sont préférés sans casser les dépendances encore basées sur `@import` ; - aucun CSS compilé n'est présenté comme source à modifier ; - aucune dépendance Sass/Vite/Bootstrap n'est injectée dans le template `package.json` générique ; - aucun `main.scss` ou `vite.config.ts` artificiel n'est ajouté ; - le skeleton `003-WEB_FRONTEND.md` compose les owners au lieu de recopier leurs règles ; - npm, Bootstrap, Tailwind CSS, `frontend/`, ports et `base` restent des décisions locales ; - la validation frontend peut être exécutée séparément du host autant que le graphe réel le permet ; - un `PASS` frontend n'est pas présenté comme un `PASS` Tauri ; - le `DEFER` du skeleton Tauri reste intact ; - WASM, backend et deployment restent hors scope. ## Transition ### PASS Produire `history/0.1.1/alpha.5.md`, l'appliquer puis committer/pousser `alpha.5`. Continuer avec `0.1.1-beta.1` pour la réconciliation large, le dry-run proportionné du skeleton Web et la preuve factuelle de préparation du futur réexamen Tauri. ### FAIL Consigner le diagnostic réel dans `history/0.1.1/alpha.5.md`, puis produire `alpha.5.fix.N` ou effectuer un REPLAN si le défaut révèle une frontière d'ownership incorrecte. Ne pas absorber `beta.1` dans un correctif CSS/Sass.