v0.2.13-pre.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 302
|
||||
# version: 303
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.2.12"
|
||||
version = "0.2.13-pre.1"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
276
deltas/0.2.13/pre.001.md
Normal file
276
deltas/0.2.13/pre.001.md
Normal file
@@ -0,0 +1,276 @@
|
||||
<!-- file: deltas/0.2.13/pre.001.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.2.13-pre.001` — audit/sizing Interface / wire foundation
|
||||
|
||||
## 1. Base requise
|
||||
|
||||
```text
|
||||
v0.2.12
|
||||
```
|
||||
|
||||
Archive opérateur utilisée : `khadhroony-solana-project-v0.2.12.zip`, annoncée comme issue du tag Gitea stable.
|
||||
|
||||
Vérifications d'identité :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.2.12 PASS à l'entrée
|
||||
deltas/0.2.12/rel.001.md présent
|
||||
prompts/018-V0_2_13_START_PROMPT.md présent
|
||||
crates/ksp-interface-lib absent
|
||||
crates/ksp-program-api absent
|
||||
.git absent de l'archive
|
||||
```
|
||||
|
||||
Le tag stable n'est donc pas revérifiable localement par Git. L'archive opérateur, le delta stable et la preuve opérateur fournie constituent l'autorité de reprise.
|
||||
|
||||
## 2. Objectif
|
||||
|
||||
Exécuter le gate obligatoire `pre.001` sans ouvrir encore la crate : relire règles/architecture, auditer Core/Transport, auditer l'héritage kbot3, vérifier les candidates externes actuelles, décider le premier lot wire, fixer ownership/bornes/threat model/dependency graph/tests, produire plan/validation et recalibrer la release.
|
||||
|
||||
## 3. Décisions prises
|
||||
|
||||
```text
|
||||
crate cible ksp-interface-lib
|
||||
premier lot ProgramAccountMeta + ProgramInstruction
|
||||
orientation Program-facing passive
|
||||
Pubkey ksp-core-lib::Pubkey, aucun wrapper parallèle
|
||||
Program IDs fondamentaux restent ksp-core-lib
|
||||
account metas ordre + doublons préservés
|
||||
borne account metas 255
|
||||
borne instruction data 10_240 octets
|
||||
fields privés pour préserver les invariants
|
||||
serde OUT pour la foundation
|
||||
borsh/bincode/wincode OUT sans protocole concret
|
||||
solana-instruction référence normative, pas dépendance runtime
|
||||
solana-loader-v3-interface reporté au vertical loader-v3 réel
|
||||
Transport DTO refactor OUT
|
||||
Program traits/decode/recognition 0.2.14, OUT de Interface
|
||||
replay/CPI/logs/return-data/Core 0.3.2+, OUT de 0.2.13
|
||||
nouvelle dépendance externe aucune
|
||||
network/logging runtime aucun
|
||||
```
|
||||
|
||||
Les plafonds 255/10 KiB sont des bornes d'admission Interface dérivées des limites runtime Solana actuelles. Ils ne garantissent pas qu'une instruction donnée rentre dans une transaction top-level complète ; l'assembly transactionnel reste hors scope.
|
||||
|
||||
## 4. Héritage kbot3
|
||||
|
||||
Archive auditée : `khadhroony-bot3_v0.5.3-pre.005-fix010.zip`.
|
||||
|
||||
Verdict synthétique :
|
||||
|
||||
```text
|
||||
REPRENDRE ordered account meta; instruction program_id/accounts/data
|
||||
REDESSINER wrappers String Pubkey/ProgramId; payload non borné
|
||||
REPORTER decoder traits; recognition/proofs; replay/CPI/logs/return data;
|
||||
canonical transaction; prepared execution/signers/policies
|
||||
REJETER monolithe ks-lib; JSON/version/hash génériques par réflexe;
|
||||
operation_code dans le contrat d'instruction passive
|
||||
```
|
||||
|
||||
Aucun code kbot3 n'est porté par ce delta.
|
||||
|
||||
## 5. Audit externe ciblé
|
||||
|
||||
État observé le 27 août 2026 :
|
||||
|
||||
```text
|
||||
solana-instruction 3.5.0
|
||||
Instruction = program_id: Pubkey + Vec<AccountMeta> + Vec<u8>
|
||||
solana-pubkey ^4.3.0
|
||||
serde/borsh/bincode/wincode optionnels
|
||||
licence Anza SDK Apache-2.0
|
||||
|
||||
solana-program 4.1.0
|
||||
MAX_CPI_INSTRUCTION_ACCOUNTS = 255
|
||||
MAX_CPI_INSTRUCTION_DATA_LEN = 10 * 1024
|
||||
MAX_CPI_ACCOUNT_INFOS = 128 (unique account infos; non appliqué aux metas)
|
||||
|
||||
solana-loader-v3-interface 8.1.1
|
||||
compatible avec solana-instruction ^3.5.0 / solana-pubkey ^4.3.0 observés
|
||||
hors premier lot
|
||||
```
|
||||
|
||||
Aucune nouvelle dépendance n'est justifiée par `pre.001`.
|
||||
|
||||
## 6. Fichiers ajoutés
|
||||
|
||||
```text
|
||||
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
|
||||
docs/validation/016-V0_2_13_INTERFACE.md
|
||||
deltas/0.2.13/pre.001.md
|
||||
```
|
||||
|
||||
## 7. Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
docs/000-README.md
|
||||
docs/plans/000-README.md
|
||||
docs/validation/000-README.md
|
||||
```
|
||||
|
||||
`workspace.package.version` passe à `0.2.13-pre.1` conformément au workflow des prereleases non-fix.
|
||||
|
||||
## 8. Fichiers supprimés
|
||||
|
||||
```text
|
||||
aucun
|
||||
```
|
||||
|
||||
## 9. Fichiers volontairement inchangés
|
||||
|
||||
```text
|
||||
ROADMAP.md
|
||||
CHANGELOG.md
|
||||
prompts/018-V0_2_13_START_PROMPT.md
|
||||
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
||||
docs/architecture/**
|
||||
crates/**
|
||||
config/**
|
||||
.env.example
|
||||
```
|
||||
|
||||
La roadmap/séquence/architecture possèdent déjà les frontières `0.2.13` / `0.2.14` / `0.3.2`. `pre.001` les confronte à la base réelle dans le nouveau plan sans les réécrire par duplication. `ROADMAP.md` et `CHANGELOG.md` restent hors du couloir de cette tranche.
|
||||
|
||||
## 10. Audit interne exécuté
|
||||
|
||||
Points confirmés :
|
||||
|
||||
```text
|
||||
Core réexporte Pubkey et possède les Program IDs fondamentaux
|
||||
Core possède Error/Result communs
|
||||
Transport possède encore les projections HTTP/WS/Yellowstone concrètes
|
||||
aucun besoin de déplacer ces DTOs vers Interface en 0.2.13
|
||||
Interface ne doit pas dépendre de Program/Transport/Store/Wallet/Config
|
||||
Program API pourra dépendre de Core + Interface en 0.2.14
|
||||
wires d'acquisition/CORE génériques restent réservés à 0.3.2+
|
||||
workspace n'a pas solana-instruction/borsh/wincode comme besoin Interface actuel
|
||||
```
|
||||
|
||||
## 11. Threat model et tests décidés
|
||||
|
||||
```text
|
||||
accounts 255 accepté
|
||||
accounts 256 refusé
|
||||
data 10_240 accepté
|
||||
data 10_241 refusé
|
||||
empty accounts/data accepté
|
||||
ordre + doublons préservés
|
||||
unknown Program Pubkey accepté
|
||||
Debug instruction résumé borné
|
||||
payload hostile dans Debug/Error absent
|
||||
serde hostile éliminé par absence de serde
|
||||
malformed/discriminant N/A tant qu'aucun codec n'est retenu
|
||||
panic/unwrap/expect/? audits/lints KSP
|
||||
network smoke non requis
|
||||
public API / external consumer requis
|
||||
cargo tree / dependency firewall requis dès scaffold
|
||||
```
|
||||
|
||||
## 12. Validations exécutées dans le sandbox
|
||||
|
||||
Avant modification, sur l'archive stable extraite :
|
||||
|
||||
```text
|
||||
python3 scripts/audit_rust_workspace_rules.py PASS
|
||||
python3 scripts/audit_markdown_tables.py ... deltas/0.2.13 PASS
|
||||
```
|
||||
|
||||
La preuve opérateur fournie sur le checkout stable `0.2.12` établit :
|
||||
|
||||
```text
|
||||
cargo fmt --all PASS
|
||||
Rust rules audit PASS
|
||||
Markdown table audit PASS
|
||||
cargo check --workspace PASS
|
||||
cargo clippy --workspace --all-targets PASS
|
||||
cargo test --workspace PASS
|
||||
```
|
||||
|
||||
Après génération du présent overlay :
|
||||
|
||||
```text
|
||||
python3 scripts/audit_rust_workspace_rules.py PASS
|
||||
General Rust rule audit clean
|
||||
Rust export completeness audit 0 candidate(s)
|
||||
KSP workspace Rust rule audit clean
|
||||
python3 scripts/audit_markdown_tables.py ... deltas/0.2.13 PASS
|
||||
tables / files 160 / 111
|
||||
```
|
||||
|
||||
## 13. Validations non exécutées dans ce sandbox
|
||||
|
||||
```text
|
||||
cargo fmt --all
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo test --workspace
|
||||
cargo tree -p ksp-interface-lib --edges normal
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
Cause : executable `cargo` absent du sandbox de préparation. `ksp-interface-lib` n'existe pas encore par contrat de `pre.001`, donc les graphes propres à la crate commenceront avec `pre.002`.
|
||||
|
||||
Aucune commande non exécutée localement n'est déclarée PASS.
|
||||
|
||||
## 14. Forecast souple recalibré
|
||||
|
||||
### pre.001 — audit + héritage + frontières + sizing
|
||||
|
||||
**Statut : livré par le présent delta.**
|
||||
|
||||
### pre.002 — scaffold `ksp-interface-lib` + façade + firewall
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.003 — `ProgramAccountMeta` + bornes communes
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.004 — `ProgramInstruction` passif borné
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.005 — adversarial + consumer externe + API/dependency hardening
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.006 — gate technique final
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.007 — réconciliation documentaire finale
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### pre.008 — préparation de publication minimale
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
### rel.001 — publication stable
|
||||
|
||||
**Statut : prévu.**
|
||||
|
||||
Le second lot wire optionnel du forecast initial est supprimé : aucun second domaine ne justifie une tranche dans cette foundation. Le scope reste compatible avec une release/session.
|
||||
|
||||
## 15. Questions ouvertes
|
||||
|
||||
Aucune question bloquante pour `pre.002`.
|
||||
|
||||
Les noms exacts des codes d'erreur et le détail final des accessors peuvent encore être ajustés dans `pre.003`/`pre.004` sans rouvrir l'ownership, les bornes ou le scope de release.
|
||||
|
||||
## 16. Validation opérateur après application
|
||||
|
||||
Exécuter :
|
||||
|
||||
```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 --workspace
|
||||
```
|
||||
|
||||
`pre.002` ne commence qu'après retour du gate appliqué.
|
||||
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/000-README.md -->
|
||||
<!-- version: 63 -->
|
||||
<!-- version: 64 -->
|
||||
|
||||
# Plans KSP
|
||||
|
||||
@@ -27,7 +27,8 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou
|
||||
- [`016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) — plan historique clôturé de la release stable `0.2.9 — Yellowstone gRPC standard/provider-neutral`, publiée par `rel.001`; il fixe le moteur N1, le standard N2, Config V3, le replay prudent et la validation PublicNode Mainnet/Testnet.
|
||||
- [`017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) — plan historique clôturé de la release stable `0.2.10 — OrbitFlare Yellowstone gRPC`; il conserve le Devnet gRPC gratuit, N1/N2 immuables, la License Key `x-token` et le smoke final `Slot + Ping`.
|
||||
- [`018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) — plan historique clôturé de `0.2.11 — Off-chain price transport`; SOL/USD V1, huit providers REST sans SDK, registry/availability/rate limits Off-chain et Config `std.offchain_transport`.
|
||||
- [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) — plan actif de `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk`; il fixe le gabarit 1434/1435, le composite Config, les DTO/commands provider-neutral, le threat model et la trajectoire d’intégration Wallet.
|
||||
- [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) — plan historique clôturé de `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk`; il conserve le gabarit 1434/1435, le composite Config, les DTO/commands provider-neutral, l’intégration Wallet minimale et les gates live/build finaux.
|
||||
- [`020-V0_2_13_INTERFACE_PLAN.md`](020-V0_2_13_INTERFACE_PLAN.md) — plan actif de `0.2.13 — Interface / wire foundation`; il fixe le premier lot passif `ProgramAccountMeta` + `ProgramInstruction`, les bornes, le firewall Interface -> Core, l’héritage kbot3 retenu/rejeté et la frontière avec Program API/RAW/CORE.
|
||||
|
||||
Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre.
|
||||
|
||||
|
||||
479
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
Normal file
479
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
Normal file
@@ -0,0 +1,479 @@
|
||||
<!-- file: docs/plans/020-V0_2_13_INTERFACE_PLAN.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Plan `0.2.13` — Interface / wire foundation
|
||||
|
||||
## 1. Base, autorité et nature de `pre.001`
|
||||
|
||||
La release est ouverte exclusivement depuis l'archive opérateur `khadhroony-solana-project-v0.2.12.zip`, annoncée comme issue du tag stable `v0.2.12`. L'archive fournie ne contient pas de metadata `.git`; `git describe` n'est donc pas vérifiable dans le sandbox. Les marqueurs internes sont cohérents :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.2.12
|
||||
prompts/018-V0_2_13_START_PROMPT.md présent
|
||||
deltas/0.2.12/rel.001.md présent
|
||||
crates/ksp-interface-lib absent
|
||||
crates/ksp-program-api absent
|
||||
```
|
||||
|
||||
Le log opérateur joint à la reprise établit sur la base stable :
|
||||
|
||||
```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 --workspace PASS
|
||||
```
|
||||
|
||||
Dans le sandbox de préparation, `cargo` n'est pas installé. Les audits Python de la base ont été rejoués et sont propres ; aucune commande Cargo non exécutée localement n'est déclarée PASS.
|
||||
|
||||
`0.2.13-pre.001` reste un gate de lecture/audit/sizing. Il ne crée pas encore `ksp-interface-lib` et ne porte aucun code de l'ancien dépôt.
|
||||
|
||||
## 2. Décision de scope
|
||||
|
||||
Le minimum retenu pour `0.2.13` est une foundation **Program-facing passive** :
|
||||
|
||||
```text
|
||||
ProgramAccountMeta
|
||||
ProgramInstruction
|
||||
bornes locales explicites sur account metas et data
|
||||
façade crate-root explicite
|
||||
Error/Result communs via ksp-core-lib
|
||||
aucun serde/codec générique ajouté sans protocole réel
|
||||
aucun comportement Program
|
||||
```
|
||||
|
||||
Cette surface correspond à la forme fondamentale d'une invocation Solana : identité du programme, comptes ordonnés avec flags signer/writable, puis octets opaques. Elle prépare directement la future construction d'instructions de `ksp-program-api` sans absorber le modèle d'acquisition/replay qui appartient à `0.3.2+`.
|
||||
|
||||
Le scope est volontairement réduit par rapport au forecast initial : `0.2.13` ne crée ni modèle canonique de transaction, ni replay input, ni logs/return-data génériques, ni CPI path, ni discriminant spécifique d'un programme tant qu'aucun vertical slice officiel ne le justifie.
|
||||
|
||||
## 3. Règles et architecture confrontées à la base réelle
|
||||
|
||||
Sources internes relues avant décision :
|
||||
|
||||
```text
|
||||
RULES.md
|
||||
docs/000-README.md
|
||||
docs/rules/RULES_GENERAL.md
|
||||
docs/rules/RULES_KSP.md
|
||||
docs/rules/RULES_RUST.md
|
||||
docs/rules/RULES_DEPENDENCIES.md
|
||||
docs/rules/RULES_DOCUMENTATION.md
|
||||
docs/rules/FILE_CONTRACTS.md
|
||||
docs/rules/VERSION_WORKFLOW.md
|
||||
docs/rules/PROMPT_STRUCTURE.md
|
||||
docs/architecture/000-README.md
|
||||
docs/architecture/001-PROJECT_OBJECTIVES.md
|
||||
docs/architecture/002-LAYERS_AND_DEPENDENCIES.md
|
||||
docs/architecture/003-COMPONENT_CONTRACTS.md
|
||||
docs/architecture/004-COMPONENT_INVENTORY.md
|
||||
docs/architecture/005-DEPENDENCY_GRAPH.md
|
||||
docs/architecture/006-WIRE_AND_PROGRAM.md
|
||||
docs/architecture/007-EXECUTION_AND_POLICY.md
|
||||
docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md
|
||||
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
|
||||
docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md
|
||||
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
|
||||
ROADMAP.md
|
||||
```
|
||||
|
||||
Les contraintes structurantes sont confirmées :
|
||||
|
||||
```text
|
||||
Core possède Pubkey, Error/Result et les Program IDs fondamentaux
|
||||
Interface possède/reexporte de manière contrôlée les contrats wire officiels
|
||||
Program API pourra dépendre de Core + Interface, jamais l'inverse
|
||||
Transport reste propriétaire des DTOs RPC/WS/gRPC et ne dépend pas d'Interface
|
||||
RAW/CORE n'exige aucun decoder Program
|
||||
0.3.2 étendra Interface pour les wires génériques d'acquisition/CORE
|
||||
pas de pub mod ; exports explicites depuis crate root
|
||||
pas de dépendance externe sans usage réel
|
||||
```
|
||||
|
||||
## 4. Inventaire interne stable pertinent
|
||||
|
||||
### 4.1 Core
|
||||
|
||||
| Surface stable | Owner actuel | Visibilité/consumer | Décision `0.2.13` |
|
||||
|----------------------------------|----------------|-----------------------------------------------|---------------------------------------------------------------------|
|
||||
| `Pubkey` | `ksp-core-lib` | public crate-root; consommé dans le workspace | réutiliser directement; aucun wrapper Interface |
|
||||
| `Error` / `ErrorCode` / `Result` | `ksp-core-lib` | public crate-root; contrat commun | réutiliser pour les erreurs de bornes Interface |
|
||||
| 18 Program IDs + registry/filter | `ksp-core-lib` | public crate-root | laisser Core; Interface ne duplique pas les identités fondamentales |
|
||||
|
||||
Les anciens wrappers textuels `MdProgramId` / `MdPubkey` de kbot3 n'apportent donc aucune valeur à la frontière KSP actuelle : un `Pubkey` typé existe déjà et doit rester l'identité fondamentale.
|
||||
|
||||
### 4.2 Transport
|
||||
|
||||
| Type/famille observée | Owner actuel | Sémantique réelle | Décision |
|
||||
|----------------------------------------------------------|-------------------------|--------------------------------------------------------|-------------------|
|
||||
| `SolanaEncodedTransaction` | On-chain Transport HTTP | projection JSON-RPC encodée | laisser Transport |
|
||||
| `SolanaConfirmedTransaction` / `SolanaBlockTransaction` | On-chain Transport HTTP | réponse RPC avec états wire/metadata provider | laisser Transport |
|
||||
| `SolanaWireField<T>` | On-chain Transport HTTP | distinction omitted/null/value propre aux réponses RPC | laisser Transport |
|
||||
| `YellowstoneCompiledInstruction` | On-chain Transport gRPC | projection protobuf Yellowstone | laisser Transport |
|
||||
| `YellowstoneInnerInstructions` / `YellowstoneReturnData` | On-chain Transport gRPC | metadata d'update Geyser | laisser Transport |
|
||||
| `YellowstoneTransactionError` / `...Meta` | On-chain Transport gRPC | sémantique provider/protobuf | laisser Transport |
|
||||
|
||||
Ces DTOs peuvent ressembler à de futurs objets génériques, mais ils représentent aujourd'hui des formes de transport concrètes. `0.2.13` ne les déplace pas et ne force aucune dépendance `Transport -> Interface`.
|
||||
|
||||
### 4.3 Dépendances workspace
|
||||
|
||||
La base possède déjà notamment :
|
||||
|
||||
```text
|
||||
solana-pubkey = ^4.3, default-features = false
|
||||
serde = ^1.0
|
||||
serde_json = ^1.0
|
||||
```
|
||||
|
||||
Aucun `solana-instruction`, `borsh`, `wincode` ou crate d'interface Program n'est actuellement nécessaire au nouveau lot. Le graphe cible initial reste donc `Interface -> Core` uniquement.
|
||||
|
||||
## 5. Audit d'héritage `khadhroony-bot3`
|
||||
|
||||
Archive auditée : `khadhroony-bot3_v0.5.3-pre.005-fix010.zip`.
|
||||
|
||||
Familles inspectées :
|
||||
|
||||
```text
|
||||
ks-lib/src/model/solana.rs
|
||||
ks-lib/src/model/canonical_transaction.rs
|
||||
ks-lib/src/model/replay.rs
|
||||
ks-lib/src/decoder/api/contracts.rs
|
||||
ks-lib/src/executor/api/execution.rs
|
||||
familles decoder/* wire pertinentes comme points de comparaison uniquement
|
||||
```
|
||||
|
||||
La matrice suivante porte sur les **concepts**, pas sur un portage de code :
|
||||
|
||||
| Concept kbot3 | Verdict | Cible KSP | Raison |
|
||||
|--------------------------------------------------------------|------------|----------------------------------|--------------------------------------------------------------------------------|
|
||||
| account `{ pubkey, is_signer, is_writable }` ordonné | REPRENDRE | Interface `0.2.13` | forme passive fondamentale d'une instruction; retirer le naming execution |
|
||||
| instruction `{ program_id, accounts, data }` | REPRENDRE | Interface `0.2.13` | forme officielle minimale; retirer `operation_code` et toute policy |
|
||||
| `MdPubkey` / `MdProgramId` en `String` | REDESSINER | Core | remplacer par `ksp_core_lib::Pubkey` déjà possédé par Core |
|
||||
| payload `Vec<u8>` non borné | REDESSINER | Interface `0.2.13` | ajouter admission bornée et Debug résumé |
|
||||
| `DcApiInstructionDecoder` + recognition/outcomes/proofs | REPORTER | Program API `0.2.14` | comportement de reconnaissance/decode, interdit dans Interface |
|
||||
| `MdInstructionPath` / parent / stack height | REPORTER | Interface/CORE `0.3.2+` | contexte d'acquisition/replay, pas nécessaire au builder Program minimal |
|
||||
| logs / return data / tx failure / balance changes génériques | REPORTER | Interface/CORE `0.3.2+` | faits d'exécution/acquisition; ne pas préfigurer CORE |
|
||||
| `MdCanonicalTransaction` + canonical JSON/hash | REPORTER | CORE series après `0.3.2` | modèle source-neutral large à redéfinir avec Store/CORE réels |
|
||||
| `MdCoreInstructionReplayInput` | REPORTER | CORE/replay après RAW | contrat transversal trop large, dépend de données encore non possédées |
|
||||
| Prepared plan, signers, fee payer, policies | REPORTER | Program API/Execution ultérieurs | responsabilité d'orchestration/exécution, pas wire passif |
|
||||
| monolithe `ks-lib` + générations d'API coexistantes | REJETER | aucune | ownership flou et couplage vertical/horizontal à ne pas reproduire |
|
||||
| version/hash/JSON génériques par réflexe | REJETER | aucune dans `0.2.13` | aucun contrat sérialisé ne justifie une enveloppe/version générique maintenant |
|
||||
|
||||
Anti-patterns à ne pas reproduire :
|
||||
|
||||
```text
|
||||
wrappers Pubkey/ProgramId textuels alors qu'une primitive typée existe
|
||||
serde dérivé sur tous les contrats sans frontière de sérialisation réelle
|
||||
JSON Value comme échappatoire pour des formes structurelles futures
|
||||
contrat replay géant utilisé comme point de rencontre de toutes les couches
|
||||
operation_code/policy/signers mêlés à l'instruction passive
|
||||
traits decoder dans la même crate que les wires
|
||||
```
|
||||
|
||||
## 6. Audit externe actuel — 27 août 2026
|
||||
|
||||
L'audit externe est limité aux candidates réellement proches du lot retenu.
|
||||
|
||||
| Candidate | Version actuelle observée | Contrat / graphe | Décision |
|
||||
|------------------------------|---------------------------|----------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|
|
||||
| `solana-instruction` | 3.5.0 | `Instruction { program_id: Pubkey, accounts: Vec<AccountMeta>, data: Vec<u8> }`; `solana-pubkey ^4.3.0`; codecs optionnels | référence normative; pas de dépendance runtime `0.2.13` |
|
||||
| `solana-program` syscalls | 4.1.0 | `MAX_CPI_INSTRUCTION_ACCOUNTS = 255`; data `10 KiB`; account infos uniques `128` | source normative des plafonds d'admission initiaux; pas de dépendance |
|
||||
| `solana-loader-v3-interface` | 8.1.1 | interface officielle; dépend `solana-instruction ^3.5.0` + `solana-pubkey ^4.3.0`; wincode optionnel | compatible en apparence mais hors premier lot; réauditer au vertical loader-v3 |
|
||||
|
||||
Sources primaires/current utilisées :
|
||||
|
||||
```text
|
||||
https://docs.rs/solana-instruction/3.5.0/solana_instruction/struct.Instruction.html
|
||||
https://docs.rs/solana-program/4.1.0/solana_program/syscalls/index.html
|
||||
https://docs.rs/solana-loader-v3-interface/8.1.1/solana_loader_v3_interface/
|
||||
https://github.com/anza-xyz/solana-sdk
|
||||
```
|
||||
|
||||
`solana-instruction` 3.5.0 est Apache-2.0 via le workspace Anza. Ses features `serde`, `borsh`, `bincode` et `wincode` sont optionnelles. La génération `solana-pubkey ^4.3.0` est cohérente avec la base KSP.
|
||||
|
||||
La dépendance directe n'est néanmoins pas retenue maintenant : ses champs `Vec` publics ne permettent pas à KSP de garantir les bornes d'admission sur sa propre API, et aucun interop runtime ne requiert encore de convertir vers ce type. `DEP-KSP-005` impose de ne pas ajouter une dépendance seulement pour refléter une forme triviale que KSP doit de toute façon borner.
|
||||
|
||||
## 7. Matrice de frontières
|
||||
|
||||
| Concept/type | Owner cible | 0.2.13 ? | 0.2.14 ? | 0.3.2+ ? | Autorité / raison |
|
||||
|-------------------------------------------------------------|----------------|----------|------------------|------------------------|-----------------------------------------------|
|
||||
| `Pubkey` | Core | reuse | reuse | reuse | primitive fondamentale KSP déjà stable |
|
||||
| Program IDs fondamentaux | Core | reuse | reuse | reuse | registry Core déjà stable |
|
||||
| account meta d'instruction | Interface | OUI | consume | reuse | forme Solana officielle passive |
|
||||
| instruction Program passive | Interface | OUI | consume | reuse | minimum nécessaire au futur preparer |
|
||||
| codec/discriminant Program spécifique | Interface | NON | si vertical réel | selon besoin | aucun protocole concret dans foundation |
|
||||
| instruction path / CPI ancestry | Interface/CORE | NON | NON requis | OUI | fait structurel d'acquisition/normalisation |
|
||||
| logs / return data / tx failure / balance deltas génériques | Interface/CORE | NON | NON requis | OUI | surface RAW/CORE future |
|
||||
| DTOs RPC/WS/Yellowstone existants | Transport | laisser | laisser | adapter plus tard | projection transport concrète |
|
||||
| decoder identity/recognition/decode | Program API | NON | OUI audit | consume CORE plus tard | comportement extensible Program |
|
||||
| implémentations officielles de programmes | Program Lib | NON | NON | plus tard | vertical slices distincts |
|
||||
| RAW persistence | Store | NON | NON | `0.3.1` | architecture RAW |
|
||||
| transaction/replay canonique générique | CORE | NON | NON | après `0.3.2` | doit être défini avec acquisition/Store réels |
|
||||
|
||||
## 8. Surface API proposée
|
||||
|
||||
Les noms restent ajustables jusqu'à implémentation, mais le contrat conceptuel est fermé :
|
||||
|
||||
```rust
|
||||
pub use ksp_core_lib::Pubkey;
|
||||
|
||||
pub const MAX_PROGRAM_INSTRUCTION_ACCOUNTS: usize = 255;
|
||||
pub const MAX_PROGRAM_INSTRUCTION_DATA_LEN: usize = 10 * 1024;
|
||||
|
||||
pub struct ProgramAccountMeta { /* private */ }
|
||||
pub struct ProgramInstruction { /* private */ }
|
||||
```
|
||||
|
||||
Façade visée :
|
||||
|
||||
```text
|
||||
ProgramAccountMeta::writable(pubkey, is_signer)
|
||||
ProgramAccountMeta::readonly(pubkey, is_signer)
|
||||
ProgramAccountMeta::{pubkey,is_signer,is_writable}
|
||||
|
||||
ProgramInstruction::try_new(program_id, accounts, data) -> ksp_core_lib::Result<Self>
|
||||
ProgramInstruction::{program_id,accounts,data}
|
||||
```
|
||||
|
||||
Décisions de contrat :
|
||||
|
||||
- `Pubkey` est consommé via Core ; aucun `ProgramId` wrapper supplémentaire ;
|
||||
- les comptes gardent exactement leur ordre et les doublons restent permis ;
|
||||
- comptes vides et data vide restent valides ;
|
||||
- aucune validation sémantique de Program ID, signer ou writable au-delà de la forme passive ;
|
||||
- les champs restent privés afin d'empêcher la construction d'un état hors bornes ;
|
||||
- la construction valide les longueurs sans cloner les vecteurs fournis ;
|
||||
- `Debug` de `ProgramInstruction` doit résumer `program_id`, `account_count` et `data_len`, sans imprimer tout le payload ;
|
||||
- pas de `serde::{Serialize, Deserialize}` dans la foundation : aucune persistence/IPC/wire sérialisée générique ne l'exige, et une dérive `Deserialize` naïve affaiblirait le gate de taille avant allocation ;
|
||||
- aucun `borsh`, `bincode` ou `wincode` générique : les codecs arrivent avec un vrai protocole Program dans Interface ;
|
||||
- pas de `format_version` artificiel tant qu'aucun format sérialisé KSP n'est défini.
|
||||
|
||||
### 8.1 Bornes
|
||||
|
||||
Les bornes initiales suivent les plafonds runtime Solana actuels :
|
||||
|
||||
```text
|
||||
account metas d'une instruction <= 255
|
||||
data d'une instruction <= 10_240 octets
|
||||
```
|
||||
|
||||
Elles sont des **bornes d'admission Interface**, pas la promesse qu'une instruction seule rentrera dans toute transaction top-level. Les contraintes de message/transaction, comptes uniques, fee payer, blockhash et assembly appartiennent aux couches d'exécution ultérieures.
|
||||
|
||||
### 8.2 Erreurs
|
||||
|
||||
Le crate n'introduit pas un second type d'erreur. Les violations de borne utilisent `ksp_core_lib::Error/Result` avec codes Interface stables et contexte sûr limité aux longueurs/plafonds. Aucun octet du payload, compte arbitraire ou valeur externe n'est copié dans les diagnostics.
|
||||
|
||||
Les codes exacts seront matérialisés avec la première primitive ; deux catégories suffisent conceptuellement :
|
||||
|
||||
```text
|
||||
invalid_program_instruction
|
||||
program_instruction_limit_exceeded
|
||||
```
|
||||
|
||||
Si la première implémentation démontre qu'une seule catégorie bornée suffit, ne pas créer la seconde par symétrie.
|
||||
|
||||
## 9. Threat / robustness model
|
||||
|
||||
| Risque | Décision | Canari prévu |
|
||||
|-------------------------------------|------------------------------------------------------|------------------------------------------------------|
|
||||
| data surdimensionnée | refus avant stockage/copie supplémentaire | `10_240` accepté; `10_241` refusé |
|
||||
| collection accounts surdimensionnée | refus déterministe | `255` accepté; `256` refusé |
|
||||
| conversion/index overflow | aucun cast étroit en foundation; comparer en `usize` | borne 255 + absence de casts unchecked |
|
||||
| ordre/doublons accounts | préserver exactement; ne pas dédupliquer | ordre et doublon round-trip structurel via accessors |
|
||||
| wire malformé | N/A : aucun decoder/codec dans le lot | aucun faux test; réouvrir au premier codec réel |
|
||||
| enum/discriminant inconnu | N/A : aucun discriminant dans le lot | réouvrir au vertical Program |
|
||||
| structures imbriquées pathologiques | N/A au-delà des deux Vec plates | bornes accounts/data suffisent pour ce lot |
|
||||
| Debug volumineux | Debug résumé | payload sentinelle absent du rendu Debug |
|
||||
| allocation/copie excessive | `try_new` consomme les Vec; pas de clone interne | canari structure/API + revue source |
|
||||
| serde hostile | serde absent | dependency/public API canary |
|
||||
| panic/unwrap/expect/? | interdits par règles/lints | audit Rust + Clippy workspace |
|
||||
| Program ID inconnu | accepté : Pubkey opaque typé | canari avec Pubkey non registry |
|
||||
|
||||
## 10. Dependency graph cible et firewall
|
||||
|
||||
Cible de `0.2.13` :
|
||||
|
||||
```text
|
||||
ksp-interface-lib
|
||||
-> ksp-core-lib
|
||||
-> solana-pubkey ^4.3
|
||||
```
|
||||
|
||||
Interdictions :
|
||||
|
||||
```text
|
||||
ksp-interface-lib -X-> ksp-program-api
|
||||
ksp-interface-lib -X-> ksp-program-lib
|
||||
ksp-interface-lib -X-> ksp-onchain-transport-lib
|
||||
ksp-interface-lib -X-> ksp-offchain-transport-lib
|
||||
ksp-interface-lib -X-> ksp-config-lib
|
||||
ksp-interface-lib -X-> ksp-store-*
|
||||
ksp-interface-lib -X-> ksp-wallet-lib
|
||||
ksp-interface-lib -X-> Tauri
|
||||
ksp-interface-lib -X-> reqwest/tonic/tokio/network
|
||||
```
|
||||
|
||||
Aucun logging runtime n'est attendu dans une crate de contrats passifs. `ksp-logging-lib` reste absent sauf comportement futur démontré.
|
||||
|
||||
Validation Cargo prévue dès le scaffold :
|
||||
|
||||
```bash
|
||||
cargo tree -p ksp-interface-lib --edges normal
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
Comme aucune nouvelle dépendance externe n'est retenue au gate, aucun doublon codec/Solana ne doit être créé par `pre.002`.
|
||||
|
||||
## 11. Stratégie de tests
|
||||
|
||||
### Tests unitaires privés
|
||||
|
||||
Sous `unit_tests/` rattachés aux modules privés :
|
||||
|
||||
```text
|
||||
constructeurs account meta writable/readonly
|
||||
bornes comptes 255/256
|
||||
bornes data 10_240/10_241
|
||||
empty accounts/data acceptés
|
||||
ordre et doublons préservés
|
||||
Pubkey inconnu accepté
|
||||
Debug borné et payload absent
|
||||
erreurs sans bytes ni valeur hostile
|
||||
```
|
||||
|
||||
### Tests d'intégration `tests/`
|
||||
|
||||
```text
|
||||
public_api.rs consommation uniquement via crate-root
|
||||
external_consumer.rs petit consumer/crate canary si le pattern workspace le permet
|
||||
dependency_boundary.rs manifest/source firewall et absence de serde/codecs/network
|
||||
release_completeness.rs inventaire exact de la surface 0.2.13 retenue
|
||||
```
|
||||
|
||||
Aucun smoke réseau n'est requis. Aucun round-trip binaire/JSON n'est inventé sans codec réel.
|
||||
|
||||
## 12. Hors scope explicite
|
||||
|
||||
```text
|
||||
ksp-program-api et tout trait decoder/preparer
|
||||
ksp-program-lib
|
||||
codec Program spécifique sans vertical réel
|
||||
system/token/loader/metaplex instruction families
|
||||
PDA seeds sans protocole concret
|
||||
transaction/message/compiled instruction génériques d'acquisition
|
||||
replay input / instruction path / CPI tree
|
||||
logs / return data / transaction errors / balances génériques
|
||||
Store/persistence
|
||||
Transport refactor ou dépendance vers Interface
|
||||
Wallet/Tauri/Config
|
||||
serde/JSON canonical/hash
|
||||
execution policy, signer selection, blockhash, simulation, send
|
||||
```
|
||||
|
||||
## 13. Prévision souple recalibrée
|
||||
|
||||
Le scope réduit permet de supprimer le second lot wire optionnel du forecast initial et de garder des tranches compatibles avec le budget KSP de 15–20 minutes de travail effectif.
|
||||
|
||||
### pre.001 — audit + héritage + frontières + sizing
|
||||
|
||||
**Statut : EN COURS / sortie du présent delta**
|
||||
|
||||
Relire les règles/architectures, auditer Core/Transport, classer kbot3, auditer les candidates externes, retenir la surface instruction passive, fixer bornes/firewall/threat model/tests et créer plan/validation.
|
||||
|
||||
### pre.002 — scaffold `ksp-interface-lib` + façade + firewall
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Créer la crate, l'ajouter au workspace, poser `lib.rs` avec exports explicites, lints, README/USAGE initiaux et canaris manifest/firewall. Dépendance normale unique : `ksp-core-lib`.
|
||||
|
||||
### pre.003 — `ProgramAccountMeta` + bornes communes
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Matérialiser la primitive de compte ordonné, les constantes de borne, le modèle d'erreur Interface minimal et les unit/public canaries associés. Ne pas avancer `ProgramInstruction` si la tranche dépasse le budget.
|
||||
|
||||
### pre.004 — `ProgramInstruction` passif borné
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Ajouter l'instruction `{ program_id, accounts, data }`, constructeur validé, accessors, Debug résumé et canaris d'ordre/doublons/limites. Aucun serde/codec ou comportement Program.
|
||||
|
||||
### pre.005 — adversarial + consumer externe + API/dependency hardening
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Fermer les cas limites, surface crate-root, consumer externe, firewall source/manifest et graphes Cargo. Ne pas ajouter un second domaine wire opportuniste.
|
||||
|
||||
### pre.006 — gate technique final
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Exécuter workspace complet, canaris de complétude/public API/dependencies, `cargo tree` et audit final du scope exact. Aucun README/USAGE final ni préparation de publication.
|
||||
|
||||
### pre.007 — réconciliation documentaire finale
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Finaliser README/USAGE de la crate, plan, validation et références durables réellement affectées. Ne pas modifier `CHANGELOG.md`, `ROADMAP.md` ni le prompt suivant.
|
||||
|
||||
### pre.008 — préparation de publication minimale
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Préparer uniquement `prompts/019-V0_2_14_START_PROMPT.md`, `CHANGELOG.md`, `ROADMAP.md`, le bump prerelease mécanique et le delta. Aucun code/test/README/USAGE/plan/validation/architecture ne doit être rouvert.
|
||||
|
||||
### rel.001 — publication stable
|
||||
|
||||
**Statut : prévu**
|
||||
|
||||
Passer `workspace.package.version` à `0.2.13`, rejouer le gate stable requis, publier le commit `v0.2.13-rel.001` puis le tag stable `v0.2.13`.
|
||||
|
||||
## 14. Sizing et critère session
|
||||
|
||||
| Tranche | Charge relative | Motif du découpage |
|
||||
|---------|------------------|----------------------------------|
|
||||
| pre.002 | petite | scaffold + firewall uniquement |
|
||||
| pre.003 | petite | une primitive + bornes/erreurs |
|
||||
| pre.004 | petite à moyenne | instruction + hardening local |
|
||||
| pre.005 | moyenne | consumer + adversarial + graphes |
|
||||
| pre.006 | gate | aucun développement fonctionnel |
|
||||
| pre.007 | documentation | réconciliation séparée |
|
||||
| pre.008 | publication prep | payload minimal séparé |
|
||||
|
||||
Le scope paraît clôturable dans une release/session sans sacrifier les lanes de sortie. Si `pre.003` ou `pre.004` révèle qu'une dépendance/codec spécifique est indispensable, le gate doit être rouvert avant d'étendre le scope ; il ne faut pas réactiver automatiquement `pre.005` comme second lot wire.
|
||||
|
||||
## 15. Gate `0.2.13-pre.001`
|
||||
|
||||
À la sortie préparée :
|
||||
|
||||
```text
|
||||
base stable / prompt / rel confirmé
|
||||
règles et architecture obligatoires relues
|
||||
Core / Transport inventoriés
|
||||
archive kbot3 auditée
|
||||
matrice REPRENDRE/REDESSINER/REPORTER/REJETER produite
|
||||
0.2.13 / 0.2.14 / 0.3.2 séparés
|
||||
premier lot ProgramAccountMeta + ProgramInstruction
|
||||
nouvelle dépendance externe aucune
|
||||
threat model / tests / dependency graph définis
|
||||
plan + validation créés
|
||||
implementation Program absente
|
||||
```
|
||||
|
||||
## 16. Gate attendu pour `pre.002`
|
||||
|
||||
`pre.002` peut commencer si le présent delta est appliqué et le gate opérateur est vert. Il doit rester un scaffold strict :
|
||||
|
||||
```text
|
||||
nouvelle crate membre ksp-interface-lib
|
||||
Cargo dépend uniquement de ksp-core-lib
|
||||
lints workspace hérités
|
||||
crate root explicite sans pub mod
|
||||
README/USAGE initiaux
|
||||
canari public API minimal
|
||||
canari dependency firewall
|
||||
aucun ProgramAccountMeta/ProgramInstruction fonctionnel si le scaffold suffit à la tranche
|
||||
```
|
||||
|
||||
Aucune question ouverte ne bloque `pre.002`.
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/000-README.md -->
|
||||
<!-- version: 27 -->
|
||||
<!-- version: 28 -->
|
||||
|
||||
# Validations KSP
|
||||
|
||||
@@ -23,4 +23,5 @@ Documents :
|
||||
- [`012-V0_2_9_YELLOWSTONE_GRPC.md`](012-V0_2_9_YELLOWSTONE_GRPC.md) — matrice finale de la release stable `0.2.9` : service Geyser courant, `Subscribe` standard, 7 unary, filtres/updates, dépendances/licence, replay/backpressure, Config V3 et smoke PublicNode Mainnet/Testnet.
|
||||
- [`013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) — matrice finale de la release stable `0.2.10` : Free Devnet, auth `x-token`, endpoint security, heartbeat standard, Config V3, smoke live `Slot + Ping` et invariant N1/N2 immuable.
|
||||
- [`014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) — matrice historique clôturée de `0.2.11` : SOL/USD multi-provider, numeric safety, rate limiting/availability, Config capability-aware et smoke keyless final `7/7`.
|
||||
- [`015-V0_2_12_SOL_PRICES_DESK.md`](015-V0_2_12_SOL_PRICES_DESK.md) — matrice active ouverte par `0.2.12-pre.001` : screen/features, DTO/commands, Config/composite, frontières provider-neutral, sécurité, Wallet integration, packaging Tauri et gates live/build.
|
||||
- [`015-V0_2_12_SOL_PRICES_DESK.md`](015-V0_2_12_SOL_PRICES_DESK.md) — matrice historique clôturée de `0.2.12` : screen/features, DTO/commands, Config/composite, frontières provider-neutral, sécurité, Wallet integration, packaging Tauri et gates live/build.
|
||||
- [`016-V0_2_13_INTERFACE.md`](016-V0_2_13_INTERFACE.md) — matrice active ouverte par `0.2.13-pre.001` : ownership Interface/Core/Transport/Program, héritage kbot3, surface instruction passive, bornes/adversarial, façade publique et dependency firewall.
|
||||
|
||||
191
docs/validation/016-V0_2_13_INTERFACE.md
Normal file
191
docs/validation/016-V0_2_13_INTERFACE.md
Normal file
@@ -0,0 +1,191 @@
|
||||
<!-- file: docs/validation/016-V0_2_13_INTERFACE.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# 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 :
|
||||
|
||||
```text
|
||||
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 | TODO pre.002 |
|
||||
| façade | exports explicites crate-root; aucun `pub mod` | TODO pre.002+ |
|
||||
| Pubkey | réexport/usage contrôlé de Core; pas de type parallèle | TODO pre.002/003 |
|
||||
| `ProgramAccountMeta` | private fields + writable/readonly + accessors | TODO pre.003 |
|
||||
| `ProgramInstruction` | private fields + `try_new` + accessors | TODO pre.004 |
|
||||
| account bound | `<= 255` | TODO pre.003/004 |
|
||||
| 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 + codes Interface sûrs | TODO 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 :
|
||||
|
||||
```bash
|
||||
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 | constructeurs/bornes/order/debug/errors | TODO |
|
||||
| `tests/public_api.rs` | consommation crate-root uniquement | TODO |
|
||||
| external consumer canary | surface utilisable hors modules privés | TODO |
|
||||
| dependency boundary | firewall exact | TODO |
|
||||
| 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 :
|
||||
|
||||
```text
|
||||
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.
|
||||
Reference in New Issue
Block a user