v0.3.13-pre.006

This commit is contained in:
2026-09-10 16:05:52 +02:00
parent c711213dcc
commit f688325170
14 changed files with 1549 additions and 51 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Plan v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source RawTransaction
@@ -1042,4 +1042,106 @@ cargo tree --duplicates
```
`pre.006` ne commence pas tant qu'une anomalie de format, règle, compilation, test ou frontière de dépendances subsiste.
## 50. Gate opérateur pre.005-fix.001 reçu avant pre.006
Le gate opérateur communiqué le 10 septembre 2026 est entièrement vert après `pre.005-fix.001` :
```text
cargo fmt --all + --check : PASS
audit Rust général : clean
export completeness : 0 candidate
workspace Rust rules : clean
Markdown : clean, 340 tables / 838 files
cargo check --workspace : PASS
cargo clippy --workspace --all-targets --all-features -- -D warnings : PASS
worker unit : 84/84 PASS
cross_layer_completeness : 4/4 PASS
dependency_boundary : 12/12 PASS
hardening : 19/19 PASS
public_api : 13/13 PASS
release_completeness : 4/4 PASS
doc-tests Worker : 0/0 PASS
```
Cette preuve ferme la tranche Helius et autorise le polling HTTP live.
## 51. Implémentation pre.006 — HTTP live block polling
`pre.006` ajoute `RawTransactionIngestHttpBlockPollingSource` à l'agrégat borné. La construction caller-owned reçoit :
```text
HttpTransportPool
HttpRoleName polling
SolanaCommitment Confirmed ou Finalized
poll_interval borné
max_discovered_blocks_per_cycle borné
```
Le profil doit exposer `getSlot`, `getBlocksWithLimit` et `getBlock` sur un réseau unique. Le Worker ne construit pas de client HTTP, ne lit pas Config et ne possède aucun retry HTTP : sélection d'endpoint, rate limit, retry et backoff restent dans Transport.
Bornes retenues :
```text
poll_interval : défaut 1 s, min 100 ms, max 30 s
max_discovered_blocks_per_cycle : défaut 128, min 1, max 1024
```
## 52. Borne de run et algorithme de progression
Au démarrage de la source :
```text
start_slot = getSlot(commitment)
next_scan_slot = start_slot
```
Aucun appel de découverte ou matérialisation ne doit viser un slot inférieur à `start_slot`. Chaque cycle exécute ensuite :
```text
current_tip = getSlot(commitment)
getBlocksWithLimit(next_scan_slot, bounded_limit, commitment)
pour chaque slot listé : getBlock observed(slot, Full/Base64/maxV1/rewards=false)
```
Les slots absents de `getBlocksWithLimit` sont traités comme skipped/non produits et ne déclenchent aucun faux gap. Si un slot explicitement listé retourne `getBlock = null`, ce slot reste `next_scan_slot`; la source le retente au cycle suivant et ne progresse jamais silencieusement au-delà.
La cadence entre cycles appartient au Worker via un timer stop-preemptible. Aucun task par tick n'est créé.
## 53. RAW-direct, version et provenance HTTP
Comme Standard Block, le polling HTTP produit directement le Common RAW depuis chaque transaction `getBlock` :
```text
encoding = Base64
transactionDetails = Full
maxSupportedTransactionVersion = 1
showRewards = false
Legacy / V0 / V1 uniquement
```
Version omise/nulle, version `>1`, transaction non Base64 ou champ transactions omis/nul sont fail-closed. La provenance utilise l'endpoint/provider réellement gagnant de `getBlock observed`, `protocol = solana_http`, `method = block_polling_get_block`, `origin = Live`.
Le slot n'est déclaré settled qu'après admission réussie de toutes ses transactions. La voie directe ne détourne pas `hydration_pending`.
## 54. Identité logique HTTP polling
Le `source_key` dérive de :
```text
domain KSP live source key
family = http_block_polling
network
polling role
commitment
private safe route-profile fingerprint
SHA-256 -> [u8; 32]
```
L'empreinte de profil inclut les identités sûres endpoint/provider et les capacités des routes pertinentes. La cadence et la limite de découverte sont volontairement exclues : changer un réglage de timing ne doit pas permettre de contourner la détection de doublon d'une même source logique. Les états de rate-limit/health dynamiques n'entrent pas non plus dans cette identité.
## 55. Frontières et report pre.007
`pre.006` rend HTTP Block Polling productif en mode source unique. L'agrégat `1..32` accepte cette nouvelle famille et rejette les doublons/cross-network avant mutation, mais une collection `>1` continue d'échouer fermée avant spawn.
La supervision simultanée, le lifecycle par source et l'inventaire multi-source restent exclusivement `pre.007`. `pre.006` ne transforme pas le poller HTTP en Backfill et ne crée aucun checkpoint durable inter-run.