# Delta `0.2.14-pre.005` — adversarial/API hardening + completeness ## 1. Base requise Cette tranche s'applique exclusivement sur : ```text v0.2.13 + 0.2.14-pre.001 + 0.2.14-pre.002 + 0.2.14-pre.003 + 0.2.14-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 — 172 tables / 121 fichiers cargo check --workspace PASS cargo clippy --workspace --all-targets PASS cargo test -p ksp-program-api PASS — 11 tests Rust cargo test --workspace PASS cargo tree -p ksp-program-api --edges normal PASS — Core + Interface uniquement cargo tree --duplicates exécuté ``` La version workspace passe de : ```text 0.2.14-pre.4 ``` à : ```text 0.2.14-pre.5 ``` Commit attendu : ```text v0.2.14-pre.005 ``` ## 2. Objectif Fermer la surface Program API déjà matérialisée sans ajouter de contrat fonctionnel : ```text bounds et sécurité Debug/error inventaire exact des exports publics inventaire exact des modules de production absence de closed-world Program enum absence de registry/descriptors/preparer/payload D3 absence de serde/codec/logging/runtime associated output sans bound implicite ``` ## 3. Release completeness Le nouveau `tests/release_completeness.rs` verrouille : ```text 10 réexports crate-root exacts aucun pub mod 3 fichiers Rust de production exacts 2 enums publics exacts, tous deux non_exhaustive 1 trait public exact : ProgramInstructionDecoder aucun ProgramKind / registry / autre famille decoder / preparer aucun Any / serde / codec / logging / réseau / IO runtime aucun dyn ProgramInstructionDecoder ou registry hétérogène anticipé ``` La surface publique reste donc ouverte par `Pubkey` et associated output, pas par un inventaire central fermé. ## 4. Hardening adversarial Le nouveau `tests/security_hardening.rs` couvre trois propriétés. ### Input Interface maximal Une instruction au maximum déjà admis par Interface : ```text 255 account metas 10 240 bytes de data ``` traverse `ProgramInstructionDecoder::decode` par référence et le decoder observe les tailles exactes. Program API n'introduit aucun second bound ni nouveau type d'input. ### Payload hostile et erreur Core Un decoder de test reçoit un payload contenant un marqueur hostile puis retourne un `ksp_program_api::Error` sûr. Le contrat Program API ne copie automatiquement ni l'instruction ni ses bytes dans l'erreur, son `Display` ou son `Debug`. L'hygiène des messages/contextes qu'une implémentation tierce construit volontairement reste la responsabilité de cette implémentation ; Program API n'ajoute aucun canal `Failed` parallèle susceptible de dupliquer le payload. ### Associated output sans bound implicite Un second decoder de test utilise un output contenant `Rc>`. Ce type n'implémente donc pas `Send`/`Sync` et aucun `Debug`/`Clone` n'est dérivé. La compilation prouve que `type Decoded` reste sans bound implicite ; le `Debug` de l'outcome demeure `Decoded` sans rendre la valeur. ## 5. Dependency/runtime firewall Le manifest de production reste inchangé : ```text ksp-core-lib ksp-interface-lib ``` Les canaris refusent toujours : ```text ksp-program-lib ksp-logging-lib Config / Transport / Wallet / Store / Materializer serde / serde_json / Any borsh / bincode / wincode reqwest / tokio / tonic / tauri / tracing std::env / std::fs / std::net dans la production Program API ``` ## 6. Fichiers ajoutés ```text crates/ksp-program-api/tests/release_completeness.rs crates/ksp-program-api/tests/security_hardening.rs deltas/0.2.14/pre.005.md ``` ## 7. Fichiers modifiés ```text Cargo.toml docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md docs/validation/017-V0_2_14_PROGRAM_API.md ``` ## 8. Fichiers volontairement inchangés ```text crates/ksp-program-api/Cargo.toml crates/ksp-program-api/src/** crates/ksp-program-api/README.md crates/ksp-program-api/USAGE.md crates/ksp-program-api/tests/dependency_boundary.rs crates/ksp-program-api/tests/external_implementation.rs crates/ksp-program-api/tests/public_api.rs README.md RULES.md ROADMAP.md CHANGELOG.md docs/architecture/** docs/rules/** crates/ksp-core-lib/** crates/ksp-interface-lib/** crates/ksp-logging-lib/** crates/ksp-*-transport-lib/** crates/ksp-config-lib/** crates/ksp-wallet-lib/** crates/ksp-app-*/** prompts/** ``` ## 9. Scope négatif maintenu Cette tranche n'introduit pas : ```text nouveau type ou trait de production runtime decoder registry Vec> object-safety heterogeneous promise identity/version/coverage descriptor priority/conflict policy ProgramAccountDecoder / Event / ReturnData payload canonique D3 serde / JSON / Any proof/confidence contextuels ProgramExecutionPreparer ExecutionPolicy / Execution ``` ## 10. Gate opérateur attendu Après application : ```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.14 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-program-api cargo test --workspace cargo tree -p ksp-program-api --edges normal cargo tree --duplicates ``` Le graphe normal doit rester : ```text ksp-program-api ├── ksp-core-lib └── ksp-interface-lib └── ksp-core-lib ``` Une correction découverte par ce gate reste un `0.2.14-pre.005-fix.NNN` et n'avance pas `pre.006`. ## 11. Suite Après gate vert, `pre.006` est un **gate technique final sans développement fonctionnel**. Il ne doit ajouter ni contrat, ni decoder officiel, ni registry, ni preparer.