# Delta 0.1.3-pre.008 ## Base requise Livraison précédente validée : ```text 0.1.3-pre.007 ``` Version technique de cette base : ```text workspace.package.version = "0.1.3-pre.7" Cargo.toml header version = 48 ``` Validations utilisateur exécutées le 2026-08-15 : ```text cargo fmt --all OK cargo check --workspace OK cargo clippy --workspace --all-targets OK cargo test --workspace OK cargo tree -p ksp-config-lib OK cargo tree -p ksp-config-lib -e features OK ``` `cargo tree -p ksp-config-lib -d` ne signale qu'une coexistence transitive `syn 2.0.119` / `syn 3.0.3`, portée par l'écosystème `jsonschema`/ICU/proc-macros. Le graphe observé ne contient pas de stack HTTP/TLS de résolution distante avec `jsonschema default-features = false`; aucun changement de dépendance n'est donc justifié dans cette tranche. ## Objet de pre.008 Fermer la résolution des paramètres globaux, profils et `default_profile` avant d'introduire les composites : ```text validated standard document -> validate profile identities/default_profile -> select default or explicit profile -> retain globals -> retain selected profile -> build effective top-level view -> preserve Global/Profile provenance ``` Cette tranche reste générique : le moteur de profils n'est pas un type Logging. `std.logging.json` est uniquement le premier document standard qui l'exerce. ## Contrat générique des profils Un document standard profilé possède deux clés structurelles réservées : ```text default_profile profiles ``` Toutes les autres propriétés top-level sont considérées comme des paramètres globaux du document. Garanties désormais validées après JSON Schema : - `profiles` contient au moins un objet ; - chaque profil possède un `profile_id` non vide ; - les `profile_id` sont uniques dans le document ; - `default_profile` est autonome au niveau global ; - `default_profile` référence obligatoirement un `profile_id` existant. Un document qui viole ces invariants retourne : ```text config.document_semantic_invalid ``` ## Résolution publique `ConfigDocumentEngine` expose maintenant : ```text load_resolved_profile(file_id, None) -> sélectionne default_profile load_resolved_profile(file_id, Some(profile_id)) -> sélection explicite ``` Un profil explicitement demandé mais absent retourne un diagnostic distinct : ```text config.profile_not_found ``` Cette erreur ne signifie pas que le document source est invalide : le document peut être parfaitement valide tout en ne contenant pas le profil demandé par le caller. ## `ResolvedConfigProfile` La nouvelle surface publique conserve : ```text file_id source path profile_id sélectionné selection_source = DefaultProfile | Explicit globals profile effective origin(key) = Global | Profile ``` `globals` exclut volontairement : ```text default_profile profiles ``` `profile` conserve l'objet du profil sélectionné, y compris son `profile_id`. `effective` est une vue top-level déterministe : 1. insertion des globals ; 2. insertion des propriétés du profil sélectionné. Si un futur schema permet une même clé aux deux niveaux, la valeur du profil est prioritaire et sa provenance devient `Profile`. Les schemas spécialisés restent libres d'interdire ce cas lorsqu'une propriété doit rester strictement globale. La provenance documentaire commune reste disponible par : ```text file_id path ``` et la provenance de chaque valeur top-level par : ```text ConfigValueOrigin::Global ConfigValueOrigin::Profile ``` Les futures couches composite/env/sensibilité devront enrichir cette provenance sans la perdre. ## `std.logging.json` Le fichier runtime et son schema ne nécessitent aucun changement dans cette tranche. Le document commité : ```text default_profile = local_dev ``` résout maintenant réellement le profil `local_dev`. Exemples de provenance : ```text logs_directory -> Global default_filter -> Profile ``` Le placeholder : ```text ${KSP_LOGS_DIRECTORY:-logs} ``` reste non interprété en `pre.008`; il sera résolu par la tranche environnement prévue plus tard. ## Tests Les tests ajoutés couvrent : - résolution du `default_profile` commité ; - sélection explicite d'un profil existant ; - distinction `DefaultProfile` / `Explicit` ; - conservation séparée des globals et du profil ; - construction de la vue effective ; - provenance `Global` / `Profile` ; - profil explicite inconnu -> `config.profile_not_found` ; - `profile_id` dupliqués -> document sémantiquement invalide ; - `default_profile` ne référençant aucun profil -> document sémantiquement invalide ; - consommation de la nouvelle surface depuis le crate-root dans le test d'intégration public. ## Hors scope Cette tranche n'introduit pas encore : - document composite ; - `schema.composite` ; - override de profil depuis un composite ; - `.env` ; - lecture `std::env` applicative ; - interpolation `${...}` ; - `Public/Internal/Secret` ; - redaction ; - adaptation vers `ksp_logging_lib::LoggingSettings` ; - mutation/persistence. ## Dépendances Aucune dépendance externe ou feature Cargo supplémentaire n'est ajoutée. `ksp-config-lib` ne dépend toujours pas de `ksp-logging-lib` dans cette tranche. ## Version technique La prerelease devient : ```text workspace.package.version = "0.1.3-pre.8" Cargo.toml header version = 49 ``` ## Fichiers ajoutés ```text crates/ksp-config-lib/src/profile.rs crates/ksp-config-lib/unit_tests/profile.rs deltas/0.1.3/pre.008.md ``` ## Fichiers modifiés ```text Cargo.toml crates/ksp-config-lib/src/document.rs crates/ksp-config-lib/src/error.rs crates/ksp-config-lib/src/lib.rs crates/ksp-config-lib/tests/public_api.rs crates/ksp-config-lib/unit_tests/document.rs docs/plans/000-README.md docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md docs/plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md docs/rules/FILE_CONTRACTS.md ``` ## Fichiers supprimés Aucun. ## Contrôles exécutés dans l'environnement de génération - comparaison du delta avec la base `pre.007` ; - contrôle des headers/version modifiés ; - contrôle de l'absence de nouvelle dépendance Cargo ; - contrôle statique des interdictions `unsafe`, `unwrap`, `expect`, opérateur `?` dans les nouveaux sources de production ; - contrôle de la composition exacte de l'archive delta ; - réapplication du delta sur une copie de `pre.007` pour vérifier la reproduction de l'arbre livré. `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement de génération. Aucune validation Rust n'est déclarée réussie ici. ## Validations utilisateur à exécuter ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets cargo test --workspace cargo tree -p ksp-config-lib cargo tree -p ksp-config-lib -d cargo tree -p ksp-config-lib -e features ``` Après validation de `pre.008`, la prochaine tranche planifiée est : ```text 0.1.3-pre.009 — compositions génériques par file_id ```