v0.3.13-pre.004

This commit is contained in:
2026-09-10 14:25:30 +02:00
parent 31c0a83e51
commit 28e4da3879
13 changed files with 1303 additions and 33 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Plan v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source RawTransaction
@@ -512,6 +512,29 @@ Retry/reconnect/resubscribe : Transport WS.
Preuve : parité bytes/hash entre notification blockSubscribe et `getBlock`/fixture Common RAW pour Legacy/V0 puis V1 ; canari `block:null` ; unsupported validator explicite.
### 14.1 Décisions matérialisées en pre.004
`RawTransactionIngestStandardBlockSource` est caller-composed à partir d'un `WsEndpointSettings` `solana_standard`, d'un `SolanaBlockSubscribeFilter` et d'un commitment explicite `Confirmed` ou `Finalized`. Elle réutilise exclusivement `SolanaStandardWsSession` et son `block_subscribe`; aucun acteur WebSocket Worker parallèle n'est ajouté.
La requête runtime est figée à :
```text
encoding = Base64
transactionDetails = Full
maxSupportedTransactionVersion = 1
showRewards = false
```
La tranche qualifie RAW-direct exactement `Legacy`, `V0` et `V1`. La preuve V1 est locale et déterministe : une fixture wire V1 est sérialisée avec les types publics de `ksp-raw-transaction-lib`, injectée dans le projecteur de bloc, puis comparée au Common RAW canonique attendu. Une version omise/nulle ou `>1` reste non qualifiée et produit une faute sûre. Aucun fallback HTTP `getBlock` ou `getTransaction` n'est inventé dans cette source.
Le matériau direct conserve la signature embarquée, le slot de notification, le `blockTime`, le `meta`, la version explicitement qualifiée et l'index de transaction dans le bloc. `block: null`, une erreur distante, un mismatch `context.slot`, un champ transactions omis/nul ou un encodage non Base64 échouent avant toute progression de frontier.
Pour un bloc de plusieurs transactions, le Worker ne projette le slot settled qu'après l'admission réussie de toutes ses transactions. La voie RAW-direct n'utilise pas le compteur `hydration_pending`; un stop ou une faute au milieu du bloc laisse la frontier en deçà du slot.
L'identité logique inclut la famille `standard_block`, le réseau, les identités provider/endpoint sûres, le commitment et une empreinte privée du filtre. La valeur brute d'un filtre `MentionsAccountOrProgram(pubkey)` ne sort pas dans `Debug` ou la provenance.
La barrière de `pre.002` reste active : une seule source Yellowstone, Standard Logs ou Standard Block peut être exécutée. Une collection `2..32` reste rejetée avant spawn jusqu'au supervisor `pre.007`.
## 15. Contrat source Helius transactionSubscribe
Entrée caller-composed :

View File

