v0.1.0-pre.070

This commit is contained in:
2026-07-31 15:44:46 +02:00
parent 94181e4d5c
commit d6bd91c305
22 changed files with 1055 additions and 35 deletions

20
kb-pipeline/CHANGELOG.md Normal file
View File

@@ -0,0 +1,20 @@
<!-- file: kb-pipeline/CHANGELOG.md -->
<!-- version: 1 -->
# CHANGELOG — kb-pipeline
## 0.1.0-pre.070
- enrichissement du `USAGE.md` avec plusieurs exemples couvrant les principales familles dAPI publiques ;
- ajout du contrat documentaire de la crate ;
- classement des APIs publiques par campagnes, replay et inspections stateful ;
- clarification des invariants de déterminisme, bornage et matérialisation ;
- inscription des travaux Metaplex et ElGamal restants dans le TODO.
## 0.1.0-pre.062
- migration du pipeline bot2 dans larchitecture consolidée bot3 ;
- reprise du backfill, de lextraction Core, du decode replay et des matérialisations ;
- migration des préflights, corrélations et orchestrations Token-2022 ;
- migration des contrats stateful SPL Token, ATA et registre ElGamal ;
- adaptation aux normes Rust 2024 et Khadhroony bot3.

36
kb-pipeline/README.md Normal file
View File

@@ -0,0 +1,36 @@
<!-- file: kb-pipeline/README.md -->
<!-- version: 1 -->
# kb-pipeline
`kb-pipeline` orchestre les traitements on-chain de `khadhroony-bot3`.
## Responsabilités
- backfill HTTP borné ;
- extraction des transactions canoniques vers le modèle Core ;
- replay contextualisé des décodeurs ;
- matérialisation optionnelle et idempotente ;
- préflights et inspections stateful ;
- orchestration Token-2022, preuves et postconditions ;
- corrélation entre instructions observées et états finaux.
La crate coordonne `kb-onchain-transport`, `kb-store`, `kb-lib`, `kb-core` et `kb-program-ids`. Elle ne contient pas linterface desktop ni les scénarios opérateur de démonstration.
## Familles publiques
- backfill ;
- extraction Core ;
- decode replay ;
- inspections stateful Solana Core, SPL Token, ATA, Token-2022 et registre ElGamal ;
- préflight cryptographique et orchestration dexécution Token-2022.
Voir [USAGE.md](USAGE.md) pour les contrats publics.
## Documentation
- [USAGE.md](USAGE.md)
- [TODO.md](TODO.md)
- [CHANGELOG.md](CHANGELOG.md)
- [Architecture du pipeline](../docs/architecture/PIPELINE_ARCHITECTURE.md)
- [Architecture du stockage](../docs/architecture/STORAGE_ARCHITECTURE.md)

12
kb-pipeline/TODO.md Normal file
View File

@@ -0,0 +1,12 @@
<!-- file: kb-pipeline/TODO.md -->
<!-- version: 1 -->
# TODO — kb-pipeline
- [ ] Metaplex Token Metadata - intégrer la matérialisation migrée et les étapes restantes au replay bot3.
- [ ] Metaplex Token Metadata - ajouter lorchestration nécessaire à lexécuteur et aux validations de la future `0.4.7`.
- [ ] Registre ElGamal - confirmer lexistence et le déploiement du programme avant toute campagne réseau.
- [ ] Registre ElGamal - compléter uniquement les couches pipeline justifiées par un scénario réellement exécutable.
- [ ] Tests - ajouter les tests ciblés correspondant aux écarts identifiés par laudit dalignement `0.4.6`.
- [ ] Documentation - compléter le guide de replay, extraction Core et matérialisation à partir des contrats bot3.
- [ ] Dette technique - vérifier les duplications résiduelles entre les orchestrations SPL Token classique et Token-2022.

180
kb-pipeline/USAGE.md Normal file
View File

