8.1 KiB
Delta 0.1.3-pre.011
Base requise
Livraison précédente validée :
0.1.3-pre.010-fix.001
Version technique de cette base :
workspace.package.version = "0.1.3-pre.10.fix.1"
Cargo.toml header version = 53
Validations utilisateur exécutées le 2026-08-15 :
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 -d OK, doublon transitif syn 2/3 déjà connu
cargo tree -p ksp-config-lib -e features OK
cargo test --workspace confirme notamment 53 tests unitaires + 8 tests publics pour ksp-config-lib.
Objet de pre.011
Ajouter la couche de sécurité/provenance qui manquait au resolver environnemental :
Config source string / JSON
+
process > .env > fallback
->
real runtime value
safe diagnostic value
Public | Internal | Secret
ordered / JSON-Pointer provenance
Cette tranche ne modifie pas encore les documents Config, ne construit pas LoggingSettings et ne persiste rien.
Classification de sensibilité
ConfigSensitivity expose :
Public
Internal
Secret
Classification nominale :
KSP_SECRET_* / KSPB_SECRET_* -> Secret
KSP_PUBLIC_* / KSPB_PUBLIC_* -> Public
autre KSP_* / KSPB_* -> Internal
Ordre :
Secret > Internal > Public
La sensibilité d'une chaîne contenant des placeholders est la sensibilité la plus forte des placeholders effectivement référencés. Une chaîne littérale sans placeholder est Internal.
Un fallback hérite toujours de la sensibilité du nom de variable référencé. Ainsi :
${KSP_SECRET_TOKEN:-false-secret}
reste Secret même si la valeur réelle vient du fallback.
Valeur réelle et représentation sûre
ConfigEnvironmentValue conserve désormais :
variable_name
value réel runtime
safe_value diagnostic sûr
sensitivity
source Process | DotEnv | Fallback
provenance
Pour Secret :
value = valeur réelle
safe_value = ********
Pour Public et Internal, la représentation sûre conserve la valeur réelle dans cette tranche.
ConfigEnvironmentValue possède un Debug manuel qui n'affiche jamais value; il affiche safe_value, sensibilité, source et nom de variable.
Chaînes composées
Nouveau contrat :
ResolvedConfigText
Il conserve :
value
safe_value
sensitivity
provenance[]
Exemple :
source:
https://${KSP_PUBLIC_HOST}/?token=${KSP_SECRET_TOKEN}
real:
https://rpc.example.test/?token=secret-canary
safe:
https://rpc.example.test/?token=********
La redaction est réalisée par segment de substitution. Les fragments littéraux et non secrets restent visibles dans la représentation sûre.
ConfigEnvironment::resolve_text_detailed() expose ce contrat.
L'API existante :
resolve_text(...)
reste compatible et retourne uniquement la valeur réelle.
Provenance
ConfigValueProvenance distingue :
DocumentLiteral
EnvironmentProcess { variable_name }
EnvironmentDotEnv { variable_name }
EnvironmentFallback { variable_name }
La provenance n'embarque jamais la valeur d'environnement elle-même.
Une chaîne composée conserve l'ordre des segments/références ayant participé à sa construction.
JSON détaillé
Nouveau contrat :
ResolvedConfigJson
Il conserve :
value arbre JSON réel
safe_value arbre JSON redacted
sensitivity plus forte sensibilité contenue
provenance map JSON Pointer -> provenance[]
ConfigEnvironment::resolve_json_detailed() parcourt récursivement objets et tableaux sans modifier les clés.
Les JSON Pointer suivent RFC 6901 pour les clés contenant ~ ou /.
L'API existante :
resolve_json(...)
resolve_map(...)
reste compatible et retourne uniquement la valeur réelle.
Profil effectif
ResolvedConfigProfile ajoute :
resolve_effective_environment_detailed(...)
La provenance top-level déjà existante :
Global
Profile
reste attachée au profil source via origin(key).
La résolution détaillée ajoute séparément la provenance de la couche environnement :
DocumentLiteral
Process
DotEnv
Fallback
L'ancienne méthode resolve_effective_environment() reste disponible et retourne seulement la map réelle.
Non-divulgation
Les tests canary vérifient notamment :
- secret venant du process : réel disponible, safe redacted,
Debugsans canary ; - secret venant d'un fallback : fallback réel disponible mais safe redacted ;
- URL composée public + secret : seul le segment secret est masqué ;
- JSON imbriqué : arbre réel complet, arbre safe redacted,
Debugsans canary ; - provenance de la variable sans transport de la valeur elle-même.
ksp-logging-lib ne reçoit aucune logique générique de redaction de messages arbitraires. La valeur sûre est construite par Config avant qu'un diagnostic ne l'utilise.
Clarification KSP_LOGS_DIRECTORY
La décision préparatoire de l'adapter pre.012 est enregistrée dans le plan :
- après interpolation,
logs_directorypourra être absolu ou relatif ; - un chemin relatif sera interprété relativement au current working directory du processus qui initialise Logging, pas automatiquement au répertoire du binaire ;
- le fallback
logss'applique seulement siKSP_LOGS_DIRECTORYest absent ; - une valeur explicitement présente mais invalide ne déclenche pas le fallback et devra produire un diagnostic de configuration effective invalide ;
- les paths de sinks restent relatifs sous
logs_directorysans traversal.
Aucun code de validation/conversion Logging correspondant n'est ajouté dans pre.011; cette responsabilité appartient à pre.012.
.env.example
Aucune nouvelle variable runtime n'est introduite.
.env.example reste donc inchangé et contient toujours la seule variable actuellement utilisée :
KSP_LOGS_DIRECTORY=logs
Dépendances
Aucune dépendance ou feature Cargo n'est ajoutée/modifiée.
La direction reste :
ksp-config-lib -> ksp-logging-lib -> ksp-core-lib
ksp-config-lib -> ksp-core-lib
Logging ne dépend toujours pas de Config.
Version technique
La prerelease devient :
workspace.package.version = "0.1.3-pre.11"
Cargo.toml header version = 54
Fichiers ajoutés
crates/ksp-config-lib/src/sensitivity.rs
crates/ksp-config-lib/unit_tests/sensitivity.rs
deltas/0.1.3/pre.011.md
Fichiers modifiés
Cargo.toml
crates/ksp-config-lib/src/environment.rs
crates/ksp-config-lib/src/lib.rs
crates/ksp-config-lib/src/profile.rs
crates/ksp-config-lib/tests/public_api.rs
crates/ksp-config-lib/unit_tests/environment.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/RULES_KSP.md
Fichiers supprimés
Aucun.
Contrôles exécutés dans l'environnement de génération
- comparaison statique avec la base validée
pre.010-fix.001; - absence de nouvelle dépendance/feature Cargo ;
- absence de nouvelle variable runtime nécessitant une modification de
.env.example; - audit statique du nouveau code Config contre
unsafe,unwrap,expect,panic!et opérateur?de production ; - contrôle des headers/version ;
- contrôle des lignes Rust à 160 colonnes maximum ;
- contrôle canary dans les tests : les représentations safe/Debug attendues ne contiennent pas le secret ;
- reproduction du delta sur la base précédente avant packaging.
Le toolchain Rust n'est pas disponible dans l'environnement de génération. cargo fmt/check/clippy/test doivent donc être exécutés par l'utilisateur.
Étape suivante
Après validation utilisateur :
0.1.3-pre.012 — adapter Config -> Logging
Cette tranche devra notamment valider/résoudre logs_directory, convertir le profil Logging effectif vers les contrats publics ksp_logging_lib::* et démontrer initialize/reinitialize sans créer de dépendance Logging -> Config.