v0.2.13-pre.002

This commit is contained in:
2026-08-28 04:31:32 +02:00
parent 9148920f42
commit 99477d0d2b
10 changed files with 434 additions and 23 deletions

View File

@@ -0,0 +1,14 @@
# file: crates/ksp-interface-lib/Cargo.toml
# version: 1
[package]
name = "ksp-interface-lib"
version.workspace = true
edition.workspace = true
repository.workspace = true
[dependencies]
ksp-core-lib = { path = "../ksp-core-lib" }
[lints]
workspace = true

View File

@@ -0,0 +1,32 @@
<!-- file: crates/ksp-interface-lib/README.md -->
<!-- version: 1 -->
# ksp-interface-lib
`ksp-interface-lib` est la façade KSP destinée aux contrats wire passifs des programmes Solana. Elle est conçue pour être consommée par les implémentations Program officielles ou externes sans absorber Transport, Wallet, Store, Config ni le comportement métier Program.
## Ownership
La crate réutilise les primitives fondamentales déjà possédées par `ksp-core-lib`, notamment `Pubkey`. Les Program IDs fondamentaux restent également dans Core. Interface possédera progressivement les layouts, discriminants, codecs et constructeurs wire uniquement lorsqu'un protocole réel les exige.
La foundation ne dépend pas de runtime réseau ou applicatif. Elle n'ajoute donc pas de logging runtime, de scheduler, de persistence ou de configuration.
## Surface initiale
La façade crate-root expose actuellement le `Pubkey` canonique de Core. Les contrats passifs d'instruction et d'account meta sont introduits séparément afin de fermer leurs bornes et leur surface publique avant les premières APIs Program.
## Frontières
`ksp-interface-lib` ne possède pas :
```text
RPC / WebSocket / gRPC
wallet / signature
persistence / Store
Config / environnement
interprétation métier Program
execution policy
lifecycle réseau
```
La conception détaillée de la foundation est suivie dans [`../../docs/plans/020-V0_2_13_INTERFACE_PLAN.md`](../../docs/plans/020-V0_2_13_INTERFACE_PLAN.md) et sa validation dans [`../../docs/validation/016-V0_2_13_INTERFACE.md`](../../docs/validation/016-V0_2_13_INTERFACE.md).

View File

@@ -0,0 +1,24 @@
<!-- file: crates/ksp-interface-lib/USAGE.md -->
<!-- version: 1 -->
# Usage de ksp-interface-lib
Cette page décrit la surface publique actuellement matérialisée par la foundation Interface. Les APIs d'instruction sont ajoutées progressivement sans exposer les modules internes.
## Utiliser le Pubkey canonique
Interface réexporte le `Pubkey` possédé par Core afin que les futurs contrats wire puissent partager la même primitive sans wrapper parallèle :
```rust
let program_id = ksp_interface_lib::Pubkey::default();
let bytes = program_id.to_bytes();
assert_eq!(bytes.len(), 32);
```
Un consumer ne doit pas reconstruire une identité Program textuelle propre à Interface. Les Program IDs fondamentaux restent possédés et répertoriés par `ksp-core-lib`.
## Surface volontairement absente
La foundation initiale n'expose encore aucun constructeur d'instruction fonctionnel. Elle ne fournit pas non plus de codec générique Borsh/Wincode, de sérialisation Serde, de transport ou de comportement Program. Ces surfaces sont ajoutées uniquement lorsque leur contrat réel est matérialisé et borné.
Aucun runtime logging n'est nécessaire pour les contrats passifs actuels ; une future instrumentation comportementale devrait passer par `ksp-logging-lib` selon les règles KSP au lieu d'introduire `tracing` directement.

View File

@@ -0,0 +1,16 @@
// file: crates/ksp-interface-lib/src/lib.rs
// version: 1
#![warn(missing_docs)]
#![deny(unreachable_pub)]
#![forbid(unsafe_code)]
//! Passive wire contracts shared by KSP Program implementations.
//!
//! The foundation deliberately starts with the canonical Solana [`Pubkey`]
//! owned by `ksp-core-lib`. Program-facing instruction contracts are added in
//! later slices without introducing runtime, transport, persistence or Program
//! behavior into Interface.
/// Canonical Solana account address primitive owned by `ksp-core-lib`.
pub use ksp_core_lib::Pubkey;

View File

@@ -0,0 +1,79 @@
// file: crates/ksp-interface-lib/tests/dependency_boundary.rs
// version: 1
//! Dependency and passive-surface canaries for the Interface scaffold.
#[test]
fn pre_002_manifest_has_exact_core_only_runtime_dependency() {
let manifest = include_str!("../Cargo.toml");
let dependencies_tail = manifest.split("[dependencies]").nth(1);
assert!(dependencies_tail.is_some(), "Interface dependencies section must exist");
let dependencies_tail = match dependencies_tail {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
let dependencies = match dependencies_tail.split("[lints]").next() {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
assert_eq!(manifest_dependency_names(dependencies), std::vec!["ksp-core-lib"]);
for forbidden in [
"ksp-config-lib",
"ksp-logging-lib",
"ksp-offchain-transport-lib",
"ksp-onchain-transport-lib",
"ksp-program-api",
"ksp-program-lib",
"ksp-store-api",
"ksp-store-lib",
"ksp-wallet-lib",
"borsh",
"bincode",
"reqwest",
"serde",
"serde_json",
"solana-instruction",
"tauri",
"tokio",
"tonic",
"tracing",
"wincode",
] {
assert!(!dependencies.contains(forbidden), "forbidden Interface dependency detected: {forbidden}");
}
return;
}
#[test]
fn pre_002_scaffold_remains_passive_without_runtime_logging_surface() {
let crate_root = include_str!("../src/lib.rs");
assert!(crate_root.contains("pub use ksp_core_lib::Pubkey;"));
assert!(!crate_root.contains("ProgramAccountMeta"));
assert!(!crate_root.contains("ProgramInstruction"));
assert!(!crate_root.contains("TRACING_TARGET"));
assert!(!crate_root.contains("ksp_logging_lib"));
assert!(!std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src/constants.rs").exists());
return;
}
fn manifest_dependency_names(section: &str) -> std::vec::Vec<&str> {
let mut names = std::vec::Vec::new();
for line in section.lines() {
let content = match line.split('#').next() {
std::option::Option::Some(value) => value.trim(),
std::option::Option::None => continue,
};
if content.is_empty() {
continue;
}
let name = match content.split('=').next() {
std::option::Option::Some(value) => value.trim().trim_end_matches(".workspace"),
std::option::Option::None => continue,
};
if !name.is_empty() {
names.push(name);
}
}
names.sort_unstable();
return names;
}

View File

@@ -0,0 +1,15 @@
// file: crates/ksp-interface-lib/tests/public_api.rs
// version: 1
//! Integration canaries for the public `ksp-interface-lib` scaffold.
fn consume_pubkey(pubkey: ksp_interface_lib::Pubkey) -> [u8; 32] {
return pubkey.to_bytes();
}
#[test]
fn public_pre_002_pubkey_contract_is_available_from_crate_root() {
let pubkey = ksp_interface_lib::Pubkey::default();
assert_eq!(consume_pubkey(pubkey), [0_u8; 32]);
return;
}