# Delta 0.1.1-alpha.2 — frontières d'ownership frontend Web ## Baseline et version Baseline attendue : commit opérateur de `0.1.1-alpha.1`, réalisé après application de `history/0.1.1/alpha.1.md` avec statut `PASS`. Le hash de ce commit n'est pas anticipé. Version avant application : ```text 0.1.1-alpha.1 ``` Version après application : ```text 0.1.1-alpha.2 ``` ## Objet Matérialiser les frontières d'ownership frontend nécessaires avant d'écrire les configurations détaillées de `alpha.3` à `alpha.5`. La tranche crée quatre profils indépendants dans la famille `500` : ```text 530 TypeScript 540 JavaScript package ecosystem 550 Vite 560 CSS / Sass ``` Elle inscrit également les trois préférences validées pendant la revue de `alpha.1` : TypeScript, Vite et Sass sont fortement recommandés dans leurs scopes applicables pour les nouveaux frontends contrôlés, donc exprimés en `SHOULD`, mais aucun n'est une obligation universelle. La tranche ne crée encore aucun template `package.json`, `tsconfig.json` ou `vite.config.ts`, aucun skeleton Web, aucun audit frontend et aucune politique finale de lockfile. Ces responsabilités restent prévues dans les tranches suivantes. ## Scope REPLACE : ```text VERSION RULES.md docs/000-README.md docs/architecture/003-RULE_PROFILE_MODEL.md docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md docs/rules/000-README.md docs/rules/710-TAURI.md ``` ADD : ```text deltas/0.1.1/alpha.2.md docs/rules/530-TYPESCRIPT.md docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md docs/rules/550-VITE.md docs/rules/560-CSS_SASS.md ``` DELETE : aucun. `ROADMAP.md`, `CHANGELOG.md`, les templates, skeletons, scripts, tests, validations et studies restent inchangés. Aucun `history/0.1.1/alpha.2.md` n'est anticipé. ## Décisions normatives ### TypeScript Pour un frontend contrôlé portant une logique durable non triviale, TypeScript `SHOULD` être préféré au JavaScript non typé. Du JavaScript direct reste valide lorsqu'il est plus proportionné. Le type-check TypeScript et la génération éventuelle de bindings depuis une autre source de vérité sont des responsabilités distinctes du bundler. TS-RS reste un outil de frontière Rust/TypeScript lorsqu'un owner plus spécifique l'exige ; il n'est pas une dépendance TypeScript universelle. ### Écosystème de package `package.json`, le package manager concret, les scripts de package, les dépendances téléchargées et la décision de lockfile appartiennent au profil `540`. PGR MUST NOT imposer npm par défaut. La politique du lockfile sera définie en `alpha.3` à partir du rôle du package et de la reproductibilité recherchée, pas à partir de l'absence de lockfile observée dans Games. ### Vite Pour un frontend contrôlé compatible avec ses capacités, Vite `SHOULD` être le build tool/dev server privilégié. Une alternative justifiée reste permise. Le profil Vite possède sa configuration, son cache et ses outputs ; il ne possède ni TypeScript, ni Sass/CSS, ni le package manager, ni Tauri, ni WASM. ### CSS / Sass CSS direct reste une baseline valide. Sass `SHOULD` être préféré lorsqu'une chaîne de styles non triviale ou une dépendance Sass/SCSS configurable en tire une valeur claire. Bootstrap est un exemple réel de bibliothèque pouvant être personnalisée à partir de ses sources Sass et de variables/maps ; il reste un choix de skeleton/projet, pas une dépendance Web universelle. Pour du nouveau code Sass, `@use` / `@forward` SHOULD être préférés lorsque compatibles. `@import` MAY rester utilisé pour la compatibilité avec des dépendances existantes qui l'exigent. ## Classification Games de cadrage La classification préparatoire est inscrite dans le plan : ```text TypeScript durable ADOPT Vite ADOPT package.json ADOPT npm concret KEEP-LOCAL lockfiles Games KEEP-LOCAL jusqu'à décision alpha.3 Sass ADOPT quand applicable Bootstrap KEEP-LOCAL frontend/ layout KEEP-LOCAL / candidat skeleton ports / aliases / plugins KEEP-LOCAL WASM dans scripts DEFER ``` Aucun `OVERRIDE` n'est nécessaire avant l'adoption réelle de Games en `0.1.5`. ## Validation opérateur Après application du history `PASS`, commit/push de `alpha.1`, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.1.1-alpha.2' git cat-file -e HEAD:history/0.1.1/alpha.1.md test -f history/0.1.1/alpha.1.md test -f deltas/0.1.1/alpha.2.md test ! -e history/0.1.1/alpha.2.md for path in docs/rules/530-TYPESCRIPT.md docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md docs/rules/550-VITE.md docs/rules/560-CSS_SASS.md; do test -f "$path" done grep -A2 '^## Statut$' history/0.1.1/alpha.1.md | grep -Fx 'PASS' grep -Fx '' RULES.md grep -Fx '' docs/000-README.md grep -Fx '' docs/architecture/003-RULE_PROFILE_MODEL.md grep -Fx '' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md grep -Fx '' docs/rules/000-README.md grep -Fx '' docs/rules/710-TAURI.md 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 python3 -B - <<'PYGATE' from pathlib import Path import re history = Path('history/0.1.1/alpha.1.md').read_text(encoding='utf-8') assert re.search(r'## Statut\s+PASS\s', history) expected = { '530-TYPESCRIPT.md': ( 'TypeScript **SHOULD** être préféré', 'TS-RS', 'ni Vite', ), '540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md': ( 'MUST NOT imposer npm', 'Lockfile', 'alpha.3', ), '550-VITE.md': ( 'Vite **SHOULD** être le build tool/dev server privilégié', 'Le profil s'applique uniquement lorsqu'un projet utilise réellement Vite.', 'alpha.4', ), '560-CSS_SASS.md': ( 'Sass **SHOULD** être préféré', 'Bootstrap constitue un exemple concret', '`@use` / `@forward`', '`@import` Sass est déprécié', 'alpha.5', ), } for name, phrases in expected.items(): text = Path('docs/rules', name).read_text(encoding='utf-8') for phrase in phrases: assert phrase in text, (name, phrase) rules = Path('RULES.md').read_text(encoding='utf-8') rules_index = Path('docs/rules/000-README.md').read_text(encoding='utf-8') architecture = Path('docs/architecture/003-RULE_PROFILE_MODEL.md').read_text(encoding='utf-8') tauri = Path('docs/rules/710-TAURI.md').read_text(encoding='utf-8') plan = Path('docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md').read_text(encoding='utf-8') roadmap = Path('ROADMAP.md').read_text(encoding='utf-8') for owner in ('530-TYPESCRIPT.md', '540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md', '550-VITE.md', '560-CSS_SASS.md'): assert owner in rules assert owner in rules_index for phrase in ( '530 — TypeScript', '540 — JavaScript package ecosystem', '550 — Vite', '560 — CSS / Sass', 'Un frontend minimal peut n'en sélectionner qu'une partie.', ): assert phrase in architecture, phrase for phrase in ( 'TypeScript et Vite sont fortement recommandés mais restent des `SHOULD`', 'Sass est également fortement recommandé', 'profils `530`, `550` et `560`', ): assert phrase in tauri, phrase for phrase in ( 'Décisions de revue après `alpha.1`', '**TypeScript** : fortement recommandé', '**Vite** : fortement recommandé', '**Sass** : fortement recommandé', '`@use` / `@forward`', '| TypeScript pour les frontends durables | `ADOPT` |', '| npm comme package manager concret | `KEEP-LOCAL` |', '| commandes/génération WASM dans les scripts | `DEFER` |', ): assert phrase in plan, phrase assert '0.1.8' not in roadmap assert 'skeleton Tauri avant owners Web suffisants' in roadmap print('0.1.1 alpha.2 ownership audit: clean (530/540/550/560 independent, SHOULD recommendations explicit, Games classified)') PYGATE git diff --check git add VERSION RULES.md docs/000-README.md docs/architecture/003-RULE_PROFILE_MODEL.md docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md docs/rules/000-README.md docs/rules/710-TAURI.md docs/rules/530-TYPESCRIPT.md docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md docs/rules/550-VITE.md docs/rules/560-CSS_SASS.md deltas/0.1.1/alpha.2.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history est : ```text M RULES.md M VERSION A deltas/0.1.1/alpha.2.md M docs/000-README.md M docs/architecture/003-RULE_PROFILE_MODEL.md M docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md M docs/rules/000-README.md A docs/rules/530-TYPESCRIPT.md A docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md A docs/rules/550-VITE.md A docs/rules/560-CSS_SASS.md M docs/rules/710-TAURI.md ``` La revue qualitative doit confirmer que : - `SHOULD` représente bien « fortement recommandé » et qu'aucun des profils `530`, `550`, `560` n'est activé universellement ; - TypeScript n'est pas rendu dépendant de Rust ou TS-RS ; - Vite est recommandé sans interdire un autre build tool ; - Sass est recommandé conditionnellement et CSS direct reste valide ; - Bootstrap reste un exemple/choix de skeleton, pas une dépendance universelle ; - npm et la politique Games des lockfiles restent non généralisés ; - WASM, serveur Rust et skeleton Tauri restent hors scope de la tranche. ## Transition ### PASS Produire `history/0.1.1/alpha.2.md`, puis préparer `0.1.1-alpha.3` consacré aux règles et artefacts TypeScript + écosystème de package : `tsconfig`, manifest, scripts utiles, sélection du package manager et politique du lockfile. ### FAIL Consigner le diagnostic réel dans `history/0.1.1/alpha.2.md` et rester dans `alpha.2.fix.N` sauf REPLAN justifié. Le fix MUST rester borné au défaut d'ownership ou de formulation observé.