v0.2.14-pre.004

This commit is contained in:
2026-08-28 14:21:21 +02:00
parent 27d4cb1f36
commit bcf2f16c05
11 changed files with 649 additions and 89 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Plan `0.2.14` — Program API foundation
@@ -549,13 +549,15 @@ Aucun trait decoder, recognition, outcome, registry, codec, runtime logging ou e
### `pre.003` — Recognition + outcome minimal
**Statut : matérialisé ; gate opérateur à confirmer.**
**Statut : alisé ; gate opérateur intégralement PASS.**
`ProgramInstructionRecognition` et `ProgramInstructionDecodeOutcome<Decoded>` sont ajoutés dans un module privé puis réexportés depuis le crate-root. Les deux enums sont `#[non_exhaustive]`. Le `Debug` de l'outcome est manuel, ne requiert pas `Decoded: Debug` et n'affiche jamais la valeur décodée. Aucun descriptor, registry ou trait decoder n'est avancé.
### `pre.004` — `ProgramInstructionDecoder` + external implementation
Introduire le trait `Send + Sync` avec associated output, `program_ids`, `recognize`, `decode`, puis prouver une implémentation depuis une crate externe avec Program Pubkey non enregistré.
**Statut : matérialisé ; gate opérateur à confirmer.**
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
@@ -620,7 +622,32 @@ registry / canonical payload / preparer absents
normal dependencies inchangées : Core + Interface
```
Les tests unitaires vérifient notamment qu'un type décodé externe dépourvu de `Debug` peut être contenu et formaté via l'outcome sans exposer sa valeur. Le passage à `pre.004` reste conditionné au gate opérateur de cet overlay.
Les tests unitaires vérifient notamment qu'un type décodé externe dépourvu de `Debug` peut être contenu et formaté via l'outcome sans exposer sa valeur. Le gate opérateur `pre.003` fourni le 28 août 2026 est intégralement vert et autorise `pre.004`.
## 13.3 État préparé après `pre.004`
La tranche matérialise exactement :
```text
ProgramInstructionDecoder public depuis le crate-root
supertraits Send + Sync
associated output type Decoded possédé par l'implémentation
program_ids &[Pubkey] opaque/open-world
recognize &ProgramInstruction -> Recognition
decode &ProgramInstruction -> Result<Outcome<Self::Decoded>>
default methods aucun
external implementation canary présent comme crate d'intégration séparée
external decoded type défini hors code de production KSP
external Program Pubkey explicitement absent du registry Core
central Program enum / Any / JSON absents
registry dyn / descriptor / D3 payload absents
ProgramExecutionPreparer absent
normal dependencies inchangées : Core + Interface
```
Le canari externe utilise uniquement la façade `ksp_program_api::*` pour l'implémentation du trait ; l'accès direct à `ksp_core_lib::find_program_pubkey` est limité à l'assertion de test prouvant que le Program choisi n'est pas enregistré. Aucune API de registry n'est réexportée par Program API.
`pre.005` reste une tranche de hardening/completeness : elle ne doit pas élargir le contrat fonctionnel.
## 14. Hors périmètre confirmé