Files
khadhroony-solana-project/deltas/0.1.2/pre.004-fix.002.md

3.3 KiB

Delta 0.1.2-pre.004-fix.002

Base requise

Livraison précédente :

0.1.2-pre.004-fix.001

La base porte :

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é :

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 :

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 :

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 :

file ESC[31moutput ESC[0m marker

devienne dans le fichier :

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 :

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 :

workspace.package.version = "0.1.2-pre.4.fix.2"

et l'en-tête du Cargo.toml racine devient :

# version: 33

Fichiers du delta

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

cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test --workspace

Si ces validations sont propres, la tranche suivante reste :

0.1.2-pre.005 — intégration + concurrence + saturation + audits