v0.2.14-pre.007
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
194
deltas/0.2.14/pre.007.md
Normal 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
@@ -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, l’inté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, l’inté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 d’implé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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 d’audit `pre.001`, l’open-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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user