v0.2.14-pre.007

This commit is contained in:
2026-08-28 16:16:15 +02:00
parent 4eba9be48c
commit 2cf00e9426
10 changed files with 421 additions and 76 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 319 # version: 320
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-wallet-lib"] members = ["crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-wallet-lib"]
[workspace.package] [workspace.package]
version = "0.2.14-pre.6" version = "0.2.14-pre.7"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,15 +1,15 @@
<!-- file: crates/ksp-program-api/README.md --> <!-- file: crates/ksp-program-api/README.md -->
<!-- version: 3 --> <!-- version: 4 -->
# ksp-program-api # ksp-program-api
`ksp-program-api` est la façade publique ouverte du domaine Program KSP. Elle est destinée aux implémentations officielles futures comme aux crates Program externes et ne possède pas les implémentations concrètes. `ksp-program-api` est la façade publique ouverte du domaine Program KSP. Elle porte uniquement les contrats communs nécessaires aux implémentations Program officielles futures comme aux crates externes ; elle ne possède aucun decoder concret, registry runtime, payload canonique DECODE ni logique d'exécution.
À partir de `0.2.14-pre.004`, la foundation expose les types Core/Interface retenus, le vocabulaire minimal de reconnaissance/décodage et le trait instruction-only `ProgramInstructionDecoder`. La surface candidate de `0.2.14` est volontairement **instruction-only** et reste indépendante des couches runtime supérieures.
## Ownership ## Ownership
La crate dépend uniquement de : Le graphe normal est limité à :
```text ```text
ksp-program-api ksp-program-api
@@ -43,51 +43,11 @@ ProgramInstructionDecodeOutcome<Decoded>
ProgramInstructionDecoder ProgramInstructionDecoder
``` ```
`ksp-program-api` réexporte l'ensemble depuis son crate-root. Aucun module interne n'est public. `ksp-program-api` réexporte toute sa surface consommable depuis son crate-root. Aucun module interne n'est public.
## Recognition ## Surface publique candidate
`ProgramInstructionRecognition` est `#[non_exhaustive]` : L'inventaire crate-root de `0.2.14` contient exactement :
```text
NoMatch l'implémentation ne revendique pas l'instruction
ProgramMatch le Program ou la famille correspond, sans reconnaissance exacte
ExactMatch l'implémentation affirme un match instruction-local exact
```
Cette reconnaissance ne contient aucun score, priorité, proof, confidence, discriminator textuel ou inventaire central de Programs.
## Decode outcome
`ProgramInstructionDecodeOutcome<Decoded>` est `#[non_exhaustive]` :
```text
Decoded(Decoded) valeur typée possédée par l'implémentation
Unsupported instruction connue mais non supportée par cette capability
```
Les échecs réels passent par le `Result` Core. Il n'existe aucune variante parallèle `Failed`.
Le `Debug` de l'outcome n'impose pas `Decoded: Debug` et n'affiche jamais la valeur `Decoded`.
## Decoder instruction-only
`ProgramInstructionDecoder` est un trait ouvert `Send + Sync` :
```text
type Decoded
program_ids(&self) -> &[Pubkey]
recognize(&self, &ProgramInstruction) -> ProgramInstructionRecognition
decode(&self, &ProgramInstruction) -> Result<ProgramInstructionDecodeOutcome<Self::Decoded>>
```
Le type `Decoded` est possédé par l'implémentation. Un decoder externe peut utiliser un `Pubkey` absent du registry Core : aucun enum central, `Any`, JSON ou descriptor global n'est requis pour déclarer un Program.
Le trait ne fournit aucun default method et ne promet pas de registry dyn hétérogène. `program_ids` et `recognize` servent à la sélection explicite ; `decode` traite une instruction déjà sélectionnée pour le decoder.
## Surface actuelle
La façade `pre.004` expose :
```text ```text
Error Error
@@ -102,9 +62,72 @@ ProgramInstructionDecodeOutcome<Decoded>
ProgramInstructionDecoder ProgramInstructionDecoder
``` ```
Les canaris de release completeness verrouillent cet inventaire ainsi que les trois fichiers/modules Rust de production de la crate.
## Recognition
`ProgramInstructionRecognition` est `#[non_exhaustive]` :
```text
NoMatch l'implémentation ne revendique pas l'instruction
ProgramMatch le Program correspond, sans reconnaissance instruction-local exacte
ExactMatch l'implémentation affirme un match instruction-local exact
```
La reconnaissance ne porte aucun score, priorité, proof, confidence, discriminator textuel ni inventaire central de Programs. `ExactMatch` reste une affirmation de l'implémentation, pas une preuve indépendante produite par KSP.
## Decode outcome
`ProgramInstructionDecodeOutcome<Decoded>` est `#[non_exhaustive]` :
```text
Decoded(Decoded) valeur typée possédée par l'implémentation
Unsupported instruction reconnue mais non supportée par cette capability
```
Les échecs réels utilisent le `Result` Core. Il n'existe aucune variante parallèle `Failed` ou `Ignored`.
Le `Debug` de l'outcome n'impose pas `Decoded: Debug` et n'affiche jamais la valeur `Decoded`.
## Decoder instruction-only
`ProgramInstructionDecoder` est un trait ouvert `Send + Sync` :
```text
type Decoded
program_ids(&self) -> &[Pubkey]
recognize(&self, &ProgramInstruction) -> ProgramInstructionRecognition
decode(&self, &ProgramInstruction) -> Result<ProgramInstructionDecodeOutcome<Self::Decoded>>
```
`Decoded` ne reçoit aucun bound implicite supplémentaire : une implémentation reste propriétaire de son type de sortie concret. Le trait ne fournit aucun default method et ne promet pas de composition `dyn` hétérogène.
`program_ids()` expose des `Pubkey` opaques ; une implémentation externe peut prendre en charge un Program ID absent du registry Core. Aucun enum central, `Any`, JSON ou descriptor global n'est nécessaire.
`program_ids` et `recognize` servent à la sélection explicite. `decode` consomme par référence une `ProgramInstruction` déjà admise/bornée par Interface et déjà sélectionnée pour le decoder.
## Hardening validé
La candidate verrouille notamment :
```text
Program Pubkey non enregistré accepté
input Interface maximal 255 accounts + 10_240 bytes accepté à la frontière decoder
payload hostile aucun echo automatique ajouté par Program API
Debug outcome valeur Decoded jamais rendue
associated Decoded aucun Debug/Clone/Send/Sync imposé
closed-world Program enum absent
registry / descriptors / priority absents
ProgramExecutionPreparer absent
serde / JSON / Any / codecs absents
logging / runtime / filesystem / environment / I/O absents
```
Une implémentation tierce reste responsable du contenu des erreurs qu'elle construit explicitement. `ksp-program-api` garantit seulement qu'il n'ajoute aucun canal parallèle ni copie automatique du payload d'entrée.
## Frontières ## Frontières
La foundation ne contient pas : La foundation `0.2.14` ne contient pas :
```text ```text
ksp-program-lib ksp-program-lib
@@ -123,7 +146,7 @@ logging / tracing
Wallet / Transport / Store / Materializer / Config / Tauri Wallet / Transport / Store / Materializer / Config / Tauri
``` ```
L'absence de ces surfaces est volontaire : `ksp-program-api` reste une API déclarative, ouverte et indépendante des implémentations/runtime supérieurs. Ces surfaces restent reportées jusqu'aux vertical slices qui démontreront leurs contrats réels. En particulier, les codecs wire officiels restent possédés par `ksp-interface-lib` et ne sont introduits qu'en présence d'un protocole réel.
## Références ## Références