@@ -1,11 +1,11 @@
<!-- file: docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md -->
<!-- version: 3 -->
<!-- version: 4 -->
# Validation v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source
## 1. Rôle
Ce document enregistre les preuves réellement exécutées et les non-claims de `0.3.13`. `pre.001` ferme l'audit/planification, `pre.002` matérialise la composition runtime multi-source et `pre.003` ajoute la source productive Standard Solana `logsSubscribe` + hydration HTTP observée, sans activer encore la supervision simultanée.
Ce document enregistre les preuves réellement exécutées et les non-claims de `0.3.13`. `pre.001` ferme l'audit/planification, `pre.002` matérialise la composition runtime multi-source, `pre.003` ajoute Standard Solana `logsSubscribe` + hydration HTTP observée et `pre.004` ajoute Standard Solana `blockSubscribe` RAW-direct qualifié Legacy/V0/V1, sans activer encore la supervision simultanée.
## 2. Archive stable contrôlée
@@ -811,3 +811,157 @@ cargo tree --duplicates
```
`pre.004` ne doit pas commencer si une anomalie de format, règle, compilation, API, dépendance ou test apparaît.
## 35. Gate opérateur pre.003-fix.003 reçu avant pre.004
Le gate fourni par l'opérateur sur `0.3.13-pre.3.fix.3` est vert pour toutes les commandes exécutées :
```text
cargo fmt --all : PASS
cargo fmt --all -- --check : PASS, silencieux
General Rust rule audit : clean
Rust export completeness audit : 0 candidate
KSP workspace Rust rule audit : clean
Markdown table audit : clean (340 tables, 834 files)
cargo check --workspace : PASS
clippy workspace/all-targets/all-features -D warnings : PASS
ksp-worker-raw-transaction-ingest-lib unit tests : 75 pass
cross_layer_completeness : 4 pass
dependency_boundary : 10 pass
hardening : 17 pass
public_api : 11 pass
release_completeness : 4 pass
worker doc-tests : 0
```
Cette exécution ne contenait pas `cargo test -p ksp-onchain-transport-lib` ni les commandes `cargo tree`; aucune nouvelle affirmation n'est ajoutée pour ces commandes. Le gate Worker demandé après `pre.003-fix.003` est satisfait.
## 36. Implémentation pre.004 — Standard Block RAW-direct
`pre.004` ajoute `RawTransactionIngestStandardBlockSource` à l'agrégat runtime existant. La construction reste sans I/O et exige :
```text
WsEndpointSettings kind solana_standard
SolanaBlockSubscribeFilter
SolanaCommitment Confirmed ou Finalized
```
Au runtime, la source réutilise `SolanaStandardWsSession::connect` et `block_subscribe` avec :
```text
encoding = Base64
transactionDetails = Full
maxSupportedTransactionVersion = 1
showRewards = false
```
Aucun `HttpTransportPool`, aucun `getBlock` HTTP et aucun second acteur WebSocket ne sont ajoutés à cette source.
## 37. Qualification RAW-direct et sûreté block:null
La projection accepte uniquement des versions explicitement qualifiées :
```text
Legacy -> RawTransactionVersion::Legacy
0 -> RawTransactionVersion::Number(0)
1 -> RawTransactionVersion::Number(1)
>1 -> source.standard_block_transaction_version_unsupported
omise/null -> source.standard_block_transaction_version_unqualified
```
Le matériau Common RAW direct est construit à partir du wire Base64 de chaque transaction avec signature embarquée, slot, `blockTime`, `meta`, version et index de transaction. La fixture V1 locale sérialise un vrai `RawSolanaTransactionMessage::V1` par les types publics de `ksp-raw-transaction-lib` avant projection ; la tranche ne déduit donc pas V1 d'une simple étiquette.
Les gardes suivantes sont fail-closed avant progression de frontier :
```text
context.slot != notification.slot
notification.err != null
block == null
transactions omitted/null
transaction non Base64
version omise/null/>1
signature embarquée invalide
index usize non représentable en u32
```
`block: null` n'est jamais traité comme bloc vide ou slot settled. Pour un bloc non vide, le slot n'est enregistré settled qu'après l'admission réussie de toutes ses transactions. La voie directe ne détourne pas `hydration_pending`; un arrêt ou une faute au milieu du bloc ne produit aucune progression transitoire.
## 38. Identité, redaction et composition pre.004
La clé logique Standard Block est dérivée de :
```text
domain KSP live source key
family = standard_block
network
safe provider identity
safe endpoint identity
commitment
private block-filter fingerprint
SHA-256 -> [u8; 32]
```
`Debug` n'expose que des identités sûres, le type de filtre et les longueurs d'empreinte/clé. Un pubkey de `MentionsAccountOrProgram` n'est pas recopié. L'agrégat public gagne `from_standard_block_source` et `try_push_standard_block_source` avec les mêmes bornes `1..32`, invariant réseau unique et rejet transactionnel des doublons.
Une seule source reste productivement activable. Une collection `2..32` demeure `runtime_resources.multi_source_activation_pending` avant spawn jusqu'à `pre.007`.
## 39. Preuves déterministes ajoutées pre.004
Worker unit tests ajoutés couvrent :
```text
validation protocol/commitment Standard Block
source_key stable, filter-sensitive et redacted
qualification exacte Legacy/V0/V1
rejet version omise/null/>1
fixture V1 wire -> matériau Common RAW direct exact
rejet duplicate Standard Block identity
```
Canaris externes ajoutés/étendus :
```text
public_api : construction et composition Standard Block depuis crate root
dependency_boundary : façade Transport uniquement, sans getBlock HTTP/direct network crate
hardening : block:null/version/encoding/redaction explicites
release_completeness : export et canaris pre.004 obligatoires
```
## 40. Validations locales post-modification pre.004
Le toolchain Cargo/Rustfmt reste indisponible dans l'environnement d'assemblage. Les commandes Cargo post-`pre.004` sont donc `NON EXÉCUTÉ LOCAL`; seuls les audits statiques effectivement lancés sont déclarés PASS dans le delta de livraison.
## 41. Non-claims pre.004
`pre.004` ne prétend pas :
```text
avoir ajouté Helius transactionSubscribe productif
avoir ajouté HTTP live polling
avoir activé plusieurs sources simultanément
avoir implémenté le fanout d'observations Store multi-source
avoir ajouté un fallback HTTP getBlock/getTransaction à Standard Block
avoir étendu le RAW-direct à une version >1 ou ambiguë
avoir transformé block:null en progression
avoir ajouté une dépendance réseau directe au Worker
avoir exécuté Cargo localement après modification
```
## 42. Gate opérateur requis avant pre.005
Après application du delta :
```bash
cargo fmt --all -- --check
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
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-worker-raw-transaction-ingest-lib
cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal
cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features
cargo tree --duplicates
```
`pre.005` ne doit pas commencer si une anomalie de format, règle, compilation, API, dépendance ou test apparaît.