6.6 KiB
Delta 0.3.10-pre.005 — qualification RAW WS standard et Helius
Base requise
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 :
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
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 :
commitment = confirmed
encoding = base64
transactionDetails = full
maxSupportedTransactionVersion = 0
showRewards = false
Le test compare :
HTTP getBlock observed
vs
WS blockSubscribe
puis exige :
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 :
transaction wire
meta
signature
slot
transactionIndex
mais ne porte pas, dans le contrat typé actuel :
blockTime
version
Le test construit donc la meilleure projection RAW possible sans inventer ces champs et prouve :
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 :
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 :
[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 :
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 :
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 :
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 :
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
crates/ksp-job-backfill-lib/tests/ws_raw_parity.rs
deltas/0.3.10/pre.005.md
Fichiers modifiés
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
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é
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
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.