v0.2.14-pre.005

This commit is contained in:
2026-08-28 15:12:59 +02:00
parent bcf2f16c05
commit 0319794e59
6 changed files with 589 additions and 10 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md -->
<!-- version: 4 -->
<!-- version: 5 -->
# Plan `0.2.14` — Program API foundation
@@ -555,13 +555,15 @@ Aucun trait decoder, recognition, outcome, registry, codec, runtime logging ou e
### `pre.004` — `ProgramInstructionDecoder` + external implementation
**Statut : matérialisé ; gate opérateur à confirmer.**
**Statut : alisé ; gate opérateur intégralement PASS.**
Le trait `ProgramInstructionDecoder: Send + Sync` expose l'associated type `Decoded`, `program_ids`, `recognize` et `decode`. Un test d'intégration downstream-style l'implémente avec un type décodé tiers et un `Pubkey` explicitement absent du registry Core. L'implémentation ne requiert ni `ksp-program-lib`, ni enum centrale, ni `Any`, JSON ou codec.
### `pre.005` — Adversarial/API hardening + completeness
Verrouiller bounds/Debug/error safety, exact export inventory, absence de closed-world enum, absence de serde/codec/logging/runtime et scope négatif registry/preparer/payload canonique.
**Statut : matérialisé ; gate opérateur à confirmer.**
Deux canaris de fermeture sont ajoutés : `release_completeness.rs` verrouille l'inventaire exact des exports/modules et l'absence de surface closed-world/runtime ; `security_hardening.rs` couvre input Interface maximal, erreur sûre sur payload hostile et associated output sans bound implicite. Aucun contrat fonctionnel n'est ajouté.
### `pre.006` — Gate technique final
@@ -649,6 +651,30 @@ Le canari externe utilise uniquement la façade `ksp_program_api::*` pour l'impl
`pre.005` reste une tranche de hardening/completeness : elle ne doit pas élargir le contrat fonctionnel.
## 13.4 État préparé après `pre.005`
Le gate opérateur `pre.004` fourni le 28 août 2026 est intégralement vert : audits Rust/Markdown, check, Clippy, tests ciblés, workspace complet, canari externe et graphes Cargo passent.
La tranche `pre.005` ajoute uniquement des preuves de fermeture :
```text
exact crate-root exports 10 exports explicitement verrouillés
production modules lib + decode vocabulary + decoder trait uniquement
public enums Recognition + DecodeOutcome uniquement
public traits ProgramInstructionDecoder uniquement
closed-world Program enum absent
registry / descriptors / preparer absents
serde / JSON / Any / codecs absents
logging / runtime / IO absents
max Interface instruction consommable par référence
malformed hostile payload Err Core sûr sans copie automatique du payload
associated Decoded bounds aucun bound implicite ajouté
dyn heterogeneous registry aucune promesse
normal dependencies inchangées : Core + Interface
```
`pre.006` reste un gate technique final sans développement fonctionnel.
## 14. Hors périmètre confirmé
```text

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/017-V0_2_14_PROGRAM_API.md -->
<!-- version: 4 -->
<!-- version: 5 -->
# Validation `0.2.14` — Program API foundation
@@ -66,7 +66,7 @@ aucun ksp-program-lib
aucun module privé
```
Ce canari remplace toute affirmation documentaire non exécutable d'extensibilité. Son gate opérateur reste à confirmer avant de déclarer la tranche close.
Ce canari remplace toute affirmation documentaire non exécutable d'extensibilité. Son gate opérateur `pre.004` est confirmé intégralement vert.
## 5. Dependency firewall cible
@@ -103,8 +103,8 @@ tracing
| Gate | Attendu | Statut initial |
|---------------------------|--------------------------------------------------------------------------|----------------|
| unknown Program Pubkey | utilisable sans registry Core | PASS `pre.004` |
| max Interface input | decoder consomme l'input déjà borné sans nouvelle allocation obligatoire | PENDING |
| malformed program payload | `Err` ou `Unsupported` selon contrat, sans payload dans l'erreur | PENDING |
| max Interface input | decoder consomme l'input déjà borné sans nouvelle allocation obligatoire | PASS `pre.005` |
| malformed program payload | `Err` ou `Unsupported`; aucun echo n'est ajouté par le contrat | PASS `pre.005` |
| Debug recognition | aucun payload | PASS |
| Debug outcome | contenu `Decoded` non rendu automatiquement | PASS |
| default methods | aucun default method susceptible de masquer panic/policy | PASS `pre.004` |
@@ -225,4 +225,46 @@ Ce gate autorise l'ouverture de `pre.004`.
| registry / descriptor / payload D3 | ABSENT | hors scope maintenu |
| serde / codec / logging / runtime | ABSENT | dependency firewall inchangé |
Le canari d'implémentation consomme la façade `ksp_program_api` pour le trait, les types et les outcomes. Le registry Core n'est utilisé que par l'assertion de test négative et n'est pas réexporté par Program API. Le gate opérateur de cet overlay reste requis avant `pre.005`.
Le canari d'implémentation consomme la façade `ksp_program_api` pour le trait, les types et les outcomes. Le registry Core n'est utilisé que par l'assertion de test négative et n'est pas réexporté par Program API. Le gate opérateur de `pre.004` est confirmé intégralement vert et autorise `pre.005`.
## 12. Gate opérateur `pre.004`
Le gate fourni le 28 août 2026 est intégralement vert :
```text
cargo fmt --all PASS
audit Rust général / exports / workspace PASS
audit Markdown PASS — 172 tables / 121 fichiers
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-program-api PASS — 11 tests Rust
cargo test --workspace PASS
cargo tree -p ksp-program-api --edges normal PASS — Core + Interface uniquement
cargo tree --duplicates exécuté, inventaire workspace observé
```
Ce gate autorise l'ouverture de `pre.005`.
## 13. État préparé `pre.005`
| Critère | Statut | Preuve |
|--------------------------------------|--------|----------------------------------------------------------------------|
| exact crate-root export inventory | PASS | test `release_completeness` sur les 10 réexports |
| exact production module inventory | PASS | `lib.rs`, decode vocabulary et decoder trait uniquement |
| public enum inventory | PASS | Recognition + DecodeOutcome uniquement |
| closed-world Program enum | ABSENT | aucun `ProgramKind`/inventaire public central |
| registry / descriptors | ABSENT | aucune collection/runtime selection/identity-version-coverage |
| `ProgramExecutionPreparer` | ABSENT | scope négatif maintenu |
| serde / JSON / Any / codecs | ABSENT | manifest + source canaries |
| logging / runtime / IO | ABSENT | aucune dépendance ou primitive runtime/FS/env/network |
| max Interface input | PASS | 255 accounts + 10 240 bytes traversent le trait par référence |
| malformed hostile payload | PASS | `Result::Err` Core reste sûr sans echo automatique du payload |
| Debug outcome | PASS | valeur décodée jamais formatée |
| associated `Decoded` implicit bounds | ABSENT | canari avec output `Rc<Cell<_>>`, donc non-`Send`/non-`Sync` accepté |
| dyn heterogeneous claim | ABSENT | aucun `dyn ProgramInstructionDecoder`/registry |
| dépendances normales | PASS | `ksp-core-lib` + `ksp-interface-lib` uniquement |
La sécurité des messages/contextes produits volontairement par une implémentation tierce reste sa responsabilité ; `ksp-program-api` garantit seulement qu'il n'ajoute aucun canal parallèle ni copie automatique du payload hostile.
Le gate opérateur de `pre.005` doit confirmer ces canaris avant le gate technique final `pre.006`.