# Delta 0.3.13-pre.004 — Standard Solana blockSubscribe RAW-direct qualifié ## Base requise ```text delivery précédente : 0.3.13-pre.003-fix.003 Cargo base : 0.3.13-pre.3.fix.3 delta base : deltas/0.3.13/pre.003-fix.003.md archive delta base : ksp-general-0.3.13-pre.003-fix.003.zip ``` Le gate opérateur reçu sur cette base est vert pour toutes les commandes exécutées : `cargo fmt`, `cargo fmt --check`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict et toutes les suites de `ksp-worker-raw-transaction-ingest-lib` (`75` unit, `4` cross-layer, `10` dependency-boundary, `17` hardening, `11` public-api, `4` release-completeness, `0` doc-test). Cette exécution ne contenait pas le test Transport ni les commandes `cargo tree`; ils ne sont donc pas déclarés PASS pour ce gate précis. ## Objectif Ajouter la deuxième source Solana Standard WebSocket de `0.3.13` sans dupliquer Transport : ```text Solana standard WS blockSubscribe -> Full + Base64 + maxSupportedTransactionVersion=1 + showRewards=false -> qualification explicite Legacy / V0 / V1 -> Common RAW direct par transaction -> admission centrale Worker -> Store ``` La source ne possède pas de fallback HTTP. Tout bloc ou transaction non qualifiable échoue explicitement et sûrement. ## Version ```text livraison : 0.3.13-pre.004 workspace.package.version : 0.3.13-pre.4 archive : ksp-general-0.3.13-pre.004.zip ``` `Cargo.toml` passe également de la version de fichier `545` à `546`. ## Source Standard Block Nouvelle surface publique Worker : ```text RawTransactionIngestStandardBlockSource RawTransactionIngestRuntimeResources::from_standard_block_source RawTransactionIngestRuntimeResources::try_push_standard_block_source ``` Construction caller-composed : ```text WsEndpointSettings kind solana_standard SolanaBlockSubscribeFilter SolanaCommitment Confirmed ou Finalized ``` La construction est sans I/O. Elle valide le protocole, le commitment, le réseau et la représentation sûre provider/endpoint avant spawn. Au runtime, la source réutilise exclusivement : ```text SolanaStandardWsSession::connect SolanaStandardWsSession::block_subscribe ``` Configuration exacte : ```text encoding = Base64 transactionDetails = Full maxSupportedTransactionVersion = 1 showRewards = false ``` Aucun client WebSocket direct, `getBlock`, `getTransaction`, `reqwest`, `tokio-tungstenite`, `tonic` ou SDK provider n'est ajouté au Worker. ## Qualification RAW-direct La version est fail-closed : ```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 direct conserve : ```text signature embarquée dans le wire Base64 slot blockTime meta version qualifiée transactionIndex dans le bloc ``` Les fixtures locales construisent et sérialisent des wires Legacy, V0 et V1 avec les types publics de `ksp-raw-transaction-lib`, puis vérifient le Common RAW canonique obtenu. La preuve V1 ne repose donc pas uniquement sur une étiquette `version=1`. La parité historique `blockSubscribe` / `getBlock` Legacy reste déjà matérialisée dans `ksp-job-backfill-lib/tests/ws_raw_parity.rs`; `pre.004` rejoue localement les matérialisations Legacy/V0 et ajoute la qualification V1. ## block:null et formes ambiguës Les cas suivants sont des fautes sûres avant progression de frontier : ```text context.slot différent du slot de notification notification err non null block null transactions omitted/null transaction non Base64 version omise/null/>1 signature embarquée invalide transaction index non représentable en u32 ``` `block: null` n'est jamais assimilé à un bloc vide ou à un slot traité. Le décodage Transport qui distingue `block:null` et `err` est conservé tel quel. Pour un bloc non vide, le slot n'est enregistré settled qu'après l'admission réussie de toutes ses transactions. La voie RAW-direct n'incrémente pas `hydration_pending`; le processing frontier ne peut donc pas avancer transitoirement au milieu du traitement d'un même bloc et un stop/faute partiel ne devient jamais une progression. ## Identité logique et redaction Le `source_key` Standard Block est dérivé de : ```text domain KSP live-source v1 family = standard_block network safe provider identity safe endpoint identity commitment private block-filter fingerprint ``` Les filtres `All` et `MentionsAccountOrProgram(pubkey)` sont distingués par empreinte privée. Le pubkey brut n'est pas recopié dans `Debug`, snapshot ou provenance textuelle. Le bound global `1..32`, l'invariant réseau unique et le rejet transactionnel des doublons de `pre.002` s'appliquent à cette nouvelle famille. ## Activation runtime Le contrat reste volontairement mono-source avant `pre.007` : ```text 1 source Yellowstone : productif 1 source Standard Logs : productif 1 source Standard Block : productif 2..32 sources : composition validable start 2..32 : runtime_resources.multi_source_activation_pending avant spawn ``` Aucune source configurée n'est silencieusement ignorée. ## Preuves ajoutées Unit tests Worker : ```text validation protocole/commitment Standard Block source_key stable et filter-sensitive redaction filtre/url/source-key qualification exacte Legacy/V0/V1 rejet version omise/null/>1 wires Legacy/V0/V1 -> Common RAW direct avec signature/version/index exacts rejet duplicate Standard Block identity ``` Canaris externes : ```text public_api : construction/composition depuis crate root dependency_boundary : façade Transport seulement, sans fallback HTTP/direct network crate hardening : block:null, erreurs, version, encoding et redaction explicites release_completeness : export et canaris pre.004 obligatoires ``` ## Fichiers modifiés ```text Cargo.toml crates/ksp-worker-raw-transaction-ingest-lib/README.md crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md crates/ksp-worker-raw-transaction-ingest-lib/src/lib.rs crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/dependency_boundary.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/public_api.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md ``` ## Fichiers ajoutés ```text deltas/0.3.13/pre.004.md ``` ## Fichiers supprimés ```text aucun ``` ## Non-claims `pre.004` ne prétend pas : ```text Helius transactionSubscribe productif HTTP live block polling supervision simultanée de plusieurs sources fanout Store d'observations multi-source fallback HTTP getBlock/getTransaction pour Standard Block RAW-direct pour version >1 ou version ambiguë block:null considéré comme progression nouvelle dépendance externe ``` ## Validation dans l'environnement d'assemblage Le toolchain Rust/Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-`pre.004` restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques KSP, le scan des identifiants normatifs et le contrôle exhaustif du diff sont exécutés avant packaging et leurs résultats finaux sont consignés ci-dessous avant livraison. ## Gate opérateur requis avant pre.005 ```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 ce gate révèle une anomalie. ## Résultats statiques finaux de l'assemblage ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean Markdown table audit: clean (340 tables, 835 files) Normative rule definitions: 489 Unique normative IDs: 489 Duplicates: 0 ``` Contrôle exhaustif avant packaging : ```text 12 fichiers existants modifiés 1 fichier ajouté 0 fichier supprimé 12/12 headers versionnés incrémentés exactement de +1 Cargo.toml hors header : uniquement workspace.package.version 0.3.13-pre.3.fix.3 -> 0.3.13-pre.4 aucune dépendance ajoutée, supprimée ou modifiée ```