# Delta `0.2.13-pre.005` — hardening adversarial + consumer externe + complétude ## 1. Base requise Cette tranche s'applique exclusivement sur : ```text v0.2.12 + 0.2.13-pre.001 + 0.2.13-pre.002 + 0.2.13-pre.003 + 0.2.13-pre.004 ``` Le gate opérateur fourni pour `pre.004` est intégralement vert : ```text cargo fmt --all PASS python3 scripts/audit_rust_workspace_rules.py PASS python3 scripts/audit_markdown_tables.py ... PASS cargo check --workspace PASS cargo clippy --workspace --all-targets PASS cargo test -p ksp-interface-lib PASS cargo test --workspace PASS cargo tree -p ksp-interface-lib --edges normal inspecté cargo tree --duplicates inspecté ``` Le graphe ciblé reste strictement : ```text ksp-interface-lib └── ksp-core-lib └── solana-pubkey 4.3.0 ``` La version workspace passe de : ```text 0.2.13-pre.4 ``` à : ```text 0.2.13-pre.5 ``` ## 2. Objectif Fermer le hardening du premier lot wire générique sans ajouter de capacité fonctionnelle ni de second domaine wire. La tranche ajoute uniquement des preuves : ```text consumer externe crate-root inventaire exact de complétude release firewall source/manifest renforcé absence de narrowing/codec caché transfert sans réallocation des Vec admis absence de contenu hostile dans les erreurs de limite public API boundary canary ``` Aucun fichier `src/` de production n'est modifié. ## 3. Consumer externe `tests/external_consumer.rs` constitue le canari downstream. Comme tout integration test Rust, il est compilé comme un crate distinct de la bibliothèque et utilise exclusivement : ```text ksp_interface_lib::Pubkey ksp_interface_lib::ProgramAccountMeta ksp_interface_lib::ProgramInstruction ksp_interface_lib::MAX_PROGRAM_INSTRUCTION_ACCOUNTS ksp_interface_lib::MAX_PROGRAM_INSTRUCTION_DATA_LEN ksp_interface_lib::ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED ``` Aucun chemin vers un module privé n'est requis. ## 4. Complétude de release `tests/release_completeness.rs` verrouille exactement les six exports crate-root retenus pour `0.2.13` et refuse une façade `pub mod`. Il verrouille également l'inventaire des fichiers Rust de production : ```text error.rs lib.rs program_account_meta.rs program_instruction.rs ``` Ce canari rend explicite qu'un second lot wire, un codec générique, un runtime ou un nouveau domaine ne peut pas être ajouté silencieusement dans cette release. ## 5. Hardening adversarial Les unit tests de `ProgramInstruction` sont renforcés sur deux propriétés. Premièrement, les pointeurs des `Vec` et `Vec` sont capturés avant `try_new` puis comparés aux slices exposés après construction. Le canari prouve que l'implémentation courante transfère les allocations admises sans clone/réallocation interne. Deuxièmement, les deux branches d'erreur de limite sont confrontées à du matériel hostile : payload avec marqueur explicite et account meta arbitraire. Les rendus/contextes d'erreur doivent rester bornés aux champs sûrs déjà définis : ```text field actual_len maximum_len ``` Aucun payload ni account meta n'est recopié dans l'erreur. ## 6. Dependency/API firewall `tests/dependency_boundary.rs` conserve l'exigence manifeste : ```text ksp-core-lib = seule dépendance normale ``` et étend le scan à tous les fichiers Rust de production pour interdire les chemins directs vers : ```text Program/Store/Transport/Config/Wallet serde/serde_json borsh/bincode/wincode solana-instruction reqwest/tokio/tonic/tauri tracing/ksp-logging-lib ``` Un canari dédié refuse également les casts étroits et les points d'entrée génériques `serialize/deserialize/encode/decode` dans `program_instruction.rs`. ## 7. Public API `tests/public_api.rs` ajoute un test de rejet `10_241` bytes depuis un consumer externe au module privé et vérifie que le caller reçoit le code Core commun ainsi que les trois contextes sûrs attendus. Aucune nouvelle API publique n'est créée par `pre.005`. ## 8. Logging et codecs La décision reste inchangée : Interface est passive. Toujours absents : ```text ksp-logging-lib constants.rs TRACING_TARGET tracing direct serde borsh bincode wincode solana-instruction ``` ## 9. Fichiers ajoutés ```text crates/ksp-interface-lib/tests/external_consumer.rs crates/ksp-interface-lib/tests/release_completeness.rs deltas/0.2.13/pre.005.md ``` ## 10. Fichiers modifiés ```text Cargo.toml crates/ksp-interface-lib/tests/dependency_boundary.rs crates/ksp-interface-lib/tests/public_api.rs crates/ksp-interface-lib/unit_tests/program_instruction.rs docs/plans/020-V0_2_13_INTERFACE_PLAN.md docs/validation/016-V0_2_13_INTERFACE.md ``` ## 11. Fichiers volontairement inchangés ```text README.md ROADMAP.md CHANGELOG.md .env.example crates/ksp-interface-lib/Cargo.toml crates/ksp-interface-lib/README.md crates/ksp-interface-lib/USAGE.md crates/ksp-interface-lib/src/** crates/ksp-interface-lib/unit_tests/program_account_meta.rs docs/architecture/** prompts/** config/** ``` ## 12. Gate attendu Après application de l'overlay : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.13 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-interface-lib cargo test --workspace cargo tree -p ksp-interface-lib --edges normal cargo tree --duplicates ``` Si ce gate est vert, `pre.006` doit rester un gate technique final sans nouveau développement fonctionnel.