Files
khadhroony-solana-project/deltas/0.2.13/pre.003.md
2026-08-28 05:04:10 +02:00

273 lines
7.1 KiB
Markdown

<!-- file: deltas/0.2.13/pre.003.md -->
<!-- version: 1 -->
# Delta `0.2.13-pre.003` — `ProgramAccountMeta` + borne accounts
## 1. Base requise
Cette tranche s'applique exclusivement sur :
```text
v0.2.12
+ 0.2.13-pre.001
+ 0.2.13-pre.002
```
Le gate opérateur fourni pour `pre.002` est intégralement vert :
```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 test --workspace PASS
cargo tree -p ksp-interface-lib --edges normal inspecté
cargo tree --duplicates inspecté
```
Le graphe ciblé confirme :
```text
ksp-interface-lib
└── ksp-core-lib
└── solana-pubkey 4.3.0
```
Aucune dépendance codec/runtime n'est introduite par Interface et les doublons workspace observés sont préexistants à cette crate.
La version workspace passe de :
```text
0.2.13-pre.2
```
à :
```text
0.2.13-pre.3
```
## 2. Objectif
Matérialiser uniquement la primitive passive représentant un account meta d'instruction Program, figer la borne publique du nombre d'account metas et introduire le code d'erreur Interface minimal nécessaire à la future admission de `ProgramInstruction`.
La tranche ajoute :
```text
ProgramAccountMeta
MAX_PROGRAM_INSTRUCTION_ACCOUNTS = 255
ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED
unit tests de la primitive
public API canaries correspondants
```
Elle n'ajoute pas encore :
```text
ProgramInstruction
MAX_PROGRAM_INSTRUCTION_DATA_LEN
enforcement de collection 255/256
data payload
Debug résumé d'instruction
serde / serde_json
borsh / bincode / wincode
solana-instruction
logging/runtime
Program behavior
```
## 3. `ProgramAccountMeta`
La primitive possède trois champs privés :
```text
Pubkey
is_signer
is_writable
```
Les constructeurs publics sont :
```text
ProgramAccountMeta::readonly(pubkey, is_signer)
ProgramAccountMeta::writable(pubkey, is_signer)
```
Les accessors publics sont :
```text
pubkey()
is_signer()
is_writable()
```
Le type reste strictement passif :
- aucune validation de registry Program n'est appliquée au `Pubkey` ;
- aucune policy signer/writable n'est inventée ;
- aucune sérialisation ou conversion vers `solana-instruction::AccountMeta` n'est ajoutée ;
- les champs privés empêchent une dérive future de représentation sans passer par l'API possédée par Interface.
## 4. Borne accounts
La façade expose :
```rust
pub const MAX_PROGRAM_INSTRUCTION_ACCOUNTS: usize = 255;
```
Cette constante fixe le plafond d'admission retenu par le plan `0.2.13`.
`pre.003` ne crée volontairement aucune collection artificielle autour de `ProgramAccountMeta` uniquement pour tester `255/256`. L'enforcement concret sera réalisé dans `ProgramInstruction::try_new` à `pre.004`, lorsque la collection existera réellement.
La borne data `10_240` reste également réservée à `pre.004` avec le payload qu'elle protège.
## 5. Modèle d'erreur minimal
Interface continue d'utiliser `ksp_core_lib::Error`, `ErrorCode` et `Result`; aucun second type d'erreur n'est introduit.
La seule catégorie matérialisée est :
```text
interface.program_instruction_limit_exceeded
```
via :
```text
ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED
```
Le code `invalid_program_instruction` n'est pas ajouté : aucun invariant de forme distinct des bornes n'existe encore dans la foundation. Le créer uniquement par symétrie serait prématuré.
À `pre.004`, les erreurs de borne devront limiter leur contexte aux longueurs et plafonds sûrs ; aucun payload ni compte arbitraire ne devra être copié dans les diagnostics.
## 6. Logging
La décision de `pre.002` reste inchangée. Interface est toujours une crate de contrats passifs et n'émet aucun événement/span runtime.
Restent donc absents :
```text
ksp-logging-lib
src/constants.rs
TRACING_TARGET
tracing direct
```
## 7. Tests
Les unit tests de `ProgramAccountMeta` couvrent :
```text
readonly -> identité/signature conservées, writable=false
writable -> identité/signature conservées, writable=true
Pubkey opaque/non registry accepté
MAX_PROGRAM_INSTRUCTION_ACCOUNTS == 255
```
`tests/public_api.rs` prouve depuis le crate-root :
```text
construction readonly/writable
accessors publics
borne accounts publique
code d'erreur stable et typé par ksp_core_lib::ErrorCode
```
`tests/dependency_boundary.rs` conserve le firewall `pre.002` et vérifie désormais que :
```text
ProgramAccountMeta est présent
MAX_PROGRAM_INSTRUCTION_ACCOUNTS est présent
ERROR_CODE_PROGRAM_INSTRUCTION_LIMIT_EXCEEDED est présent
ProgramInstruction reste absent
logging/runtime restent absents
```
## 8. Fichiers ajoutés
```text
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
deltas/0.2.13/pre.003.md
```
## 9. 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
```
## 10. 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
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/**
```
README/USAGE restent dans leur lane de réconciliation finale `pre.007`; aucune documentation durable hors plan/validation n'est rouverte pour cette petite tranche fonctionnelle.
## 11. 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 nouveau PASS Cargo n'est donc revendiqué localement.
## 12. 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
```
Une correction découverte par ce gate reste un `0.2.13-pre.003-fix.NNN` et n'avance pas `pre.004`.
## 13. Suite
Après gate vert, `pre.004` pourra matérialiser uniquement :
```text
ProgramInstruction { program_id, accounts, data }
MAX_PROGRAM_INSTRUCTION_DATA_LEN = 10_240
try_new borné
accessors
Debug résumé sans payload
acceptation 0/255 accounts et 0/10_240 data
rejet 256 accounts et 10_241 data
ordre et doublons conservés
contextes d'erreur sûrs
```
Aucun serde/codec ou comportement Program ne doit être ajouté dans cette tranche suivante.