v0.3.5-pre.003
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
<!-- file: docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md -->
|
||||
<!-- version: 3 -->
|
||||
<!-- version: 4 -->
|
||||
|
||||
# Validation `0.3.5` — Interface passive acquisition events
|
||||
|
||||
## 1. Portée
|
||||
|
||||
Ce document est ouvert par `0.3.5-pre.001`, corrigé par `0.3.5-pre.001-fix.001` puis enrichi par `0.3.5-pre.002`. `pre.002` matérialise uniquement la famille `SlotLifecycleEvent` admise par le gate corrigé, sans avancer `TransactionExecutionEvent`.
|
||||
Ce document est ouvert par `0.3.5-pre.001`, corrigé par `0.3.5-pre.001-fix.001`, enrichi par `0.3.5-pre.002` puis par `0.3.5-pre.003`. `pre.002` matérialise `SlotLifecycleEvent`; `pre.003` ferme le gate `TransactionExecutionEvent` et admet la seconde famille passive minimale.
|
||||
|
||||
Base :
|
||||
|
||||
@@ -17,7 +17,7 @@ workspace.package.version = 0.3.4
|
||||
Version de travail :
|
||||
|
||||
```text
|
||||
0.3.5-pre.2
|
||||
0.3.5-pre.3
|
||||
```
|
||||
|
||||
## 2. Gate d'entrée `v0.3.4`
|
||||
@@ -48,7 +48,7 @@ Cette preuve est l'entrée de `0.3.5`. Elle n'est pas réétiquetée comme valid
|
||||
| Famille | Décision | Owner | Motif déterminant |
|
||||
| ------------------------------------- | ------------------- | ------------------------------ | ---------------------------------------------------------------------------------------- |
|
||||
| slot lifecycle intersection | ADMIS | Interface | 7 faits compacts normalisés ; détails protocol/provider restent Transport |
|
||||
| transaction execution | CANDIDAT ACTIF | Interface si gate passe | intersection candidate `slot + signature + outcome` sur Solana/Yellowstone/Helius |
|
||||
| transaction execution | ADMIS `pre.003` | Interface | `slot + TransactionSignature + Succeeded/Failed` multi-producer |
|
||||
| logs realtime | IDÉE DIFFÉRÉE | Interface si futur gate | payload variable/bornes/consumer non démontrés ; ne pas mélanger avec execution |
|
||||
| signature commitment/snapshot | REPORTÉ | Transport | HTTP snapshot != WS one-shot commitment ; distinct de l'exécution |
|
||||
| vote | REPORTÉ | Transport | gossip pré-consensus != transaction qualifiée `is_vote` |
|
||||
@@ -57,7 +57,7 @@ Cette preuve est l'entrée de `0.3.5`. Elle n'est pas réétiquetée comme valid
|
||||
| block | REJET Interface | Transport | conteneur/payload d'acquisition ; aucun besoin passif transversal démontré |
|
||||
| Yellowstone Entry | REPORTÉ | Transport DTO | mono-producer aujourd'hui ; un futur fait transversal KSP serait réaudité pour Interface |
|
||||
| persisted-data available notification | REJET Interface | Store API | ownership normatif `KSP-NOTIFY-001..006` |
|
||||
| Helius Enhanced transaction | PRODUCTEUR CANDIDAT | Transport DTO / Interface fact | DTO provider-specific ; projection possible seulement vers un fait commun admis |
|
||||
| Helius Enhanced transaction | PRODUCTEUR ADMIS | Transport DTO / Interface fact | DTO provider-specific ; projection conservative vers le fait commun admis |
|
||||
|
||||
## 5. Intersection lifecycle retenue
|
||||
|
||||
@@ -386,8 +386,7 @@ cargo test -p ksp-program-api
|
||||
|
||||
Les validations Cargo de `pre.002` restent **à exécuter par l'opérateur** ; elles ne sont pas déclarées réussies par l'environnement d'assemblage.
|
||||
|
||||
|
||||
## 17. Gate opérateur `pre.002` et correction `pre.002-fix.001`
|
||||
## 19. Gate opérateur `pre.002` et correction `pre.002-fix.001`
|
||||
|
||||
Le gate opérateur de `pre.002` confirme que le contrat fonctionnel `SlotLifecycleEvent` compile et que ses tests ciblés passent, mais la tranche n'est pas admissible en l'état : l'audit Rust détecte quinze violations `RUST-FMT-101` dans les nouveaux tests et Clippy rejette deux usages de `?` ainsi que des closures à retour implicite. Les deux nouveaux tests d'intégration exposent également un warning `missing_docs` au niveau crate.
|
||||
|
||||
@@ -400,3 +399,177 @@ Comme le fix modifie des sources Rust, la version workspace évolue conformémen
|
||||
```
|
||||
|
||||
Le nom documentaire de la correction reste `0.3.5-pre.002-fix.001`.
|
||||
|
||||
## 20. Gate opérateur `pre.002-fix.001`
|
||||
|
||||
Le gate opérateur du `2026-08-31` confirme :
|
||||
|
||||
```text
|
||||
General Rust rule audit: clean
|
||||
Rust export completeness audit: 0 candidate(s)
|
||||
KSP workspace Rust rule audit: clean
|
||||
cargo check --workspace: PASS
|
||||
cargo clippy --workspace --all-targets: PASS
|
||||
cargo test -p ksp-interface-lib: PASS
|
||||
cargo test -p ksp-program-api: PASS
|
||||
```
|
||||
|
||||
Le seul défaut restant est documentaire : deux lignes vides consécutives dans ce fichier de validation. L'opérateur demande explicitement de ne pas créer un fix dédié pour ce seul défaut ; `pre.003` le corrige avec ses propres modifications.
|
||||
|
||||
## 21. Gate `TransactionExecutionEvent` — `pre.003`
|
||||
|
||||
### 21.1 Représentation de signature
|
||||
|
||||
Verdict : `PASS`.
|
||||
|
||||
La primitive admise est :
|
||||
|
||||
```text
|
||||
TransactionSignature([u8; 64])
|
||||
```
|
||||
|
||||
Contraintes :
|
||||
|
||||
- construction depuis 64 octets déjà décodés uniquement ;
|
||||
- aucun base58/serde/codec dans Interface ;
|
||||
- `Debug` masque systématiquement les bytes ;
|
||||
- aucune dependency Solana supplémentaire ;
|
||||
- aucune capability de signature Wallet ; il s'agit uniquement d'une identité transactionnelle passive observée.
|
||||
|
||||
`ksp-store-api::RawTransactionSignature` reste Store-owned. Aucun alias, reexport ou conversion implicite cross-domain n'est introduit. Une future composition peut effectuer explicitement la conversion via les 64 octets lorsque nécessaire.
|
||||
|
||||
### 21.2 Convergence producer
|
||||
|
||||
| Producer | Slot | Signature | Outcome | Metadata volontairement exclue | Verdict |
|
||||
| -------------------------------------- | ----------------------- | ----------------------------------- | ----------------------------------- | -------------------------------------------------------------- | ------- |
|
||||
| Solana WS `logsSubscribe` | `context.slot` | base58, décodée par la composition | `err == null` / `err != null` | logs, commitment, subscription | PASS |
|
||||
| Yellowstone `TransactionStatus` | `slot` | 64 bytes | `err None` / `err Some` | filters, created_at, is_vote, index, opaque error bytes | PASS |
|
||||
| Helius `transactionSubscribe` | `slot` si forme typée | signature si forme typée | seulement si erreur déterminable | detail mode, transactionIndex, memo, blockTime, confirmation | PASS* |
|
||||
|
||||
`PASS*` Helius signifie **projection conservative** : aucune `TransactionExecutionEvent` n'est fabriquée pour une forme `none`, inconnue ou dont l'erreur d'exécution est absente/indéterminable. Le DTO provider reste Transport-owned.
|
||||
|
||||
### 21.3 Outcome commun
|
||||
|
||||
Le contrat n'encode pas les erreurs provider :
|
||||
|
||||
```text
|
||||
Solana `err: null` / Yellowstone `err: None` / Helius `err: null` explicite -> Succeeded
|
||||
Solana/Yellowstone/Helius erreur explicite -> Failed
|
||||
Helius `err` omis ou forme inconnue -> aucune projection
|
||||
```
|
||||
|
||||
Cette normalisation décrit uniquement le résultat d'exécution observé. Elle ne prétend pas encoder un commitment, une finalité, une cause d'erreur, un index de transaction ou une garantie de replay.
|
||||
|
||||
### 21.4 Consumer concret
|
||||
|
||||
Verdict : `PASS`.
|
||||
|
||||
Le futur worker RAW live décrit dans `docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md` peut consommer le fait compact pour déclencher une hydratation/acquisition par signature sans dépendre du DTO source. Le premier backfill historique `0.3.6` ne dépend pas de cet event.
|
||||
|
||||
### 21.5 Anti-duplication Store
|
||||
|
||||
Verdict : `PASS`.
|
||||
|
||||
`TransactionExecutionEvent` ne contient ni payload RAW, format, content hash, block time, provenance, observation key, retention state ni network id durable. Il ne peut donc pas remplacer `RawTransaction`, `RawTransactionReference` ou `RawTransactionObservation`.
|
||||
|
||||
### 21.6 Décision finale
|
||||
|
||||
```text
|
||||
TransactionSignature
|
||||
TransactionExecutionOutcome
|
||||
TransactionExecutionEvent
|
||||
-> ADMIS Interface
|
||||
|
||||
TransactionLogEvent
|
||||
-> idée différée
|
||||
|
||||
TransactionCommitmentEvent
|
||||
-> non admis
|
||||
|
||||
DTOs logsSubscribe / Yellowstone TransactionStatus / Helius transactionSubscribe
|
||||
-> Transport-owned
|
||||
```
|
||||
|
||||
## 22. Implémentation `0.3.5-pre.003`
|
||||
|
||||
Surface ajoutée au crate-root :
|
||||
|
||||
```text
|
||||
TransactionSignature
|
||||
TransactionExecutionOutcome
|
||||
TransactionExecutionEvent
|
||||
```
|
||||
|
||||
API :
|
||||
|
||||
```text
|
||||
TransactionSignature::new([u8; 64])
|
||||
TransactionSignature::as_bytes()
|
||||
|
||||
TransactionExecutionOutcome::{Succeeded, Failed}
|
||||
|
||||
TransactionExecutionEvent::new(slot, signature, outcome)
|
||||
TransactionExecutionEvent::slot()
|
||||
TransactionExecutionEvent::signature()
|
||||
TransactionExecutionEvent::outcome()
|
||||
```
|
||||
|
||||
`TransactionExecutionOutcome` est `#[non_exhaustive]`. Les deux `Debug` contenant une signature sont bornés et n'affichent aucun byte de signature.
|
||||
|
||||
Le graphe normal visé reste :
|
||||
|
||||
```text
|
||||
ksp-interface-lib
|
||||
└── ksp-core-lib
|
||||
```
|
||||
|
||||
Aucun converter Transport, aucune dependency Store, aucun `serde`, logging, runtime, channel ou codec n'est ajouté.
|
||||
|
||||
## 23. Fichiers de `pre.003`
|
||||
|
||||
Modifiés :
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-interface-lib/src/lib.rs
|
||||
crates/ksp-interface-lib/tests/release_completeness.rs
|
||||
docs/plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md
|
||||
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
|
||||
```
|
||||
|
||||
Ajoutés :
|
||||
|
||||
```text
|
||||
crates/ksp-interface-lib/src/transaction_execution.rs
|
||||
crates/ksp-interface-lib/unit_tests/transaction_execution.rs
|
||||
crates/ksp-interface-lib/tests/transaction_execution_public_api.rs
|
||||
deltas/0.3.5/pre.003.md
|
||||
```
|
||||
|
||||
Explicitement inchangés :
|
||||
|
||||
```text
|
||||
crates/ksp-interface-lib/Cargo.toml
|
||||
crates/ksp-onchain-transport-lib/**
|
||||
crates/ksp-store-api/**
|
||||
crates/ksp-store-lib/**
|
||||
crates/ksp-store-postgres-lib/**
|
||||
README.md
|
||||
ROADMAP.md
|
||||
CHANGELOG.md
|
||||
```
|
||||
|
||||
## 24. Gate opérateur demandé pour `pre.003`
|
||||
|
||||
```text
|
||||
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.3.5
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets
|
||||
cargo test -p ksp-interface-lib
|
||||
cargo test -p ksp-program-api
|
||||
```
|
||||
|
||||
Les gates Cargo de `pre.003` restent à exécuter par l'opérateur dans le repository réel.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user