# Delta `0.2.13-pre.002` — scaffold `ksp-interface-lib` ## 1. Base requise Cette tranche s'applique exclusivement sur : ```text v0.2.12 + 0.2.13-pre.001 ``` Le gate opérateur fourni pour `pre.001` est intégralement vert : `cargo fmt --all`, audits Rust/Markdown, `cargo check --workspace`, Clippy workspace et `cargo test --workspace` passent. La version workspace passe de : ```text 0.2.13-pre.1 ``` à : ```text 0.2.13-pre.2 ``` ## 2. Objectif Créer uniquement le scaffold de `ksp-interface-lib` et verrouiller sa frontière avant les types wire fonctionnels. La tranche matérialise : ```text nouveau membre workspace ksp-interface-lib manifest avec ksp-core-lib comme seule dépendance normale façade crate-root explicite réexport contrôlé de ksp_core_lib::Pubkey README/USAGE initiaux canari public API minimal canari dependency firewall ``` Elle ne matérialise pas encore : ```text ProgramAccountMeta ProgramInstruction bornes instruction codes d'erreur Interface serde / serde_json borsh / bincode / wincode solana-instruction network/runtime Program behavior ``` ## 3. Décision Logging `0.2.13` reste une foundation de contrats passifs. Aucun comportement runtime n'est actuellement prévu dans `ksp-interface-lib`, donc aucun événement/span n'a besoin d'être émis. En conséquence, la tranche maintient explicitement absents : ```text ksp-logging-lib src/constants.rs TRACING_TARGET tracing direct ``` Cette absence est volontaire et couverte par le canari de dépendances. Si un comportement runtime réel apparaît dans une future évolution d'Interface, l'instrumentation devra être ajoutée via `ksp-logging-lib`; `DEP-LOG-010` imposera alors un `pub(crate) const TRACING_TARGET: &str` possédé par `src/constants.rs`. Les futures validations de bornes de `pre.003`/`pre.004` doivent retourner des erreurs structurées ; elles ne justifient pas à elles seules des logs runtime. ## 4. Surface publique de scaffold La seule primitive publique nouvellement exposée est : ```rust pub use ksp_core_lib::Pubkey; ``` Ce réexport confirme l'ownership décidé : Interface n'introduit aucun wrapper `ProgramId`/`Pubkey` parallèle et utilisera la primitive Core dans ses futurs contrats wire. La façade ne contient aucun `pub mod`. Les types d'instruction restent absents pour éviter d'avancer `pre.003`/`pre.004`. ## 5. Dependency firewall Le manifest membre possède exactement : ```text [dependencies] ksp-core-lib = { path = "../ksp-core-lib" } ``` Le canari `tests/dependency_boundary.rs` vérifie notamment l'absence de : ```text ksp-logging-lib ksp-program-* ksp-*-transport-lib ksp-config-lib ksp-store-* ksp-wallet-lib serde / serde_json borsh / bincode / wincode solana-instruction reqwest / tokio / tonic / tauri / tracing ``` Il verrouille aussi l'absence de `src/constants.rs` et `TRACING_TARGET` tant que la crate reste passive. ## 6. Tests ajoutés `tests/public_api.rs` vérifie que le `Pubkey` canonique est consommable uniquement depuis le crate-root Interface. `tests/dependency_boundary.rs` vérifie : ```text dépendance normale exacte = ksp-core-lib absence des dépendances interdites absence de ProgramAccountMeta/ProgramInstruction en pre.002 absence de surface Logging runtime ``` Aucun unit test métier n'est ajouté : aucune primitive fonctionnelle n'existe encore. ## 7. Fichiers ajoutés ```text crates/ksp-interface-lib/Cargo.toml crates/ksp-interface-lib/README.md crates/ksp-interface-lib/USAGE.md crates/ksp-interface-lib/src/lib.rs crates/ksp-interface-lib/tests/dependency_boundary.rs crates/ksp-interface-lib/tests/public_api.rs deltas/0.2.13/pre.002.md ``` ## 8. Fichiers modifiés ```text Cargo.toml docs/plans/020-V0_2_13_INTERFACE_PLAN.md docs/validation/016-V0_2_13_INTERFACE.md ``` ## 9. Fichiers volontairement inchangés ```text README.md ROADMAP.md CHANGELOG.md .env.example docs/architecture/** docs/rules/** crates/ksp-core-lib/** crates/ksp-logging-lib/** crates/ksp-onchain-transport-lib/** crates/ksp-offchain-transport-lib/** crates/ksp-config-lib/** crates/ksp-wallet-lib/** crates/ksp-app-*/** prompts/** ``` Aucune architecture durable n'est rouverte : le graphe `Interface -> Core`, avec Logging uniquement lorsqu'un runtime logging réel existe, est déjà documenté. ## 10. Validations de génération Les audits Python sont rejoués sur l'arbre matérialisé avant livraison. Le sandbox de génération ne fournit pas `cargo`, `rustc` ou `rustfmt`; aucun PASS Cargo nouveau n'est donc revendiqué localement. ## 11. 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.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 ``` Le `cargo tree -p ksp-interface-lib --edges normal` doit montrer Core comme unique dépendance KSP directe et ne doit pas révéler de codec/runtime ajouté par Interface. Une correction découverte par ce gate reste un `0.2.13-pre.002-fix.NNN` et n'avance pas `pre.003`. ## 12. Suite Après gate vert, `pre.003` pourra matérialiser uniquement : ```text ProgramAccountMeta constante de borne account metas modèle d'erreur Interface minimal nécessaire unit/public canaries correspondants ``` `ProgramInstruction`, sa data bound et son Debug résumé restent réservés à `pre.004`.