View File

@@ -1,9 +1,9 @@
<!-- file: crates/ksp-program-api/USAGE.md --> <!-- file: crates/ksp-program-api/USAGE.md -->
<!-- version: 3 --> <!-- version: 4 -->
# Usage de ksp-program-api # Usage de ksp-program-api
Cette page décrit la surface publique disponible à partir de `0.2.14-pre.004`. Utiliser uniquement les exports du crate-root ; aucun module interne ne fait partie du contrat consommable. Cette page décrit la surface publique candidate de `0.2.14`. Utiliser uniquement les exports du crate-root ; aucun module interne ne fait partie du contrat consommable.
## Construire un input Program avec la façade ## Construire un input Program avec la façade
@@ -21,7 +21,7 @@ let instruction = ksp_program_api::ProgramInstruction::try_new(
assert!(instruction.is_ok()); assert!(instruction.is_ok());
``` ```
`Pubkey`, `ProgramAccountMeta` et `ProgramInstruction` conservent leur ownership Core/Interface. `Pubkey`, `ProgramAccountMeta` et `ProgramInstruction` conservent leur ownership Core/Interface. Les bornes `255` account metas et `10_240` bytes de data sont appliquées par Interface avant l'entrée dans le decoder.
## Implémenter un decoder externe ## Implémenter un decoder externe
@@ -50,6 +50,11 @@ impl ksp_program_api::ProgramInstructionDecoder for ExternalDecoder {
if instruction.program_id() != &self.program_ids[0] { if instruction.program_id() != &self.program_ids[0] {
return ksp_program_api::ProgramInstructionRecognition::NoMatch; return ksp_program_api::ProgramInstructionRecognition::NoMatch;
} }
if instruction.data().first() == std::option::Option::Some(&0x2A_u8) {
return ksp_program_api::ProgramInstructionRecognition::ExactMatch;
}
return ksp_program_api::ProgramInstructionRecognition::ProgramMatch; return ksp_program_api::ProgramInstructionRecognition::ProgramMatch;
} }
@@ -58,13 +63,14 @@ impl ksp_program_api::ProgramInstructionDecoder for ExternalDecoder {
instruction: &ksp_program_api::ProgramInstruction, instruction: &ksp_program_api::ProgramInstruction,
) -> ksp_program_api::Result<ksp_program_api::ProgramInstructionDecodeOutcome<Self::Decoded>> { ) -> ksp_program_api::Result<ksp_program_api::ProgramInstructionDecodeOutcome<Self::Decoded>> {
let opcode = match instruction.data().first() { let opcode = match instruction.data().first() {
std::option::Option::Some(value) => *value, std::option::Option::Some(value) if *value == 0x2A_u8 => *value,
std::option::Option::None => { _ => {
return std::result::Result::Ok( return std::result::Result::Ok(
ksp_program_api::ProgramInstructionDecodeOutcome::Unsupported, ksp_program_api::ProgramInstructionDecodeOutcome::Unsupported,
); );
} }
}; };
return std::result::Result::Ok( return std::result::Result::Ok(
ksp_program_api::ProgramInstructionDecodeOutcome::Decoded( ksp_program_api::ProgramInstructionDecodeOutcome::Decoded(
ExternalDecodedInstruction { opcode }, ExternalDecodedInstruction { opcode },
@@ -94,7 +100,7 @@ match recognition {
} }
``` ```
L'enum est `#[non_exhaustive]`. `decode` n'est pas un substitut à `recognize` : il traite une instruction déjà sélectionnée pour le decoder. L'enum est `#[non_exhaustive]`. `ExactMatch` exprime l'affirmation du decoder. `decode` n'est pas un substitut à `recognize` : il traite une instruction déjà sélectionnée pour cette implémentation.
## Outcome et erreur ## Outcome et erreur
@@ -115,6 +121,18 @@ match outcome {
Une erreur réelle est un `Err(ksp_program_api::Error)`. `Unsupported` n'est pas une deuxième forme d'erreur : il indique qu'une instruction reconnue n'est volontairement pas décodée par cette capability. Une erreur réelle est un `Err(ksp_program_api::Error)`. `Unsupported` n'est pas une deuxième forme d'erreur : il indique qu'une instruction reconnue n'est volontairement pas décodée par cette capability.
Program API ne recopie automatiquement ni le payload de l'instruction ni les account metas dans l'erreur. Une implémentation externe reste responsable des messages/contextes qu'elle construit explicitement.
## Output sans bounds implicites
L'associated type `Decoded` n'impose pas `Debug`, `Clone`, `Send` ou `Sync`. Les supertraits `Send + Sync` s'appliquent au decoder lui-même, pas à la valeur décodée :
```rust
struct LocalDecoded(std::rc::Rc<std::cell::Cell<u8>>);
```
Un decoder peut utiliser ce type comme `Decoded` tant que son propre état satisfait `Send + Sync`.
## Debug sûr ## Debug sûr
`ProgramInstructionDecodeOutcome<Decoded>` possède un `Debug` volontairement opaque : `ProgramInstructionDecodeOutcome<Decoded>` possède un `Debug` volontairement opaque :
@@ -128,14 +146,15 @@ assert_eq!(std::format!("{outcome:?}"), "Decoded");
`SecretDecoded` n'a pas besoin d'implémenter `Debug` et sa valeur n'est jamais rendue par l'outcome. `SecretDecoded` n'a pas besoin d'implémenter `Debug` et sa valeur n'est jamais rendue par l'outcome.
## Hors surface `pre.004` ## Ce qui n'est pas simulé côté consumer
Il n'existe toujours aucun : Il n'existe dans `0.2.14` aucun :
```text ```text
registry de decoders registry de decoders
composition dyn hétérogène composition dyn hétérogène
identity/version/coverage descriptor identity/version/coverage descriptor
priority/conflict policy
payload canonique D3 payload canonique D3
ProgramAccountDecoder / Event / ReturnData ProgramAccountDecoder / Event / ReturnData
ProgramExecutionPreparer ProgramExecutionPreparer
@@ -144,4 +163,4 @@ serde / JSON / codec
logging / runtime réseau logging / runtime réseau
``` ```
Ces surfaces ne doivent pas être simulées côté consumer. Elles attendent les vertical slices qui justifieront leurs contrats réels. Ces surfaces ne doivent pas être recréées localement comme si elles faisaient déjà partie du contrat commun. Elles attendent les vertical slices qui justifieront leurs invariants réels.

194
deltas/0.2.14/pre.007.md Normal file
View File

@@ -0,0 +1,194 @@
<!-- file: deltas/0.2.14/pre.007.md -->
<!-- version: 1 -->
# Delta `0.2.14-pre.007` — réconciliation documentaire finale Program API
## 1. Base
```text
0.2.14-pre.006
```
Le gate opérateur de `pre.006`, exécuté le **28 août 2026**, est intégralement vert :
```text
cargo fmt --all PASS
audits Rust / export completeness / workspace PASS
audit Markdown PASS — 174 tables / 124 fichiers
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-program-api PASS — 18 tests Rust
cargo test -p ksp-logging-lib --test ownership PASS — 2/2
cargo test --workspace PASS
cargo tree -p ksp-program-api --edges normal PASS — Core + Interface uniquement
cargo tree --duplicates inspecté
```
La lane technique est donc fermée avant cette tranche.
## 2. Objectif
`pre.007` est exclusivement le couloir de réconciliation documentaire finale de `0.2.14` défini par `VER-LIFECYCLE-006`.
Aucun fichier Rust, test, manifest de crate, dépendance, codec, runtime ou comportement n'est modifié. La tranche transforme les README/USAGE initiaux de Program API en références durables et aligne plan, validation, séquence fonctionnelle et index documentaires sur la surface réellement validée.
## 3. Version technique
```text
0.2.14-pre.6
->
0.2.14-pre.7
```
Le bump est mécanique pour une prerelease non-fix. Aucun autre manifest/version applicative n'est synchronisé artificiellement.
Commit/tag prerelease attendu :
```text
v0.2.14-pre.007
```
## 4. Surface finale candidate documentée
```text
ProgramInstructionRecognition
NoMatch / ProgramMatch / ExactMatch
ProgramInstructionDecodeOutcome<Decoded>
Decoded(Decoded) / Unsupported
ProgramInstructionDecoder: Send + Sync
type Decoded
program_ids(&self) -> &[Pubkey]
recognize(&self, &ProgramInstruction) -> ProgramInstructionRecognition
decode(&self, &ProgramInstruction) -> Result<ProgramInstructionDecodeOutcome<Self::Decoded>>
```
La façade crate-root conserve exactement 10 exports et trois modules/fichiers Rust de production. Le type `Decoded` reste possédé par l'implémentation et sans bound implicite `Debug/Clone/Send/Sync`.
## 5. Open-world et hardening final
Les références durables enregistrent les preuves acquises :
```text
Program Pubkey non enregistré accepté
external implementation canary PASS
input Interface maximal 255 accounts + 10_240 bytes
payload hostile aucun echo automatique ajouté par Program API
Debug outcome valeur Decoded non rendue
closed-world Program enum absent
registry / descriptor / priority absents
ProgramExecutionPreparer absent
serde / JSON / Any / codecs absents
logging / runtime / filesystem / environment / I/O absents
```
Une implémentation tierce reste responsable du contenu des erreurs qu'elle produit explicitement ; Program API n'ajoute aucun canal parallèle ni copie automatique du payload hostile.
## 6. Dependency firewall final
Le graphe normal confirmé par l'opérateur reste :
```text
ksp-program-api
├── ksp-core-lib
│ └── solana-pubkey
└── ksp-interface-lib
└── ksp-core-lib
```
Aucun `ksp-program-lib`, runtime, codec, serde, logging, Transport, Store, Wallet, Materializer, Config ou Tauri n'est introduit.
## 7. Références durables réconciliées
```text
crates/ksp-program-api/README.md
crates/ksp-program-api/USAGE.md
docs/000-README.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md
docs/validation/000-README.md
docs/validation/017-V0_2_14_PROGRAM_API.md
```
Le README fixe l'ownership, l'inventaire public exact, les semantics Recognition/Outcome, le trait externe, le hardening et les frontières. `USAGE.md` documente uniquement la façade crate-root, l'implémentation externe, la sélection explicite, le decode outcome, les erreurs et le Debug sûr.
La séquence fonctionnelle enregistre le contenu effectivement livré par `0.2.14` et maintient les reports de `ksp-program-lib`, du payload D3, du registry runtime, des autres familles de decoder et du preparer jusqu'aux vertical slices réels.
## 8. Fichiers ajoutés/modifiés
Ajouté :
```text
deltas/0.2.14/pre.007.md
```
Modifiés :
```text
Cargo.toml
crates/ksp-program-api/README.md
crates/ksp-program-api/USAGE.md
docs/000-README.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md
docs/validation/000-README.md
docs/validation/017-V0_2_14_PROGRAM_API.md
```
Aucun fichier supprimé.
## 9. Surfaces volontairement inchangées
Cette tranche ne touche pas :
```text
crates/ksp-program-api/src/**
crates/ksp-program-api/tests/**
crates/ksp-program-api/Cargo.toml
docs/architecture/**
CHANGELOG.md
ROADMAP.md
prompts/**
```
L'architecture durable `006-WIRE_AND_PROGRAM.md` reste compatible avec la foundation réellement livrée : ses registry/preparer/autres familles sont des surfaces futures explicitement non matérialisées par `0.2.14`.
## 10. Gate opérateur
La tranche étant documentaire hors bump workspace, le gate demandé reste déterministe :
```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.14
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-program-api
cargo test -p ksp-logging-lib --test ownership
cargo test --workspace
```
Aucun smoke réseau/live ni nouveau `cargo tree` n'est requis si l'overlay est appliqué exactement : ces preuves appartiennent à la lane technique fermée par `pre.006`.
## 11. Suite
Si le gate est vert :
```text
0.2.14-pre.008 — préparation minimale de publication
```
`pre.008` reste limitée à :
```text
Cargo.toml
CHANGELOG.md
ROADMAP.md
prompt de démarrage 0.3.1
deltas/0.2.14/pre.008.md
```
Aucun code, test, README/USAGE, plan, validation ou architecture ne doit être rouvert dans cette lane de publication minimale sauf défaut réel découvert au gate.

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/000-README.md --> <!-- file: docs/plans/000-README.md -->
<!-- version: 66 --> <!-- version: 67 -->
# Plans KSP # Plans KSP
@@ -29,7 +29,7 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou
- [`018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) — plan historique clôturé de `0.2.11 — Off-chain price transport`; SOL/USD V1, huit providers REST sans SDK, registry/availability/rate limits Off-chain et Config `std.offchain_transport`. - [`018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) — plan historique clôturé de `0.2.11 — Off-chain price transport`; SOL/USD V1, huit providers REST sans SDK, registry/availability/rate limits Off-chain et Config `std.offchain_transport`.
- [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) — plan historique clôturé de `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk`; il conserve le gabarit 1434/1435, le composite Config, les DTO/commands provider-neutral, lintégration Wallet minimale et les gates live/build finaux. - [`019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](019-V0_2_12_SOL_PRICES_DESK_PLAN.md) — plan historique clôturé de `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk`; il conserve le gabarit 1434/1435, le composite Config, les DTO/commands provider-neutral, lintégration Wallet minimale et les gates live/build finaux.
- [`020-V0_2_13_INTERFACE_PLAN.md`](020-V0_2_13_INTERFACE_PLAN.md) — plan candidat réconcilié de `0.2.13 — Interface / wire foundation`; il fixe la surface finale `ProgramAccountMeta` + `ProgramInstruction`, les bornes `255` / `10_240`, le firewall Interface -> Core, les canaris de complétude/consumer externe et la frontière avec Program API/RAW/CORE. - [`020-V0_2_13_INTERFACE_PLAN.md`](020-V0_2_13_INTERFACE_PLAN.md) — plan candidat réconcilié de `0.2.13 — Interface / wire foundation`; il fixe la surface finale `ProgramAccountMeta` + `ProgramInstruction`, les bornes `255` / `10_240`, le firewall Interface -> Core, les canaris de complétude/consumer externe et la frontière avec Program API/RAW/CORE.
- [`021-V0_2_14_PROGRAM_API_PLAN.md`](021-V0_2_14_PROGRAM_API_PLAN.md) — plan actif de `0.2.14 — Program API foundation`, ouvert par `pre.001`; il fixe une foundation instruction-only ouverte, un output typé par associated type, le report du payload canonique D3, du registry runtime et de `ProgramExecutionPreparer`, ainsi que le canari dimplémentation externe. - [`021-V0_2_14_PROGRAM_API_PLAN.md`](021-V0_2_14_PROGRAM_API_PLAN.md) — plan candidat réconcilié de `0.2.14 — Program API foundation`; il fixe la façade instruction-only ouverte, les enums Recognition/Outcome, `ProgramInstructionDecoder`, l'output associé possédé par l'implémentation, le canari externe avec Program Pubkey non enregistré, le firewall Core/Interface et le report du payload canonique D3, du registry runtime et de `ProgramExecutionPreparer`.
Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre. Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md --> <!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
<!-- version: 94 --> <!-- version: 95 -->
# Séquence des releases fonctionnelles KSP # Séquence des releases fonctionnelles KSP
@@ -528,9 +528,29 @@ Aucune `ksp-interface-api` séparée n'est retenue pour l'instant. Les codecs/la
### `0.2.14` — Program API foundation ### `0.2.14` — Program API foundation
Introduire `ksp-program-api`, sans suffixe `-lib`, comme contrat d'extension Program. `ksp-program-api`, sans suffixe `-lib`, matérialise la première façade publique ouverte du domaine Program. La candidate reste volontairement instruction-only et dépend uniquement de Core + Interface.
`ksp-program-lib` et les vertical slices réels arrivent plus tard. La surface commune est :
```text
ProgramInstructionRecognition
NoMatch / ProgramMatch / ExactMatch
ProgramInstructionDecodeOutcome<Decoded>
Decoded(Decoded) / Unsupported
ProgramInstructionDecoder: Send + Sync
type Decoded
program_ids(&self) -> &[Pubkey]
recognize(&self, &ProgramInstruction) -> ProgramInstructionRecognition
decode(&self, &ProgramInstruction) -> Result<ProgramInstructionDecodeOutcome<Self::Decoded>>
```
L'output concret reste possédé par l'implémentation et ne reçoit aucun bound implicite `Debug/Clone/Send/Sync`. Une crate externe peut implémenter le trait pour un Program Pubkey absent du registry Core ; aucun enum central de Programs, `Any`, JSON, registry runtime ou descriptor global n'est requis.
Le hardening final verrouille l'inventaire crate-root exact, le passage d'une `ProgramInstruction` Interface maximale par référence, l'absence d'echo automatique de payload hostile, l'absence de default methods et le firewall `Program API -> Core + Interface`. `pre.006` ferme le gate technique avec audits/check/Clippy/tests workspace et graphe Cargo verts. [`../../crates/ksp-program-api/README.md`](../../crates/ksp-program-api/README.md) et [`../../crates/ksp-program-api/USAGE.md`](../../crates/ksp-program-api/USAGE.md) deviennent les références durables de la candidate.
Restent explicitement reportés : `ksp-program-lib`, payload canonique D3, registry runtime, identity/version/coverage génériques, autres familles de decoder et `ProgramExecutionPreparer`. Ils seront introduits uniquement par les vertical slices qui démontreront leurs contrats réels.
## Architecture durable : RAW -> CORE -> DECODE -> SPECIALIZED ## Architecture durable : RAW -> CORE -> DECODE -> SPECIALIZED

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md --> <!-- file: docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md -->
<!-- version: 6 --> <!-- version: 7 -->
# Plan `0.2.14` — Program API foundation # Plan `0.2.14` — Program API foundation
@@ -698,6 +698,55 @@ Le faux positif du canari logging est donc fermé sans changement de production
La tranche `pre.006` ne matérialise aucun nouveau code ou test : elle synchronise seulement la version workspace, le plan, la validation et son delta afin de rejouer le gate technique final sur la surface candidate déjà durcie. La tranche `pre.006` ne matérialise aucun nouveau code ou test : elle synchronise seulement la version workspace, le plan, la validation et son delta afin de rejouer le gate technique final sur la surface candidate déjà durcie.
## 13.6 Gate technique final `pre.006` et réconciliation `pre.007`
Le gate opérateur de `pre.006`, fourni le 28 août 2026, ferme intégralement la lane technique sans modification de production ni de tests :
```text
cargo fmt --all PASS
audits Rust / export completeness / workspace PASS
audit Markdown PASS — 174 tables / 124 fichiers
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-program-api PASS — 18 tests Rust
cargo test -p ksp-logging-lib --test ownership PASS — 2/2
cargo test --workspace PASS
cargo tree -p ksp-program-api --edges normal PASS — Core + Interface uniquement
cargo tree --duplicates inspecté
```
La surface technique candidate est donc figée :
```text
crate-root exports 10 exacts
production modules 3 exacts
public enums Recognition + DecodeOutcome uniquement
public trait ProgramInstructionDecoder uniquement
normal dependencies Core + Interface uniquement
Program Pubkey hors registry accepté par canari externe
max Interface instruction admise à la frontière decoder par référence
registry / descriptors / preparer absents
serde / JSON / Any / codecs absents
logging / runtime / IO absents
```
`pre.007` ne rouvre aucun fichier Rust, test, manifest de crate, dépendance ou comportement. La version workspace avance mécaniquement à `0.2.14-pre.7` et les références durables suivantes sont réconciliées :
```text
crates/ksp-program-api/README.md
crates/ksp-program-api/USAGE.md
docs/000-README.md
docs/plans/000-README.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md
docs/validation/000-README.md
docs/validation/017-V0_2_14_PROGRAM_API.md
```
La documentation finale fixe l'ownership, l'inventaire crate-root, les semantics Recognition/Outcome, le trait externe, les preuves open-world/adversariales et le dependency firewall. Les index passent au statut candidat réconcilié sans annoncer prématurément la release stable.
Cette tranche ne touche explicitement pas `CHANGELOG.md`, `ROADMAP.md`, le prompt suivant, l'architecture ni les surfaces techniques. Ces responsabilités appartiennent à `pre.008`, sauf découverte d'un défaut documentaire réel imposant une nouvelle tranche de réconciliation.
## 14. Hors périmètre confirmé ## 14. Hors périmètre confirmé
```text ```text
@@ -720,7 +769,7 @@ IDL runtime / Anchor generic decoder
## 15. Critères de clôture ## 15. Critères de clôture
La release pourra être publiée lorsque : La candidate satisfait les critères techniques et documentaires suivants avant préparation de publication :
```text ```text
ksp-program-api existe ksp-program-api existe

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/000-README.md --> <!-- file: docs/validation/000-README.md -->
<!-- version: 30 --> <!-- version: 31 -->
# Validations KSP # Validations KSP
@@ -25,4 +25,4 @@ Documents :
- [`014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) — matrice historique clôturée de `0.2.11` : SOL/USD multi-provider, numeric safety, rate limiting/availability, Config capability-aware et smoke keyless final `7/7`. - [`014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) — matrice historique clôturée de `0.2.11` : SOL/USD multi-provider, numeric safety, rate limiting/availability, Config capability-aware et smoke keyless final `7/7`.
- [`015-V0_2_12_SOL_PRICES_DESK.md`](015-V0_2_12_SOL_PRICES_DESK.md) — matrice historique clôturée de `0.2.12` : screen/features, DTO/commands, Config/composite, frontières provider-neutral, sécurité, Wallet integration, packaging Tauri et gates live/build. - [`015-V0_2_12_SOL_PRICES_DESK.md`](015-V0_2_12_SOL_PRICES_DESK.md) — matrice historique clôturée de `0.2.12` : screen/features, DTO/commands, Config/composite, frontières provider-neutral, sécurité, Wallet integration, packaging Tauri et gates live/build.
- [`016-V0_2_13_INTERFACE.md`](016-V0_2_13_INTERFACE.md) — matrice candidate finale de `0.2.13` : ownership Interface/Core/Transport/Program, surface passive, bornes/adversarial, façade publique exacte, consumer externe, release completeness, dependency firewall et gate technique `pre.006` intégralement vert. - [`016-V0_2_13_INTERFACE.md`](016-V0_2_13_INTERFACE.md) — matrice candidate finale de `0.2.13` : ownership Interface/Core/Transport/Program, surface passive, bornes/adversarial, façade publique exacte, consumer externe, release completeness, dependency firewall et gate technique `pre.006` intégralement vert.
- [`017-V0_2_14_PROGRAM_API.md`](017-V0_2_14_PROGRAM_API.md) — matrice active de `0.2.14 — Program API foundation`; elle suit le gate daudit `pre.001`, lopen-world external implementation canary, le firewall Core/Interface et les gates techniques/documentaires futurs. - [`017-V0_2_14_PROGRAM_API.md`](017-V0_2_14_PROGRAM_API.md) — matrice candidate finale de `0.2.14 — Program API foundation` : façade instruction-only ouverte, Recognition/Outcome, trait externe, Program Pubkey non enregistré, hardening adversarial, release completeness, firewall Core/Interface et gate technique `pre.006` intégralement vert.

View File

@@ -1,13 +1,13 @@
<!-- file: docs/validation/017-V0_2_14_PROGRAM_API.md --> <!-- file: docs/validation/017-V0_2_14_PROGRAM_API.md -->
<!-- version: 6 --> <!-- version: 7 -->
# Validation `0.2.14` — Program API foundation # Validation `0.2.14` — Program API foundation
## 1. Objet ## 1. Objet
Cette matrice est ouverte par `0.2.14-pre.001`. Elle distingue les preuves déjà acquises par le gate d'audit des validations futures qui ne doivent pas être déclarées PASS avant exécution. Cette matrice, ouverte par `0.2.14-pre.001`, est réconciliée par `pre.007` après fermeture intégralement verte du gate technique `pre.006`. Elle conserve l'historique des preuves par tranche et la surface candidate finale.
Le scope validé par `pre.001` est une foundation instruction-only avec output associé à l'implémentation. Registry runtime, payload canonique D3 et `ProgramExecutionPreparer` sont explicitement reportés. Le scope final reste une foundation instruction-only avec output associé à l'implémentation. Registry runtime, payload canonique D3 et `ProgramExecutionPreparer` sont explicitement reportés.
## 2. Gate `pre.001` ## 2. Gate `pre.001`
@@ -118,7 +118,7 @@ tracing
### Gate technique final ### Gate technique final
À exécuter dans la prerelease dédiée : Le gate technique dédié `pre.006` est fermé intégralement vert. Les commandes de référence étaient :
```bash ```bash
cargo fmt --all cargo fmt --all
@@ -127,6 +127,7 @@ python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG
cargo check --workspace cargo check --workspace
cargo clippy --workspace --all-targets cargo clippy --workspace --all-targets
cargo test -p ksp-program-api cargo test -p ksp-program-api
cargo test -p ksp-logging-lib --test ownership
cargo test --workspace cargo test --workspace
cargo tree -p ksp-program-api --edges normal cargo tree -p ksp-program-api --edges normal
cargo tree --duplicates cargo tree --duplicates
@@ -134,7 +135,7 @@ cargo tree --duplicates
### Réconciliation documentaire ### Réconciliation documentaire
Doit fermer : `pre.007` ferme :
```text ```text
ksp-program-api README/USAGE ksp-program-api README/USAGE
@@ -304,3 +305,42 @@ Le faux positif `tracing` du canari `release_completeness.rs` est fermé sans aj
| CHANGELOG / ROADMAP / prompt suivant | non modifiés | | CHANGELOG / ROADMAP / prompt suivant | non modifiés |
Aucun smoke réseau/live n'est requis : `ksp-program-api` reste une API déclarative instruction-only sans I/O. Aucun smoke réseau/live n'est requis : `ksp-program-api` reste une API déclarative instruction-only sans I/O.
## 16. Gate technique final `pre.006`
Le gate opérateur fourni le 28 août 2026 confirme la candidate technique complète :
```text
cargo fmt --all PASS
audits Rust / export completeness / workspace PASS
audit Markdown PASS — 174 tables / 124 fichiers
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-program-api PASS — 18 tests Rust
cargo test -p ksp-logging-lib --test ownership PASS — 2/2
cargo test --workspace PASS
cargo tree -p ksp-program-api --edges normal PASS — Core + Interface uniquement
cargo tree --duplicates inspecté
```
Les duplicates observés sont ceux du workspace global et ne proviennent d'aucune dépendance ajoutée par Program API. Aucun smoke live n'est applicable à cette foundation déclarative sans I/O.
La validation technique de la release candidate est fermée.
## 17. Réconciliation documentaire `pre.007`
La documentation finale candidate est alignée sur les preuves techniques :
| Référence durable | Statut `pre.007` | Contrat réconcilié |
|-------------------------------------------------|------------------|---------------------------------------------------------------------------|
| `crates/ksp-program-api/README.md` | PASS structurel | ownership, surface exacte, semantics, hardening, firewall et frontières |
| `crates/ksp-program-api/USAGE.md` | PASS structurel | usage crate-root, implémentation externe, sélection, outcome et Debug sûr |
| `docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md` | PASS structurel | contenu réel `0.2.14` + reports runtime/D3/preparer |
| `docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md` | PASS structurel | gate `pre.006` fermé + lane documentaire finale |
| `docs/validation/017-V0_2_14_PROGRAM_API.md` | PASS structurel | statuts finaux et preuves opérateur |
| index `docs/000`, plans et validation | PASS structurel | candidate réconciliée sans publication stable prématurée |
La tranche ne modifie aucun code/test/manifest de crate/dépendance et ne touche ni `CHANGELOG.md`, ni `ROADMAP.md`, ni le prompt `0.3.1`. Ces surfaces restent réservées à la préparation minimale de publication `pre.008`.
Le gate opérateur de `pre.007` doit rester déterministe : audits, check, Clippy, tests ciblés Program/Logging et workspace suffisent ; aucun smoke live ni nouveau `cargo tree` n'est requis si l'overlay documentaire est appliqué exactement.