v0.3.5-pre.003

This commit is contained in:
2026-08-31 11:01:45 +02:00
parent ca018095bf
commit 7d490eb5d8
9 changed files with 620 additions and 66 deletions

View File

@@ -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.