@@ -0,0 +1,180 @@
<!-- file: kb-pipeline/USAGE.md -->
<!-- version: 2 -->
# Utilisation de kb-pipeline
## Objectif
La crate expose les campagnes bornées dacquisition, dextraction, de replay et les inspections stateful nécessaires aux applications et scénarios.
## Valider une requête dextraction Core
```rust
fn validate_pending_extraction() -> kb_core::Result<()> {
let request = kb_pipeline::CoreExtractionRequest {
source: kb_pipeline::CoreExtractionSource::Pending,
limit: 1_000,
max_concurrent_extractions: 4,
force_replay: false,
};
request.validate()
}
```
Une extraction ciblée peut utiliser `CoreExtractionSource::Signatures`, `SlotRange` ou `ProgramId`.
## Exécuter une campagne dextraction Core
```rust
async fn run_core_extraction<S, O>(
store: &S,
observer: &O,
request: kb_pipeline::CoreExtractionRequest,
) -> kb_core::Result<kb_pipeline::CoreExtractionSummary>
where
S: kb_store::CanonicalTransactionStore
+ kb_store::CoreExtractionStore
+ Sync,
O: kb_pipeline::CoreExtractionObserver,
{
let result = kb_pipeline::execute_core_extraction(store, observer, request).await;
match result {
Ok(summary) => Ok(summary),
Err(error) => Err(error),
}
}
```
## Préparer une requête de decode replay
```rust
fn validate_decode_request(
selection: kb_store::DecodeSelectionFilter,
) -> kb_core::Result<()> {
let request = kb_pipeline::DecodeReplayRequest {
campaign_id: "manual-replay-001".to_string(),
selection,
decoder_names: Vec::new(),
dispatch_policy: kb_pipeline::DecodeDispatchPolicy::HighestPriority,
max_concurrent_inputs: 4,
force_replay: false,
force_replay_all_matching: false,
materialize_after_decode: true,
};
request.validate()
}
```
Une liste vide dans `decoder_names` signifie que tous les décodeurs fournis à lorchestrateur restent éligibles.
## Exécuter un decode replay
```rust
async fn run_decode_replay<S, O>(
store: &S,
observer: &O,
request: kb_pipeline::DecodeReplayRequest,
decoders: &[&dyn kb_lib::MdApiInstructionDecoder],
materializers: &[&dyn kb_lib::MdApiEventMaterializer],
) -> kb_core::Result<kb_pipeline::DecodeReplaySummary>
where
S: kb_store::DecodeReplayStore + Sync,
O: kb_pipeline::DecodeReplayObserver,
{
let result = kb_pipeline::execute_decode_replay(
store,
observer,
request,
decoders,
materializers,
)
.await;
match result {
Ok(summary) => Ok(summary),
Err(error) => Err(error),
}
}
```
## Backfill HTTP
La surface principale utilise `BackfillRequest`, `BackfillObserver`, `execute_http_backfill` et `BackfillSummary`.
```rust
async fn run_backfill<S, O>(
store: &S,
observer: &O,
request: kb_pipeline::BackfillRequest,
) -> kb_core::Result<kb_pipeline::BackfillSummary>
where
S: kb_store::CanonicalTransactionStore + Sync,
O: kb_pipeline::BackfillObserver,
{
let result = kb_pipeline::execute_http_backfill(store, observer, request).await;
match result {
Ok(summary) => Ok(summary),
Err(error) => Err(error),
}
}
```
## Inspections stateful
Les familles publiques comprennent :
- `inspect_solana_core_stateful_readiness` ;
- inspections SPL Token et ATA ;
- inspections et corrélations Token-2022 ;
- préflight cryptographique Token-2022 ;
- lecture et matérialisation stateful du registre ElGamal.
```rust
async fn inspect_classic_token<S>(
store: &S,
request: kb_pipeline::SplTokenStatefulReadinessRequest,
) -> kb_core::Result<kb_pipeline::SplTokenStatefulReadinessReport>
where
S: kb_store::CanonicalTransactionStore + Sync,
{
let result = kb_pipeline::inspect_spl_token_stateful_readiness(store, request).await;
match result {
Ok(report) => Ok(report),
Err(error) => Err(error),
}
}
```
Les rapports stateful ne constituent jamais une autorisation implicite dexécution.
## Observateurs
Les campagnes longues exposent des traits dobservation distincts pour le backfill, lextraction Core et le replay. Lobservateur peut publier la progression et participer à lannulation coopérative selon le contrat concerné.
## Erreurs et invariants
- toutes les campagnes sont bornées ;
- la progression persistée ne doit avancer quaprès traitement cohérent ;
- le replay doit rester déterministe pour une même entrée et une même version de pipeline ;
- une matérialisation ne doit pas inventer un état confirmé ;
- les erreurs de transport, stockage, décodage et préflight restent distinguées.
## Tests de référence
- tests de frontière contiguë et reprise du backfill ;
- tests dextraction Core et didempotence ;
- tests de decode replay, dispatch et matérialisation ;
- tests stateful SPL Token, ATA et Token-2022 ;
- tests de preuves, préflight cryptographique et postconditions ;
- tests du registre ElGamal fail-closed.
## Limites durables
- la crate orchestre les traitements mais ne fournit pas dinterface opérateur ;
- elle ne conserve pas de secret de wallet ;
- elle ne remplace pas les scénarios Devnet et validations explicites de `kb-pipeline-demo-scenarios`.