Files
khadhroony-solana-project/docs/architecture/007-EXECUTION_AND_POLICY.md
2026-08-14 11:42:19 +02:00

324 lines
10 KiB
Markdown

<!-- file: docs/architecture/007-EXECUTION_AND_POLICY.md -->
<!-- version: 1 -->
# Execution et Policy
## Objet
Ce document constitue la sortie principale de `0.0.3-pre.005`.
Il précise la frontière entre :
- `ProgramExecutionPreparer` et `PreparedProgramExecution` ;
- `ksp-execution-policy-api` ;
- `ksp-execution-lib` ;
- `ksp-wallet-lib` ;
- `ksp-onchain-transport-lib` ;
- l'interface/application qui fournit le contexte et les approbations externes.
Les types Rust exacts restent volontairement à définir avec la première implémentation réelle.
## Chaîne générale
```text
ProgramExecutionRequest
|
v
ProgramExecutionPreparer
|
v
PreparedProgramExecution
|
v
ksp-execution-lib
|
+--> policy checkpoints
+--> transaction/message assembly
+--> simulation si requise
+--> signature
+--> submission
+--> confirmation
|
v
ExecutionOutcome / pending requirement / error
```
`ksp-program-lib` prépare la sémantique protocolaire. `ksp-execution-lib` orchestre le cycle transactionnel. Ces responsabilités ne sont pas fusionnées.
## Entrée fondamentale de `ksp-execution-lib`
L'entrée fondamentale de `ksp-execution-lib` est une opération déjà préparée conformément à `ksp-program-api`, conceptuellement `PreparedProgramExecution`.
`ksp-execution-lib` ne dépend pas de `ksp-program-lib` et ne reçoit pas des requêtes spécifiques à Token, Meteora, Raydium ou autre protocole.
Un helper de composition `prepare + execute` pourra être ajouté plus tard s'il apporte une valeur réelle, mais il ne remplace pas la frontière fondamentale.
## `ksp-execution-policy-api`
`ksp-execution-policy-api` est un contrat public de décision. Il ne fournit pas une policy générique KSP.
Une implémentation de policy appartient au contexte qui en a besoin, par exemple :
- une crate `ksp-scenario-<domain>-lib` pour une demo Devnet ;
- une future bibliothèque d'application générale ;
- une future bibliothèque spécialisée Trading Intelligence / trading opérationnel.
Aucune `ksp-execution-policy-lib` commune n'est créée sans policy réellement commune.
## Policy obligatoire pour une exécution réelle
Une exécution réelle via `ksp-execution-lib` doit recevoir explicitement une implémentation de `ksp-execution-policy-api`.
Il n'existe pas de fallback implicite « allow all » pour la production.
Les tests peuvent utiliser une policy explicitement permissive lorsqu'ils ont besoin de tester le cycle d'exécution indépendamment de règles produit.
## Policy multi-checkpoints
Une policy n'est pas nécessairement évaluée une seule fois au début.
Certaines décisions ont besoin d'informations qui n'existent qu'après une étape technique, en particulier la simulation.
Direction conceptuelle :
```text
Prepared
|
v
preflight policy
|
v
simulation éventuelle
|
v
post-simulation policy
|
v
signature
|
v
pre-submission policy
|
v
submission / confirmation
```
Les noms et le nombre exact de checkpoints seront définis avec l'API réelle. Le contrat doit rester extensible sans imposer des callbacks inutiles à toutes les policies.
## Une policy décide, elle n'exécute pas
Une policy peut conceptuellement :
- autoriser ;
- refuser ;
- ajouter/resserrer des exigences ;
- exiger une simulation ;
- exiger une approbation externe ;
- imposer un niveau minimum de confirmation ;
- imposer des limites de retry/exécution.
Une policy ne :
- signe pas ;
- sélectionne pas un secret wallet ;
- appelle pas RPC ;
- n'envoie pas une transaction ;
- n'ouvre pas une fenêtre Tauri ;
- ne bloque pas en attente d'une interaction UI.
## Trois sources de contraintes
L'orchestration distingue trois origines de contraintes.
### Contraintes Program
Produites par `ProgramExecutionPreparer` dans `PreparedProgramExecution` :
- comptes requis ;
- signers/authorities requis ;
- ordre et contenu des instructions ;
- PDA ;
- invariants/contraintes protocolaires.
Elles sont techniques et non négociables par une policy.
### Options/contexte du consommateur
Le niveau supérieur fournit le contexte d'exécution :
- réseau/profil choisi ;
- wallet/signers sélectionnés ;
- commitment/timeout souhaités ;
- options de simulation ;
- autres choix exposés par l'application/scénario.
### Contraintes Policy
La policy peut refuser ou resserrer les options du consommateur, mais ne peut pas violer les contraintes techniques Program.
## Wallet
`ksp-execution-lib` utilise `ksp-wallet-lib` pour les capacités de signature mais ne choisit pas arbitrairement un wallet.
Le contexte supérieur fournit les signers/wallet handles sélectionnés ; l'orchestration vérifie qu'ils satisfont les authorities/signers requis par `PreparedProgramExecution`.
Les secrets ne sont jamais transportés dans `PreparedProgramExecution`.
## Transport on-chain
`ksp-execution-lib` utilise `ksp-onchain-transport-lib` pour les primitives réseau nécessaires, notamment selon le besoin :
- récupération des données réseau nécessaires à la construction finale ;
- simulation ;
- submission ;
- status/confirmation.
`ksp-execution-lib` ne choisit pas arbitrairement Helius, RPC public, WS ou autre provider. Le contexte/configuration supérieur fournit la cible/transport approprié.
Le choix du provider est distinct de la policy d'exécution.
## Simulation
La primitive réseau de simulation appartient à `ksp-onchain-transport-lib`.
L'orchestration de la simulation appartient à `ksp-execution-lib` : elle décide quand appeler la primitive selon `PreparedProgramExecution`, options et exigences de policy.
La policy peut rendre la simulation obligatoire et peut évaluer son résultat, mais n'effectue pas elle-même l'appel réseau.
## Signature
`ksp-execution-lib` assemble le message/transaction selon les contrats techniques retenus, résout les signers requis depuis le contexte puis appelle `ksp-wallet-lib` pour les signatures.
Les crates Solana précises nécessaires aux messages/transactions seront évaluées au moment de l'implémentation selon la même politique de dépendances modernes que les autres interfaces KSP.
## Submission et confirmation
Les primitives réseau de submission/status appartiennent à `ksp-onchain-transport-lib`.
Le lifecycle :
```text
submitted
-> processed / confirmed / finalized
-> timeout / failure
```
est orchestré par `ksp-execution-lib`.
Une policy peut imposer un minimum de confirmation mais n'implémente pas la boucle de confirmation.
## Retry transport vs retry d'exécution
Deux catégories sont distinguées.
### Retry transport
Retry technique d'un appel réseau identique, par exemple erreur transitoire de connexion/rate-limit. Il appartient au transport selon ses règles propres.
### Retry d'exécution
Un retry qui modifie le lifecycle de l'opération, par exemple :
- blockhash expiré ;
- reconstruction ;
- nouvelle simulation ;
- nouvelle signature ;
- nouvelle submission.
Il appartient à `ksp-execution-lib` et peut être limité/refusé par la policy.
## Approbation externe et suspension
Une policy peut demander une approbation externe sans connaître l'UI.
`ksp-execution-lib` doit pouvoir exposer un état/requirement suspendu conceptuel permettant au caller :
1. de recevoir la demande ;
2. d'obtenir l'approbation via son interface propre ;
3. de reprendre l'exécution de manière contrôlée.
Le mécanisme exact de token/resume sera défini avec le premier besoin réel.
Une application Tauri affiche éventuellement le dialogue ; ni la policy ni `ksp-execution-lib` ne dépendent de Tauri pour cela.
## Résultat d'exécution
Le résultat doit pouvoir exposer conceptuellement :
- identité de l'opération préparée ;
- identité/signature transactionnelle lorsqu'elle existe ;
- résultat de simulation lorsqu'elle a eu lieu ;
- résultat de submission ;
- état de confirmation ;
- warnings ;
- informations de décisions/requirements utiles au caller ;
- erreur/état final ou suspendu.
`ksp-execution-lib` ne persiste pas automatiquement ce résultat et ne dépend pas du store.
La persistence éventuelle appartient à un composant supérieur de composition.
## Logging transversal
`ksp-logging-lib` est la façade commune de logging/tracing KSP.
Elle possède directement les dépendances techniques de logging, notamment :
```text
tracing
tracing-appender
tracing-subscriber
```
et peut dépendre de `ksp-core-lib` pour `Error` / `Result`.
Elle possède l'initialisation/configuration du système de logging et expose une façade KSP paramétrable (target/domain/champs structurés et niveaux selon l'API finale).
Les crates runtime KSP ne dépendent normalement pas directement de `tracing`; elles utilisent `ksp-logging-lib` pour produire des événements :
```text
error
warn
info
debug
trace
```
L'API exacte peut utiliser fonctions, macros ou une combinaison des deux afin de préserver les propriétés utiles de `tracing`; ce détail est reporté à l'implémentation de `ksp-logging-lib`.
Les applications Tauri constituent une exception technique possible lorsqu'un plugin tel que `tauri-plugin-tracing` impose une intégration directe au framework. Cette adaptation ne doit pas créer une seconde politique de logging parallèle : `ksp-logging-lib` reste la façade/propriétaire KSP.
`ksp-core-lib` n'a pas besoin de dépendre de `ksp-logging-lib` dans l'architecture actuelle.
Les crates `*-api` purement déclaratives ne dépendent pas du logging par défaut.
## Composition de policies
La composition de plusieurs policies spécialisées (réseau, montants, risque, deprecated operation, approval utilisateur, etc.) reste une idée à évaluer.
Elle n'est pas imposée par `ksp-execution-policy-api` tant que les premières policies réelles n'ont pas démontré un contrat de composition utile.
## Dépendances interdites
```text
ksp-execution-policy-api -X-> ksp-wallet-lib
ksp-execution-policy-api -X-> ksp-onchain-transport-lib
ksp-execution-policy-api -X-> ksp-store-api
ksp-execution-policy-api -X-> UI/Tauri
ksp-execution-lib -X-> ksp-program-lib
ksp-execution-lib -X-> ksp-store-api
ksp-execution-lib -X-> ksp-store-lib
```
## Questions laissées à l'implémentation
- types Rust exacts des checkpoints et décisions de policy ;
- représentation précise de `ExecutionContext` ;
- mécanisme d'approbation suspendue/reprise ;
- forme exacte de `ExecutionOutcome` ;
- limites/retry defaults ;
- crates Solana actuelles pour message/transaction/versioned transaction ;
- API fonctions/macros exacte de `ksp-logging-lib` ;
- éventuelle composition de policies.