19 KiB
Validation 0.2.13 — Interface / wire foundation
1. Objet
Cette matrice est ouverte par 0.2.13-pre.001. Elle suit la première surface de ksp-interface-lib et enregistre les critères de fermeture sans transformer Interface en Program API ou en modèle RAW/CORE générique.
Scope retenu :
ProgramAccountMeta
ProgramInstruction
Pubkey via ksp-core-lib
bornes comptes/data
aucun codec générique
aucun comportement Program
2. Baseline stable
| Contrat | Attendu | Statut pre.001 |
|---|---|---|
| archive | khadhroony-solana-project-v0.2.12.zip stable |
PASS marqueurs internes |
| workspace version entrée | 0.2.12 |
PASS |
deltas/0.2.12/rel.001.md |
présent | PASS |
| prompt 018 | présent | PASS |
.git |
optionnel archive | ABSENT — tag non revérifiable localement |
ksp-interface-lib entrée |
absent | PASS |
ksp-program-api entrée |
absent | PASS |
| gate Cargo stable | fmt/check/clippy/test | PASS preuve opérateur |
| audits Python base | Rust + Markdown | PASS sandbox |
3. Lecture et ownership internes
| Famille | Constat | Décision |
|---|---|---|
Core Pubkey |
public crate-root, solana-pubkey ^4.3 |
réutiliser; aucun wrapper Interface |
| Core Program IDs | 18 identités fondamentales + registry | laisser Core |
| Core Error/Result | contrat commun workspace | réutiliser pour Interface |
| HTTP transaction/block DTOs | projections JSON-RPC Transport | laisser Transport |
| Yellowstone instruction/meta DTOs | projections protobuf/Geyser | laisser Transport |
| Architecture 006 | Interface wire passive; Program comportement séparé | scope conforme |
| Roadmap 0.3.2 | wires génériques acquisition/CORE reportés | ne pas anticiper |
4. Héritage kbot3
| Concept | Verdict | Preuve attendue dans KSP |
|---|---|---|
| ordered account meta | REPRENDRE | ProgramAccountMeta sans naming execution |
passive {program_id, accounts, data} |
REPRENDRE | ProgramInstruction borné |
| string Pubkey/ProgramId wrappers | REDESSINER | Core Pubkey directement |
| unbounded payload | REDESSINER | borne + Debug résumé |
| decoder traits/recognition/proofs | REPORTER 0.2.14 | absents d'Interface |
| instruction path/CPI/replay context | REPORTER 0.3.2+ | absents de 0.2.13 |
| canonical transaction/replay JSON model | REPORTER/redéfinir | aucun portage |
| prepared execution policy/signers | REPORTER | absents d'Interface |
monolithic ks-lib organization |
REJETER | crate ownership séparé |
5. Audit externe courant
| Référence | État observé 2026-08-27 | Décision de validation |
|---|---|---|
solana-instruction |
3.5.0; Pubkey ^4.3.0; codecs optionnels |
parité conceptuelle requise, dépendance non requise |
Solana Instruction |
program_id + ordered AccountMeta + opaque bytes | forme cible exacte |
| Solana syscall bounds | 255 account metas CPI; data 10 KiB; 128 unique account infos CPI | 255/10 KiB = admission Interface; 128 non appliqué aux metas |
solana-loader-v3-interface |
8.1.1; compatible générations observées | hors scope, réaudit au vertical réel |
| licence Anza SDK | Apache-2.0 | compatible si future dépendance réellement retenue |
6. Matrice de frontière de release
| Surface | Owner | 0.2.13 | 0.2.14 | 0.3.2+ | Statut |
|---|---|---|---|---|---|
| Pubkey / Program IDs fondamentaux | Core | reuse | reuse | reuse | FIXÉ |
| Program account meta | Interface | IMPLEMENT | consume | reuse | FIXÉ |
| Program instruction passive | Interface | IMPLEMENT | consume | reuse | FIXÉ |
| Program-specific codec/layout | Interface | OUT | si besoin réel | selon vertical | REPORTÉ |
| decoder/preparer traits | Program API | OUT | AUDIT/IMPLEMENT | consume | REPORTÉ |
| Transport provider DTOs | Transport | UNCHANGED | UNCHANGED | adapter future | FIXÉ |
| generic acquisition/replay wire | Interface/CORE | OUT | OUT | IMPLEMENT | REPORTÉ |
| RAW persistence | Store | OUT | OUT | 0.3.1+ |
REPORTÉ |
7. API publique cible
| Contrat | Attendu final 0.2.13 |
Statut |
|---|---|---|
| crate | ksp-interface-lib membre workspace |
PASS pre.002 |
| façade | exports explicites crate-root; aucun pub mod |
PASS pre.002 |
| Pubkey | réexport/usage contrôlé de Core; pas de type parallèle | PASS pre.002 |
ProgramAccountMeta |
private fields + writable/readonly + accessors | PASS pre.003 |
ProgramInstruction |
private fields + try_new + accessors |
TODO pre.004 |
| account bound | constante publique <= 255; enforcement constructeur |
PASS/PENDING |
| data bound | <= 10_240 |
TODO pre.004 |
| serde | absent | FIXÉ pre.001 |
| generic codec | absent | FIXÉ pre.001 |
| Debug instruction | résumé borné, pas payload complet | TODO pre.004 |
| Error/Result | Core commun + code Interface sûr minimal | PASS pre.003 |
8. Robustness/adversarial
| Cas | Attendu | Gate |
|---|---|---|
| 0 account | accepté | unit |
| 255 accounts | accepté | unit |
| 256 accounts | refus avant état valide | unit |
| 0 data | accepté | unit |
| 10_240 bytes | accepté | unit |
| 10_241 bytes | refus | unit |
| duplicate accounts | ordre/doublons conservés | unit + public API |
| unknown Program Pubkey | accepté | unit |
| hostile data marker in Debug | absent du rendu | unit |
| hostile data marker in Error | absent du rendu/context | unit |
| unchecked narrowing cast | absent | source audit/Clippy |
| malformed binary wire | N/A sans codec | ne pas inventer un test |
| unknown discriminant | N/A sans enum wire | réouvrir au vertical |
| serde hostile allocation | N/A serde absent | dependency canary |
9. Dependency firewall
| Dépendance depuis Interface | Attendu final | Preuve |
|---|---|---|
ksp-core-lib |
AUTORISÉ / requis | manifest + cargo tree |
ksp-program-api / Program Lib |
INTERDIT | manifest/source canary |
| On-chain / Off-chain Transport | INTERDIT | manifest/source canary |
| Config / Wallet / Store / Tauri | INTERDIT | manifest/source canary |
| reqwest / tonic / tokio / websocket | INTERDIT | cargo tree + manifest |
| serde / serde_json | ABSENT en foundation | manifest + cargo tree |
| borsh / bincode / wincode | ABSENT en foundation | manifest + cargo tree |
solana-instruction |
ABSENT tant qu'interop réel non requis | manifest + cargo tree |
Graphes attendus :
cargo tree -p ksp-interface-lib --edges normal
cargo tree --duplicates
Si une nouvelle dépendance externe apparaît après pre.001, la présente matrice doit être rouverte avant acceptation.
10. Tests de release
| Famille | Attendu | Statut |
|---|---|---|
| unit tests privés | account meta/borne puis instruction/adversarial | PASS pre.004 |
tests/public_api.rs |
consommation crate-root uniquement | PASS pre.004 |
| external consumer canary | surface utilisable hors modules privés | TODO |
| dependency boundary | firewall exact | PASS pre.004 |
| release completeness | inventaire exact, aucun domaine supplémentaire | TODO |
| round-trip codec | aucun tant qu'aucun codec | N/A |
| network smoke | aucun pour crate wire pure | N/A |
11. Gate technique final attendu
Avant réconciliation documentaire :
cargo fmt --all PASS attendu
python3 scripts/audit_rust_workspace_rules.py PASS attendu
python3 scripts/audit_markdown_tables.py ... PASS attendu
cargo check --workspace PASS attendu
cargo clippy --workspace --all-targets PASS attendu
cargo test --workspace PASS attendu
cargo tree -p ksp-interface-lib --edges normal inspecté
cargo tree --duplicates inspecté
Aucun smoke réseau/live n'est exigé par défaut.
12. État pre.001
| Critère de sortie prompt | Statut |
|---|---|
| sources internes obligatoires relues | PASS |
| base stable confirmée | PASS marqueurs + preuve opérateur |
| Core/Transport inventoriés | PASS |
| architecture 006 confrontée à la base | PASS |
| archive kbot3 auditée | PASS |
| matrice héritage | PASS |
| frontière 0.2.13 / 0.2.14 / 0.3.2 | PASS |
| premier lot exact décidé | PASS |
| ownership types | PASS |
| dépendances candidates auditables/bornées | PASS |
| threat model | PASS |
| test strategy | PASS |
| dependency graph cible | PASS |
| plan + validation | PASS |
| forecast/sizing | PASS |
| implémentation Program lourde | ABSENTE |
Le passage à pre.002 est autorisé après application du delta et validation opérateur. Le statut des items d'implémentation reste volontairement TODO jusqu'aux tranches correspondantes.
13. État préparé pre.002
Le scaffold matérialisé conserve volontairement une surface minimale :
workspace member PASS structurel
normal dependency ksp-core-lib uniquement
Pubkey réexport Core au crate-root
public modules aucun
ProgramAccountMeta absent par contrat pre.002
ProgramInstruction absent par contrat pre.002
serde / borsh / bincode / wincode absents
network/runtime dependencies absentes
ksp-logging-lib absent
constants.rs / TRACING_TARGET absents
README / USAGE initiaux
public API canary présent
dependency firewall canary présent
Le logging reste volontairement absent : la foundation 0.2.13 est passive et n'émet aucun événement/span runtime. Si une future surface comportementale démontre un besoin réel de logging, ksp-logging-lib, src/constants.rs et TRACING_TARGET devront être introduits ensemble conformément à DEP-LOG-004 et DEP-LOG-010.
Le passage à pre.003 reste conditionné au gate opérateur complet sur l'overlay pre.002.
14. État préparé pre.003
| Critère | Statut |
|---|---|
ProgramAccountMeta crate-root |
PASS structurel |
| champs privés | PASS |
constructeurs readonly / writable |
PASS |
| accessors identité/signer/writable | PASS |
| Pubkey opaque non registry | PASS unit |
MAX_PROGRAM_INSTRUCTION_ACCOUNTS == 255 |
PASS unit + public API |
enforcement collection 255/256 |
PENDING pre.004 avec ProgramInstruction |
code interface.program_instruction_limit_exceeded |
PASS public API |
| type d'erreur propre Interface | ABSENT, Core commun conservé |
ProgramInstruction |
ABSENT par contrat |
| data bound | PENDING pre.004 |
| serde/codecs | ABSENTS |
| logging/runtime | ABSENTS |
| dépendance normale | ksp-core-lib uniquement |
Le statut PASS/PENDING de la borne accounts signifie que la valeur publique est désormais figée à 255, tandis que le rejet concret de 256 comptes sera testé lorsque la collection existera dans ProgramInstruction. Aucun faux wrapper de collection n'est créé dans pre.003.
15. État préparé pre.004
| Critère | Statut |
|---|---|
ProgramInstruction crate-root |
PASS structurel |
| champs privés | PASS |
constructeur try_new |
PASS |
accessors program_id/accounts/data |
PASS |
MAX_PROGRAM_INSTRUCTION_DATA_LEN == 10_240 |
PASS unit + public API |
accounts 255 accepté / 256 refusé |
PASS unit |
data 10_240 accepté / 10_241 refusé |
PASS unit |
| accounts/data vides | PASS unit |
| ordre + doublons accounts | PASS unit |
| Program Pubkey opaque/non registry | PASS unit |
| erreur borne Core commune | PASS |
| contexte erreur limité aux longueurs/plafonds sûrs | PASS unit |
| Debug résumé sans accounts/payload | PASS unit |
| serde/codecs | ABSENTS |
solana-instruction |
ABSENT |
| logging/runtime | ABSENTS |
| dépendance normale | ksp-core-lib uniquement |
cargo test --workspace sur preuve entrée pre.003 |
NON FOURNI — à rejouer au gate opérateur 004 |
La tranche ferme ainsi le premier lot générique { program_id, accounts, data } sans ajouter de codec ni de comportement Program. Le hardening pre.005 doit porter sur l'usage externe, les cas adversariaux et le firewall, pas sur une nouvelle famille wire.