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.

View File

@@ -1,11 +1,11 @@
<!-- file: docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# 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, `pre.003` ajoute Standard Solana `logsSubscribe` + hydration HTTP observée, `pre.004` ajoute Standard Solana `blockSubscribe` RAW-direct qualifié Legacy/V0/V1 et `pre.005` ajoute Helius `transactionSubscribe` + hydration commune, 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, `pre.004` ajoute Standard Solana `blockSubscribe` RAW-direct qualifié Legacy/V0/V1, `pre.005` ajoute Helius `transactionSubscribe` + hydration commune et `pre.006` ajoute le live HTTP block polling run-local, sans activer encore la supervision simultanée.
## 2. Archive stable contrôlée
@@ -1067,4 +1067,91 @@ 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
```
## 51. Gate opérateur pre.005-fix.001 reçu
Preuve communiquée le 10 septembre 2026 :
```text
fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 838 files
cargo check --workspace : PASS
clippy workspace all-targets all-features -D warnings : PASS
worker unit : 84/84 PASS
cross-layer : 4/4 PASS
dependency boundary : 12/12 PASS
hardening : 19/19 PASS
public API : 13/13 PASS
release completeness : 4/4 PASS
```
## 52. Surface pre.006 matérialisée
```text
RawTransactionIngestHttpBlockPollingSource
RawTransactionIngestRuntimeResources::from_http_block_polling_source
RawTransactionIngestRuntimeResources::try_push_http_block_polling_source
getSlot(commitment) au démarrage et à chaque cycle
getBlocksWithLimit(next_scan_slot, bounded_limit, commitment)
getBlock observed sur les slots listés
Full/Base64/maxV1/rewards=false
RAW-direct Legacy/V0/V1
timer Worker stop-preemptible
```
Aucun manifeste de crate ni aucune dépendance Transport/Config supplémentaire n'est requis.
## 53. Invariants statiques vérifiés pre.006
La tranche encode explicitement :
```text
start_slot = premier getSlot du run
next_scan_slot initial = start_slot
aucune découverte avant next_scan_slot
découverte strictement croissante
getBlock=null sur slot listé => next_scan_slot reste ce slot
skipped slot non listé => pas de faux gap
slot settled seulement après admission de tout le bloc
aucun hydration_pending pour la voie RAW-direct
version Legacy/V0/V1 qualifiée, ambiguë/>1 rejetée
provenance endpoint/provider réellement observé sur getBlock
source_key indépendant du poll interval et du batch size
```
Les anciens canaris de `0.3.12` qui interdisaient globalement `get_block_observed`/`tokio::time::sleep` ont été resserrés plutôt que supprimés : le coordinator d'hydration continue de ne posséder ni polling ni retry, tandis que ces primitives sont explicitement permises et bornées dans la seule source HTTP polling.
## 54. Validation locale d'assemblage pre.006
Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques exécutés sur l'état final sont consignés dans le delta `pre.006`.
## 55. Non-claims pre.006
```text
pas de scan historique avant le start_slot du run
pas de checkpoint durable de polling
pas de Backfill implicite
pas de multi-source simultané avant pre.007
pas de retry/backoff HTTP implémenté dans le Worker
pas de client reqwest direct
pas de Config lu dans le Worker
pas de version transaction >1 ou ambiguë acceptée
pas de getBlock=null assimilé à un slot vide
```
## 56. Gate opérateur requis avant pre.007
```bash
cargo fmt --all
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
```