# Delta `0.3.10-pre.005` — qualification RAW WS standard et Helius ## Base requise ```text livraison : 0.3.10-pre.004-fix.001 workspace.package.version = 0.3.10-pre.4.fix.1 ``` Le rejeu opérateur communiqué le 2026-09-06 ferme intégralement le fix : audits statiques propres, `cargo check --workspace` PASS, Clippy strict PASS, tests common PASS, 387 tests Transport plus suites publiques/release/doctests PASS, et suite complète Backfill PASS. Les arbres Cargo n'ont pas été rejoués sur le fix car aucune dépendance ni feature n'y avait changé. ## Objectif Qualifier les deux surfaces WebSocket déjà présentes sans ouvrir le Worker : ```text Solana standard blockSubscribe full/base64 -> prouver ou refuser la production RAW directe Helius transactionSubscribe full/base64 -> prouver ou refuser la production RAW directe ``` Aucun adapter productif n'est placé dans Transport ou Backfill. `TR-C2` reste Worker-owned. ## Version ```text workspace.package.version = 0.3.10-pre.5 ``` Le header du `Cargo.toml` racine passe de `495` à `496`. Le workspace reste à `20` membres. ## Qualification positive — `blockSubscribe` Le canari cross-layer `crates/ksp-job-backfill-lib/tests/ws_raw_parity.rs` monte un serveur HTTP local et un serveur WebSocket standard local sur une fixture commune. Configuration qualifiée : ```text commitment = confirmed encoding = base64 transactionDetails = full maxSupportedTransactionVersion = 0 showRewards = false ``` Le test compare : ```text HTTP getBlock observed vs WS blockSubscribe ``` puis exige : ```text même SolanaConfirmedBlock même RawTransactionReference même slot même block_time mêmes bytes RAW v1 même content_hash ``` La qualification directe est volontairement bornée au sous-ensemble legacy/v0 prouvé. Transaction V1 reste au gate `pre.006`. ## Qualification négative — Helius `transactionSubscribe` Le même canari ouvre une session Helius locale et une hydration HTTP de référence pour la même transaction. L'enveloppe full/base64 qualifiée conserve : ```text transaction wire meta signature slot transactionIndex ``` mais ne porte pas, dans le contrat typé actuel : ```text blockTime version ``` Le test construit donc la meilleure projection RAW possible sans inventer ces champs et prouve : ```text même identité que HTTP même slot que HTTP block_time différent bytes RAW v1 différents content_hash différent ``` Décision normative : ```text Helius transactionSubscribe full/base64 -> signal live riche -> HTTP hydration obligatoire -> persistence RAW depuis le matériau HTTP complet ``` Aucun RAW v2 automatique et aucune normalisation ad hoc ne sont introduits. ## Dependency firewall Pour les serveurs WebSocket locaux du canari, le manifest Backfill ajoute uniquement : ```text [dev-dependencies] tokio-tungstenite = { workspace = true, features = ["handshake"] } ``` `tests/dependency_boundary.rs` vérifie explicitement que `tokio-tungstenite` n'apparaît pas dans `[dependencies]` et reste dans `[dev-dependencies]`. Il n'existe toujours aucun edge productif : ```text ksp-onchain-transport-lib -> ksp-raw-transaction-lib ksp-raw-transaction-lib -> ksp-onchain-transport-lib ``` ## Documentation `docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md` distingue désormais : ```text blockSubscribe full/base64 legacy-v0 -> direct après parité prouvée Helius transactionSubscribe full/base64 -> signal + hydration HTTP ``` Le plan `031` et la validation `027` enregistrent la même qualification, la fermeture opérateur de `pre.004-fix.001` et le maintien de Transaction V1 dans `pre.006`. ## Fraîcheur externe revalidée Les surfaces changeantes ont été revalidées le 2026-09-06 : ```text Solana blockSubscribe : méthode unstable, confirmed/finalized, base64, full, maxSupportedTransactionVersion disponible Helius transactionSubscribe : full transaction streaming disponible ; enveloppe KSP qualifiée sans blockTime/version ``` Sources documentaires : ```text https://solana.com/docs/rpc/websocket/blocksubscribe https://solana.com/docs/rpc/json-structures https://www.helius.dev/docs/rpc/websocket/transaction-subscribe https://www.helius.dev/blog/introducing-next-generation-enhanced-websockets ``` Ces faits d'accès/protocole restent documentaires et ne deviennent pas des constantes provider dans le Worker. ## Fichiers ajoutés ```text crates/ksp-job-backfill-lib/tests/ws_raw_parity.rs deltas/0.3.10/pre.005.md ``` ## Fichiers modifiés ```text Cargo.toml crates/ksp-job-backfill-lib/Cargo.toml crates/ksp-job-backfill-lib/tests/dependency_boundary.rs docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md docs/plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md docs/validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md ``` ## Fichiers supprimés Aucun. ## Validations exécutées dans l'environnement d'assemblage ```text python3 scripts/audit_rust_workspace_rules.py General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas Markdown table audit: clean (339 table(s), 759 file(s)) ``` L'environnement d'assemblage ne fournit ni `cargo`, ni `rustc`, ni `rustfmt` ; aucun gate Cargo de `pre.005` n'est déclaré PASS localement. ## Gate opérateur demandé ```bash 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 cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p ksp-raw-transaction-lib cargo test -p ksp-onchain-transport-lib cargo test -p ksp-job-backfill-lib cargo tree -p ksp-job-backfill-lib --edges normal cargo tree -p ksp-job-backfill-lib --edges dev cargo tree -p ksp-job-backfill-lib -e features ``` Les arbres sont requis cette fois-ci parce que `pre.005` ajoute une dev-dependency et doit prouver qu'elle ne contamine pas le graphe productif. ## Décisions prises ```text blockSubscribe full/base64 legacy-v0 est qualifié RAW-direct Helius transactionSubscribe full/base64 n'est pas qualifié RAW-direct Helius doit hydrater par HTTP avant persistence RAW aucun champ manquant n'est inventé aucun RAW v2 automatique TR-C2 reste Worker-owned aucun code de production ajouté dans cette tranche Transaction V1 reste à pre.006 ``` ## Questions ouvertes Aucune question ne bloque le gate déterministe de `pre.005`. `pre.006` reste dédiée aux adapters Yellowstone transactions/blocks et au gate Transaction V1 avant toute persistance directe de ces matériaux.