Files
khadhroony-solana-project/deltas/0.2.13/pre.005.md
2026-08-28 05:24:26 +02:00

214 lines
5.7 KiB
Markdown

<!-- file: deltas/0.2.13/pre.005.md -->
<!-- version: 1 -->
# 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<ProgramAccountMeta>` et `Vec<u8>` 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.