v0.2.13-pre.004

This commit is contained in:
2026-08-28 05:11:44 +02:00
parent 900444bff5
commit 0ee28eeb95
9 changed files with 582 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/020-V0_2_13_INTERFACE_PLAN.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Plan `0.2.13` — Interface / wire foundation
@@ -389,13 +389,13 @@ Créer la crate, l'ajouter au workspace, poser `lib.rs` avec exports explicites,
### pre.003 — `ProgramAccountMeta` + bornes communes
**Statut : réalisé ; gate opérateur à confirmer.**
**Statut : réalisé ; fmt/audits/check/Clippy/tests Interface PASS, `cargo test --workspace` non fourni dans la preuve opérateur.**
Matérialiser la primitive de compte ordonné, la borne accounts, le modèle d'erreur Interface minimal et les unit/public canaries associés. `ProgramInstruction` et la borne data restent réservés à `pre.004`.
### pre.004 — `ProgramInstruction` passif borné
**Statut : pvu**
**Statut : réalisé ; gate opérateur à confirmer.**
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.
@@ -502,4 +502,36 @@ La constante `255` ferme le contrat public de borne accounts mais son enforcemen
Une seule catégorie d'erreur Interface est introduite. `invalid_program_instruction` reste absent : aucun invariant de forme distinct des limites n'est encore matérialisé et le créer par symétrie serait prématuré. Les futures erreurs de borne doivent utiliser `ksp_core_lib::Error/Result` et ne projeter que des longueurs/plafonds sûrs.
Le passage à `pre.004` reste conditionné au gate opérateur complet sur l'overlay `pre.003`.
La preuve opérateur fournie pour `pre.003` confirme fmt, audits, `cargo check`, Clippy, tests ciblés Interface et graphes Cargo. `cargo test --workspace` n'apparaît pas dans cette preuve ; il doit donc être rejoué au gate de `pre.004` avant de déclarer la continuité workspace complète.
## 18. État préparé `pre.004`
`pre.004` matérialise le second et dernier type du premier lot wire générique retenu :
```text
ProgramInstruction présent
fields privés
program_id Pubkey Core
accounts Vec<ProgramAccountMeta> consommé
data Vec<u8> opaque consommé
MAX_PROGRAM_INSTRUCTION_ACCOUNTS 255
MAX_PROGRAM_INSTRUCTION_DATA_LEN 10_240
try_new bornes accounts puis data
accounts 255 / 256 accepté / refusé
data 10_240 / 10_241 accepté / refusé
accounts/data vides acceptés
ordre/doublons préservés
Program Pubkey non registry accepté
Debug program_id/account_count/data_len uniquement
serde / borsh / bincode / wincode absents
solana-instruction absent
ksp-logging-lib / constants.rs / TRACING_TARGET absents
```
`ProgramInstruction::try_new` consomme les deux `Vec` fournis et compare leurs longueurs en `usize` avant stockage dans l'objet. La foundation n'ajoute aucun clone, cast étroit ou allocation de conversion. Une allocation éventuellement déjà réalisée par l'appelant pour construire le `Vec` reste naturellement hors du contrôle de l'API.
Les deux limites utilisent le code commun `interface.program_instruction_limit_exceeded`. Le contexte d'erreur est volontairement réduit à `field`, `actual_len` et `maximum_len`; aucune donnée du payload ni aucun account arbitraire n'est recopié dans le diagnostic.
Le `Debug` manuel n'imprime ni la collection accounts ni les octets `data`. Il expose uniquement l'identité publique du programme et les deux longueurs structurelles utiles au diagnostic.
Le passage à `pre.005` doit désormais se concentrer sur les canaris adversariaux/consumer externe/API/dependency hardening, sans ajouter un second domaine wire.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/016-V0_2_13_INTERFACE.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Validation `0.2.13` — Interface / wire foundation
@@ -142,10 +142,10 @@ Si une nouvelle dépendance externe apparaît après `pre.001`, la présente mat
| Famille | Attendu | Statut |
|--------------------------|-------------------------------------------------|--------------|
| unit tests privés | account meta/borne puis instruction/adversarial | PARTIEL |
| `tests/public_api.rs` | consommation crate-root uniquement | PASS pre.003 |
| 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.002 |
| 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 |
@@ -234,3 +234,28 @@ Le passage à `pre.003` reste conditionné au gate opérateur complet sur l'over
| 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.