v0.2.13-pre.004
This commit is contained in:
295
deltas/0.2.13/pre.004.md
Normal file
295
deltas/0.2.13/pre.004.md
Normal file
@@ -0,0 +1,295 @@
|
||||
<!-- file: deltas/0.2.13/pre.004.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.2.13-pre.004` — `ProgramInstruction` passif borné
|
||||
|
||||
## 1. Base requise
|
||||
|
||||
Cette tranche s'applique exclusivement sur :
|
||||
|
||||
```text
|
||||
v0.2.12
|
||||
+ 0.2.13-pre.001
|
||||
+ 0.2.13-pre.002
|
||||
+ 0.2.13-pre.003
|
||||
```
|
||||
|
||||
La preuve opérateur fournie pour `pre.003` confirme :
|
||||
|
||||
```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 -p ksp-interface-lib PASS
|
||||
cargo tree -p ksp-interface-lib --edges normal inspecté
|
||||
cargo tree --duplicates inspecté
|
||||
```
|
||||
|
||||
`cargo test --workspace` n'apparaît pas dans cette preuve opérateur. La présente préparation n'en invente donc pas le résultat ; ce test devra être rejoué avec le gate de `pre.004` avant de déclarer la continuité workspace complète.
|
||||
|
||||
Le graphe ciblé reste strictement :
|
||||
|
||||
```text
|
||||
ksp-interface-lib
|
||||
└── ksp-core-lib
|
||||
└── solana-pubkey 4.3.0
|
||||
```
|
||||
|
||||
La version workspace passe de :
|
||||
|
||||
```text
|
||||
0.2.13-pre.3
|
||||
```
|
||||
|
||||
à :
|
||||
|
||||
```text
|
||||
0.2.13-pre.4
|
||||
```
|
||||
|
||||
## 2. Objectif
|
||||
|
||||
Matérialiser le second type du premier lot wire générique décidé en `pre.001` : une instruction Program passive `{ program_id, accounts, data }`, bornée à l'admission et sans comportement Program.
|
||||
|
||||
La tranche ajoute :
|
||||
|
||||
```text
|
||||
ProgramInstruction
|
||||
MAX_PROGRAM_INSTRUCTION_DATA_LEN = 10_240
|
||||
ProgramInstruction::try_new(...)
|
||||
accessors program_id/accounts/data
|
||||
Debug résumé
|
||||
unit/public canaries de limites, ordre et doublons
|
||||
```
|
||||
|
||||
Elle n'ajoute pas :
|
||||
|
||||
```text
|
||||
serde / serde_json
|
||||
borsh / bincode / wincode
|
||||
solana-instruction
|
||||
codec ou discriminant Program spécifique
|
||||
Program API / Program behavior
|
||||
Transport / Store / Config / Wallet
|
||||
ksp-logging-lib / constants.rs / TRACING_TARGET
|
||||
runtime réseau
|
||||
```
|
||||
|
||||
## 3. `ProgramInstruction`
|
||||
|
||||
Le type possède trois champs privés :
|
||||
|
||||
```text
|
||||
program_id : Pubkey
|
||||
accounts : Vec<ProgramAccountMeta>
|
||||
data : Vec<u8>
|
||||
```
|
||||
|
||||
Le constructeur public est :
|
||||
|
||||
```text
|
||||
ProgramInstruction::try_new(program_id, accounts, data)
|
||||
-> ksp_core_lib::Result<ProgramInstruction>
|
||||
```
|
||||
|
||||
Les accessors publics sont :
|
||||
|
||||
```text
|
||||
program_id() -> &Pubkey
|
||||
accounts() -> &[ProgramAccountMeta]
|
||||
data() -> &[u8]
|
||||
```
|
||||
|
||||
La construction consomme directement les `Vec` fournis. Aucun clone interne, conversion vers `solana-instruction` ou sérialisation n'est ajouté.
|
||||
|
||||
## 4. Bornes d'admission
|
||||
|
||||
Les deux plafonds sont désormais matérialisés :
|
||||
|
||||
```text
|
||||
MAX_PROGRAM_INSTRUCTION_ACCOUNTS = 255
|
||||
MAX_PROGRAM_INSTRUCTION_DATA_LEN = 10_240
|
||||
```
|
||||
|
||||
`try_new` vérifie en `usize` :
|
||||
|
||||
```text
|
||||
accounts.len() <= 255
|
||||
data.len() <= 10_240
|
||||
```
|
||||
|
||||
Canaris exacts :
|
||||
|
||||
```text
|
||||
255 accounts accepté
|
||||
256 accounts refusé
|
||||
10_240 octets data accepté
|
||||
10_241 octets data refusé
|
||||
```
|
||||
|
||||
Ces valeurs restent des bornes d'admission Interface fondées sur les plafonds Solana CPI audités en `pre.001`. Elles ne garantissent pas qu'une instruction rentre dans une transaction top-level complète.
|
||||
|
||||
## 5. Sémantique passive
|
||||
|
||||
Restent valides :
|
||||
|
||||
```text
|
||||
accounts vides
|
||||
data vide
|
||||
Program Pubkey inconnu du registry Core
|
||||
doublons d'accounts
|
||||
ordre arbitraire des account metas
|
||||
payload opaque quelconque sous la borne
|
||||
```
|
||||
|
||||
Interface n'ajoute aucune politique signer/writable, aucun lookup de Program ID, aucune déduplication et aucune interprétation du payload.
|
||||
|
||||
## 6. Erreurs
|
||||
|
||||
Les deux violations de borne réutilisent :
|
||||
|
||||
```text
|
||||
interface.program_instruction_limit_exceeded
|
||||
```
|
||||
|
||||
via `ksp_core_lib::Error/Result`.
|
||||
|
||||
Le contexte d'erreur est limité à :
|
||||
|
||||
```text
|
||||
field
|
||||
actual_len
|
||||
maximum_len
|
||||
```
|
||||
|
||||
Aucun octet `data`, aucun account arbitraire et aucun payload externe n'est copié dans l'erreur.
|
||||
|
||||
Le code conceptuel `invalid_program_instruction` reste absent : la foundation ne possède toujours aucun invariant de forme distinct des deux limites.
|
||||
|
||||
## 7. Debug borné
|
||||
|
||||
`ProgramInstruction` n'utilise pas un `derive(Debug)` qui imprimerait les deux `Vec`.
|
||||
|
||||
Son `Debug` manuel expose uniquement :
|
||||
|
||||
```text
|
||||
program_id
|
||||
account_count
|
||||
data_len
|
||||
```
|
||||
|
||||
Les account metas et le payload sont volontairement absents du rendu.
|
||||
|
||||
## 8. Logging
|
||||
|
||||
La décision de `pre.002` reste inchangée : cette crate est passive.
|
||||
|
||||
Restent absents :
|
||||
|
||||
```text
|
||||
ksp-logging-lib
|
||||
src/constants.rs
|
||||
TRACING_TARGET
|
||||
tracing direct
|
||||
```
|
||||
|
||||
Une erreur de validation de borne est une valeur retournée au caller, pas un événement runtime à logger depuis Interface.
|
||||
|
||||
## 9. Tests
|
||||
|
||||
Les unit tests de `ProgramInstruction` couvrent :
|
||||
|
||||
```text
|
||||
accounts/data vides acceptés
|
||||
Program Pubkey opaque accepté
|
||||
ordre et doublons préservés
|
||||
payload opaque préservé
|
||||
255 / 256 accounts
|
||||
10_240 / 10_241 octets data
|
||||
code/message/contexte d'erreur sûr
|
||||
Debug résumé sans payload ni account flags
|
||||
```
|
||||
|
||||
`tests/public_api.rs` ajoute un canari de consommation crate-root de `ProgramInstruction` et de `MAX_PROGRAM_INSTRUCTION_DATA_LEN`.
|
||||
|
||||
`tests/dependency_boundary.rs` est avancé à `pre.004` et confirme toujours :
|
||||
|
||||
```text
|
||||
ksp-core-lib seule dépendance normale
|
||||
aucun serde/borsh/bincode/wincode
|
||||
aucun solana-instruction
|
||||
aucun logging/runtime
|
||||
ProgramInstruction présent via façade explicite
|
||||
```
|
||||
|
||||
## 10. Fichiers ajoutés
|
||||
|
||||
```text
|
||||
crates/ksp-interface-lib/src/program_instruction.rs
|
||||
crates/ksp-interface-lib/unit_tests/program_instruction.rs
|
||||
deltas/0.2.13/pre.004.md
|
||||
```
|
||||
|
||||
## 11. Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-interface-lib/src/lib.rs
|
||||
crates/ksp-interface-lib/tests/dependency_boundary.rs
|
||||
crates/ksp-interface-lib/tests/public_api.rs
|
||||
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
|
||||
docs/validation/016-V0_2_13_INTERFACE.md
|
||||
```
|
||||
|
||||
## 12. Fichiers volontairement inchangés
|
||||
|
||||
```text
|
||||
README.md
|
||||
ROADMAP.md
|
||||
CHANGELOG.md
|
||||
.env.example
|
||||
crates/ksp-interface-lib/Cargo.toml
|
||||
crates/ksp-interface-lib/README.md
|
||||
crates/ksp-interface-lib/USAGE.md
|
||||
crates/ksp-interface-lib/src/error.rs
|
||||
crates/ksp-interface-lib/src/program_account_meta.rs
|
||||
crates/ksp-interface-lib/unit_tests/program_account_meta.rs
|
||||
docs/architecture/**
|
||||
prompts/**
|
||||
config/**
|
||||
```
|
||||
|
||||
## 13. Gate attendu
|
||||
|
||||
Après application de l'overlay :
|
||||
|
||||
```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 test --workspace` est particulièrement requis ici puisqu'il n'était pas présent dans la preuve opérateur fournie pour `pre.003`.
|
||||
|
||||
## 14. Suite autorisée
|
||||
|
||||
Après gate vert, `pre.005` doit rester une tranche de hardening :
|
||||
|
||||
```text
|
||||
cas adversariaux complémentaires
|
||||
consumer externe
|
||||
surface crate-root
|
||||
firewall source/manifest
|
||||
graphes Cargo
|
||||
canari de complétude du premier lot
|
||||
```
|
||||
|
||||
Aucun second domaine wire, codec générique ou comportement Program ne doit être ajouté opportunément.
|
||||
Reference in New Issue
Block a user