# Delta 0.1.2-pre.004-fix.002 ## Base requise Livraison précédente : ```text 0.1.2-pre.004-fix.001 ``` La base porte : ```text workspace.package.version = "0.1.2-pre.4.fix.1" Cargo.toml header version = 32 ``` ## Validation remontée Après application de `pre.004-fix.001`, un rebuild propre a donné : ```text cargo clean OK cargo fmt --all OK cargo check --workspace OK cargo clippy --workspace --all-targets OK cargo test --workspace ECHEC ``` Tous les tests sauf le test runtime global passent encore. L'échec reste strictement identique : ```text assertion failed: file_text.contains("file output marker") ``` La reproduction après `cargo clean` invalide donc l'hypothèse selon laquelle cet échec précis provenait de l'ordre de destruction corrigé par `pre.004-fix.001`. Ce lifecycle explicite est néanmoins conservé. ## Cause réelle `tracing-subscriber 0.3.23` active par défaut la sanitization ANSI des valeurs dans `fmt::Layer`. Cette protection intervient pendant le formatage, donc avant l'appel au `MakeWriter`. Le sink fichier KSP était composé comme suit : ```text value containing ESC -> fmt::Layer ANSI sanitization -> NonBlocking -> StripAnsiWriter -> RollingFileAppender ``` Le `StripAnsiWriter` KSP ne recevait donc plus les octets ESC originaux à supprimer. Le test attend volontairement que : ```text file ESC[31moutput ESC[0m marker ``` devienne dans le fichier : ```text file output marker ``` La sanitization native et le stripping KSP sont deux politiques différentes : KSP veut supprimer les contrôles du fichier, pas les transformer avant son propre writer. ## Correction Le runtime distingue désormais la politique du formatter selon le sink : ```text console fmt::Layer.with_ansi(false) fmt::Layer.with_ansi_sanitization(true) -> NonBlocking console file fmt::Layer.with_ansi(false) fmt::Layer.with_ansi_sanitization(false) -> NonBlocking -> StripAnsiWriter -> RollingFileAppender ``` La console conserve donc la protection native de `tracing-subscriber`. Le fichier laisse passer jusqu'au worker les séquences présentes dans les valeurs afin que `StripAnsiWriter` les supprime avant persistence. Le stripping reste hors du hot path : il est toujours exécuté derrière la queue non bloquante. Le test d'intégration runtime reste inchangé. Il continue à vérifier : - l'émission fichier après hot reload ; - le retrait immédiat du sink et son drain ; - la présence du target et du callsite ; - l'absence de séquences ANSI ; - le silence des targets externes. ## Version technique Ce correctif modifie du Rust. La version workspace devient : ```text workspace.package.version = "0.1.2-pre.4.fix.2" ``` et l'en-tête du `Cargo.toml` racine devient : ```text # version: 33 ``` ## Fichiers du delta ```text Cargo.toml crates/ksp-logging-lib/src/runtime.rs docs/plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md deltas/0.1.2/pre.004-fix.002.md ``` ## Validations à exécuter ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets cargo test --workspace ``` Si ces validations sont propres, la tranche suivante reste : ```text 0.1.2-pre.005 — intégration + concurrence + saturation + audits ```