v0.1.3-pre.008
This commit is contained in:
268
deltas/0.1.3/pre.008.md
Normal file
268
deltas/0.1.3/pre.008.md
Normal file
@@ -0,0 +1,268 @@
|
||||
<!-- file: deltas/0.1.3/pre.008.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user