# Validation v0.3.12 — Yellowstone + hydration HTTP + continuité de run du Worker RawTransaction ## 1. Rôle du document Ce document enregistre les preuves réellement exécutées, les non-claims et les gates progressifs de `0.3.12`. Une commande non exécutée n'est jamais déclarée PASS. `pre.001` est un gate de lecture/audit/sizing. Il ne contient aucun code Worker réseau productif. ## 2. Gate `pre.001` — base stable ### 2.1 Archive contrôlée ```text archive : khadhroony-solana-project-v0.3.11.zip SHA-256 : a6bb59935650a7f48630d12ef80fbd1a44a84819dd129b085ff7f467369535fc bytes : 8125100 entries : 1950 unzip -t : PASS root unique : PASS absolute entries : 0 path traversal : 0 symlinks : 0 .git/ : 0 target/ : 0 node_modules/ : 0 Cargo.lock : 0 .env : 0 workspace members : 21 workspace.package.version : 0.3.11 ``` `deltas/0.3.11/rel.001.md` est présent. ### 2.2 Préconditions fonctionnelles Contrôlé dans la stable : ```text ksp-worker-raw-transaction-ingest-lib présent README/USAGE présents aucun edge Worker -> Transport aucune source réseau productive dans src/ ksp-raw-transaction-lib présent ksp-onchain-transport-lib présent avec Yellowstone gRPC générique ksp-store-lib présent ksp-job-backfill-lib ne dépend pas du Worker ``` Résultat : PASS. ## 3. Baseline statique locale avant modification Exécuté dans l'archive extraite : ```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 ``` Résultat : PASS. Exécuté : ```text python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas Markdown table audit: clean (340 table(s), 798 file(s)) ``` Résultat : PASS. ## 4. Cargo local dans l'environnement d'assemblage `cargo` n'est pas installé dans l'environnement d'assemblage utilisé pour `pre.001`. Non exécuté localement : ```text cargo fmt --all -- --check cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test --workspace --all-targets --all-features cargo tree --duplicates ``` Ces commandes ne sont pas déclarées PASS localement. ## 5. Preuve opérateur de la stable `0.3.11` Le journal fourni avec la demande d'ouverture montre sur la stable : ```text cargo clean : exécuté cargo fmt --all -- --check : sans erreur visible audit Rust : clean audit Markdown : clean (340 tables, 798 fichiers) cargo check --workspace : terminé sans erreur cargo clippy --workspace --all-targets --all-features -- -D warnings : terminé sans erreur cargo test --workspace : suites affichées vertes ; tests live opt-in ignorés conformément à leur contrat cargo tree Worker normal/features : demandé dans le journal opérateur ``` Cette preuve opérateur concerne l'état stable d'entrée. Elle n'est pas réétiquetée comme exécution locale de `0.3.12-pre.001`. ## 6. Audit humain des règles Sources lues pour le gate : ```text RULES.md ROADMAP.md CHANGELOG.md docs/000-README.md docs/rules/RULES_GENERAL.md docs/rules/RULES_KSP.md docs/rules/RULES_RUST.md docs/rules/RULES_DEPENDENCIES.md docs/rules/RULES_DOCUMENTATION.md docs/rules/FILE_CONTRACTS.md docs/rules/VERSION_WORKFLOW.md docs/rules/PROMPT_STRUCTURE.md ``` Résultat : aucune divergence normative active nécessitant une correction de règle en `pre.001`. Vérifications clés : ```text D2 reste STRUCTURAL nom Worker canonique = ksp-worker-raw-transaction-ingest-lib Worker/Job restent séparés Config reste propriétaire de l'environnement et des secrets Store backend direct reste interdit au Worker VER-ID-009 impose 0.3.12-pre.1 pour cette prerelease non-fix ``` ## 7. Sources internes de handoff auditées Lecture/inventaire réalisés sur : ```text docs/plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md docs/validation/028-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION.md crates/ksp-worker-raw-transaction-ingest-lib/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/ crates/ksp-worker-raw-transaction-ingest-lib/tests/ crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/ docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md 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 crates/ksp-raw-transaction-lib/README.md crates/ksp-raw-transaction-lib/USAGE.md crates/ksp-raw-transaction-lib/src/ crates/ksp-raw-transaction-lib/tests/ crates/ksp-onchain-transport-lib/Cargo.toml crates/ksp-onchain-transport-lib/README.md crates/ksp-onchain-transport-lib/USAGE.md crates/ksp-onchain-transport-lib/src/grpc_*.rs crates/ksp-onchain-transport-lib/src/rpc_transactions.rs crates/ksp-onchain-transport-lib/src/rpc_blocks.rs crates/ksp-onchain-transport-lib/tests/ crates/ksp-store-lib/README.md crates/ksp-store-lib/USAGE.md crates/ksp-store-lib/src/ crates/ksp-worker-api/README.md crates/ksp-worker-api/USAGE.md crates/ksp-worker-api/src/ crates/ksp-config-lib/README.md crates/ksp-config-lib/USAGE.md crates/ksp-config-lib/src/ ``` Le résultat d'inventaire est détaillé dans le plan `033`. ## 8. Preuve Worker stable Le Worker stable possède exactement huit fichiers de production sous `src/` : ```text admission.rs error.rs identity.rs lib.rs persistence.rs runtime.rs settings.rs snapshot.rs ``` Le manifest normal ne contient pas `ksp-onchain-transport-lib`, `ksp-config-lib`, `ksp-job-backfill-lib`, backend physique, Tonic, Reqwest ni Yellowstone proto. Un scan source `grpc|yellowstone|http|ws|transport` ne révèle qu'une documentation signalant l'absence de source live ; aucun adapter réseau productif n'est présent. Résultat : PASS pour la précondition `0.3.11`. ## 9. Preuve Transport actuelle Contrats existants confirmés : ```text YellowstoneGrpcChannel::open_standard_subscribe SolanaYellowstoneGrpcSubscribeSession::next_update SolanaYellowstoneGrpcSubscribeSession::snapshot YellowstoneSubscribeRequest::set_from_slot YellowstoneReplayInfo::first_available HttpTransportPool::get_transaction_observed HttpTransportPool::get_block_observed HttpObservedValue::{value, endpoint_name, provider} ``` Le snapshot Yellowstone indique explicitement : ```text continuity_gap_count : seulement gap prouvé par borne ReplayInfo replay_attempt_count : tentative, pas preuve de couverture duplicate_update_count : observabilité, duplicates toujours livrés last_requested_from_slot last_observed_slot ``` Résultat : PASS pour la réutilisation du moteur existant. ## 10. Audit externe de fraîcheur ### 10.1 Yellowstone versions Source docs.rs courante : ```text yellowstone-grpc-proto latest : 12.7.0 publication : 2026-08-29 workspace KSP : ^12.7 ``` Résultat : aucune mise à jour de dépendance nécessaire en `pre.001`. ### 10.2 Replay upstream Le changelog upstream du 22 juillet 2026 documente la correction `yellowstone-grpc-geyser 14.2.1` pour un cas où `from_slot` + `blocks` était accepté mais aucun Block replay n'était livré avant reprise live. Impact de validation : ```text subscribe accepted != replay proven from_slot sent != replay proven first_available compatible != replay proven ``` Cette menace doit posséder un canari KSP et, si un provider live est disponible, un smoke dédié. ### 10.3 Solana HTTP La documentation officielle courante confirme que `getTransaction` à `confirmed/finalized`, en Base64, fournit les champs nécessaires à la conversion Common RAW déjà qualifiée : `blockTime`, `meta`, `slot`, `transaction`, `version`. Résultat : hydration `getTransaction` maintenue comme référence P0. ### 10.4 Providers OrbitFlare documente encore Devnet gRPC et un free tier Devnet-only. Helius LaserStream documente Yellowstone wire compatibility et un replay provider-specific d'environ 216 000 slots / 24 heures. Ces valeurs ne sont pas transposées dans les constantes KSP. PublicNode reste operator-only dans KSP ; aucune nouvelle assertion provider n'est ajoutée faute de source primaire indexée suffisamment précise pendant ce gate. ## 11. Gate de matrice Yellowstone fermé ### 11.1 Transaction Preuve interne : `YellowstoneTransactionUpdate` contient slot, filter names, created_at et `YellowstoneTransactionInfo`; ce dernier contient signature, transaction, meta, index. Conclusion : candidat hydration ; RAW-direct non prouvé. ### 11.2 TransactionStatus Preuve interne : slot, signature, index, is_vote, error optionnelle. Conclusion : discovery/hydration seulement. ### 11.3 Block Preuve interne : slot, block_time, transactions avec transaction/meta/signature/index, compteurs et metadata block. Conclusion : chaque transaction peut devenir candidat hydration ; aucun pipeline block RAW parallèle. ### 11.4 BlockMeta Conclusion : continuity/health only ; aucune signature donc aucune hydration transaction autonome. ### 11.5 Slot Conclusion : continuity/health only ; aucune admission RAW. ### 11.6 from_slot Conclusion : mécanisme Transport de replay au reconnect, pas checkpoint historique Worker. ### 11.7 ReplayInfo Conclusion : `first_available` prouve seulement une limite de rétention. Un gap est prouvé quand la demande est antérieure à cette borne ; le cas inverse ne prouve pas que toutes les updates filtrées ont été livrées. ## 12. Gate architecture d'injection fermé Décision : ```text nouvel edge autorisé : Worker -> ksp-onchain-transport-lib Worker -> Config : interdit Worker -> Job : interdit Worker -> backend : interdit Worker -> Tonic/Reqwest/yellowstone-grpc-proto direct : non retenu ``` La composition supérieure construit `YellowstoneGrpcChannel`, `YellowstoneSubscribeRequest`, `HttpTransportPool` et `HttpRoleName`. `pre.002` matérialise exactement : ```text RawTransactionIngestYellowstoneSource::new(...) RawTransactionIngestRuntimeResources::new(yellowstone_source) RawTransactionIngestWorker::start_with_runtime_resources(settings, Arc, resources) ``` Les champs restent privés. `RawTransactionIngestWorker::start(settings, Arc)` reste disponible comme foundation source-neutral. Aucune API publique `enqueue` n'est ouverte. ## 13. Gate hydration/provenance fermé Hydration P0 : ```text get_transaction_observed Base64 confirmed/finalized uniquement maxSupportedTransactionVersion = 0 ``` Provenance : route composite encodée dans les champs `RawAcquisitionProvenance` existants, avec provider/endpoint réels du winner HTTP et identité sûre Yellowstone, sous `MAX_RAW_CODE_BYTES`. Aucune migration Store. Un code composite impossible à représenter est rejeté ; aucune troncature silencieuse. ## 14. Gate continuité fermé Décisions : ```text Transport high-watermark != Worker processing frontier processing frontier != blockchain completeness reconnect != replay replay != repair continuity gap prouvé => fault Worker sûr aucun Backfill automatique aucun checkpoint persistant inter-process pending hydration peut survivre au reconnect source dans le même run ``` Le split `pre.007`/`pre.008` évite de coder frontier et replay semantics dans une seule tranche. ## 15. Threat model à transformer en tests Canaris obligatoires : ```text secret/URL/header redaction remote status/error text not copied bounded signal/hydration queues bounded coalescence no duplicate HTTP in-flight for same key no double retry storm stop during connect/reconnect/hydration/replay no admission after stop frontier no orphan task after terminal counter checked arithmetic stale frontier never labelled complete continuity gap terminal and safe ``` ## 16. Smokes live ### 16.1 Disponibilité démontrée par le dépôt Présents et ignored : ```text yellowstone_orbitflare_smoke yellowstone_publicnode_smoke ``` Ils exigent des tokens fournis de manière operator-only. ### 16.2 Disponibilité opérateur pour `pre.001` Aucun secret live n'est fourni dans l'archive. Le journal stable montre ces tests comme ignorés par défaut. Résultat : ```text Worker live smoke : NON EXÉCUTÉ en pre.001 raison : pipeline productif pas encore implémenté + secret/provider live non fourni au gate ``` Aucun faux PASS live n'est enregistré. ## 17. Graphe Cargo cible vérifiable à partir de `pre.002` Attendu : ```text Worker -> core Worker -> logging Worker -> onchain-transport Worker -> raw-transaction Worker -> store facade default-features=false Worker -> worker-api Worker -> sha2 Worker -> tokio ``` Toujours absent : ```text Config Job Backfill Store backend Tauri provider SDK Tonic direct Reqwest direct Yellowstone proto direct ``` ## 18. Sizing et décision release Forecast retenu : ```text pre.001 audit/sizing/plan pre.002 Transport resource/source contract pre.003 Transaction + TransactionStatus signal adapters pre.004 HTTP hydration + provenance composite pre.005 Block + BlockMeta + Slot adapters pre.006 productive source task + supervisor/coalescence pre.007 processing frontier pre.008 reconnect/from_slot/ReplayInfo pre.009 races/retry/backpressure hardening pre.010 cross-layer completeness/security pre.011 technical/live gate pre.012 documentation reconciliation pre.013 publication preparation rel.001 ``` Décision : `0.3.12` reste ouverte et n'est pas rescindée. Toute tranche dépassant réellement 15–20 minutes est scindée avant exécution. ## 19. Validation après modification de `pre.001` Exécuté sur le delta complet : ```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 (340 table(s), 801 file(s)) ``` Résultat : PASS pour les audits statiques locaux. Cargo reste NON EXÉCUTÉ localement car l'outil n'est pas installé. Le gate opérateur demandé après application du delta est : ```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 ``` `pre.001` n'ajoutant aucun Rust, les tests ciblés Worker restent une preuve de non-régression facultative mais recommandée : ```bash 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 ``` ## 20. Non-claims `pre.001` `pre.001` ne prétend pas avoir : ```text ajouté l'edge Worker -> Transport dans Cargo ouvert une session Yellowstone dans le Worker hydraté une transaction live persisté un RAW live Yellowstone prouvé un RAW-direct Yellowstone prouvé un replay provider complet implémenté une frontier implémenté un repair enrichi les snapshots runtime exécuté un smoke live Worker exécuté Cargo dans l'environnement d'assemblage ``` ## 21. Critère de sortie `pre.001` Le gate est fermé si : ```text base stable prouvée règles auditées surfaces internes inventoriées fraîcheur externe auditée matrice Yellowstone fermée injection runtime décidée hydration/provenance décidées frontier/replay/repair distingués threat model défini smokes classifiés Cargo graph cible défini forecast <20 min par tranche maintien/split décidé plan + validation + delta créés audits statiques post-modification verts ``` ## 22. Gate opérateur reçu pour `pre.001` L'opérateur a exécuté après application de `pre.001` : ```text cargo fmt --all : sans erreur visible audit Rust : clean Rust export completeness : 0 candidate KSP workspace Rust rule audit : clean audit Markdown : clean (340 tables, 801 fichiers) cargo check --workspace : PASS visible cargo clippy --workspace --all-targets --all-features -- -D warnings : PASS visible ``` Aucun `cargo test` ou `cargo tree` n'est présent dans ce journal ; ils ne sont donc pas revendiqués pour ce gate. Résultat : `pre.001` est accepté comme base technique de `pre.002`. ## 23. Gate `pre.002` — edge Transport + contrats runtime/source La tranche matérialise exactement : ```text workspace.package.version = 0.3.12-pre.2 Worker -> ksp-onchain-transport-lib RawTransactionIngestYellowstoneSource RawTransactionIngestRuntimeResources RawTransactionIngestWorker::start_with_runtime_resources(...) ``` Le constructeur `RawTransactionIngestYellowstoneSource::new` effectue uniquement des validations déterministes sans I/O : ```text YellowstoneSubscribeRequest::validate au moins une famille transactions / transactions_status / blocks commitment explicite confirmed ou finalized rôle HTTP configuré compatible avec le request kind get_transaction cluster identique entre Yellowstone et toutes les routes HTTP compatibles ``` `RawTransactionIngestRuntimeResources` conserve un seul source Yellowstone à champs privés et vérifie la cohérence avec `RawTransactionIngestSettings.network` avant le démarrage. `start_with_runtime_resources` préserve également le gate Store/settings existant. En `pre.002`, il ne démarre volontairement encore aucun source live : les ressources sont validées mais ne sont pas activées, puis le démarrage délègue au runtime source-neutral existant. L'activation du stream reste réservée à `pre.006` conformément au plan. ## 24. Canaris déterministes ajoutés en `pre.002` Les preuves statiques/unitaires ajoutées couvrent : ```text manifest Worker exact avec un seul nouvel edge Transport aucun Config / Job / backend Store / tonic / reqwest / yellowstone-grpc-proto direct source confirmed + transaction + getTransaction route accepté processed et commitment implicite rejetés absence de famille d'ingestion rejetée rôle HTTP sans get_transaction rejeté mismatch cluster Yellowstone/HTTP rejeté mismatch réseau Worker/source rejeté Debug sans URL, token, filter name ou client inner API publique des deux resource types disponible depuis crate root start_with_runtime_resources disponible depuis crate root aucun enqueue/send/inner/client getter public aucun open_standard_subscribe / next_update / get_transaction_observed dans la tranche Transport confiné à runtime_resources.rs dans les sources Worker ``` Aucun nouveau code Config, Store backend, Backfill ou provider n'est introduit. ## 25. Validation locale après modification de `pre.002` Exécuté 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 ``` L'audit Markdown est rejoué après création du delta final afin d'inclure le nouveau fichier `deltas/0.3.12/pre.002.md`. `cargo`, `rustc` et `rustfmt` ne sont pas installés dans cet environnement ; aucun gate Cargo local n'est revendiqué. Gate opérateur demandé après application du delta : ```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-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 ``` ## 26. Non-claims `pre.002` `pre.002` ne prétend pas avoir : ```text ouvert une session Yellowstone lu une update Transaction/TransactionStatus/Block émis un signal Worker privé appelé getTransaction pour hydration assemblé une provenance composite persisté une transaction issue du réseau coalescé des hydrations modifié la processing frontier branché from_slot/replay info exécuté un smoke live Worker réconcilié README/USAGE/architecture pour la surface finale 0.3.12 ``` La tranche suivante reste `pre.003` : adaptation déterministe `Transaction` + `TransactionStatus` vers le signal Worker privé, sans HTTP ni persistence réseau. ## 27. Gate opérateur reçu pour `pre.002` L'opérateur a exécuté après application de `pre.002` : ```text cargo fmt --all : sans erreur visible audit Rust : clean Rust export completeness : 0 candidate KSP workspace Rust rule audit : clean audit Markdown : clean (340 tables, 802 fichiers) cargo check --workspace : PASS visible cargo clippy --workspace --all-targets --all-features -- -D warnings : PASS visible cargo test -p ksp-worker-raw-transaction-ingest-lib : 41 PASS, 0 fail cargo tree Worker normal : exécuté et inspecté cargo tree Worker features : exécuté et inspecté cargo tree --duplicates : exécuté ; inventaire informatif des versions dupliquées, sans gate d'unicité artificiel ``` Le graphe confirme que le Worker possède directement uniquement l'edge `ksp-onchain-transport-lib`; `reqwest`, `tonic`, `tonic-prost` et `yellowstone-grpc-proto` restent transitifs sous Transport. Résultat : `pre.002` est accepté comme base technique de `pre.003`. ## 28. Gate `pre.003` — signal privé Transaction + TransactionStatus La tranche matérialise : ```text workspace.package.version = 0.3.12-pre.3 projection Yellowstone Transaction -> signal Worker privé projection Yellowstone TransactionStatus -> même signal Worker privé aucune ouverture de stream aucune hydration HTTP aucune persistence réseau ``` Le signal reste strictement interne à `runtime_resources.rs` et n'est ni `pub`, ni `pub(crate)`, ni réexporté au crate-root. Sa forme source-neutral actuelle est : ```text network signature RawTransactionSignature slot transaction_index optionnel source family Transaction | TransactionStatus safe Yellowstone source route provider + endpoint_id matched_filter_count matched_filter_fingerprint SHA-256 déterministe created_at source-neutral optionnel seconds+nanos ``` Aucun transaction body, meta Yellowstone, `is_vote`, remote error ou payload provider n'est conservé dans ce signal. ## 29. Projection déterministe des filtres et de la route Les filter names Yellowstone sont consommés uniquement pour produire un fingerprint Worker-owned. Le calcul : ```text domain = ksp.raw_transaction_ingest.yellowstone.filters.v1\0 tri lexical des noms suppression des doublons nombre de noms uniques encodé u64 big-endian pour chaque nom : longueur u64 big-endian + bytes UTF-8 SHA-256 final ``` Le signal conserve séparément le nombre de matches reçu afin de ne pas confondre le fingerprint canonique de l'ensemble et la cardinalité de l'enveloppe reçue. La source valide aussi dès sa construction que : ```text cluster Yellowstone -> RawNetworkId représentable provider Yellowstone -> RawProvenanceCode représentable endpoint logical name Yellowstone -> RawProvenanceCode représentable ``` Une identité non représentable est rejetée par une condition Worker stable plutôt que tronquée. Cette fermeture prépare la provenance composite de `pre.004` sans modifier Store. ## 30. Canaris déterministes `pre.003` Les nouvelles preuves couvrent : ```text fixture Transaction : signature/slot/index/network/route/timestamp exacts fixture TransactionStatus : même forme sans payload ni remote error fingerprint golden exact fingerprint indépendant de l'ordre et des doublons de filter names Debug du signal sans filter name, signature brute, payload ou remote error provider/endpoint Yellowstone non représentables rejetés adapters réels typés YellowstoneTransactionUpdate / YellowstoneTransactionStatusUpdate présents TransactionStatus.error non consulté par l'adapter signal absent de la façade publique aucun open_standard_subscribe / next_update / get_transaction_observed aucun backend Store / reqwest / tonic / proto direct ajouté ``` La tranche ne modifie pas le graphe Cargo du Worker au-delà de celui déjà accepté en `pre.002`. ## 31. Validation locale et non-claims `pre.003` Exécuté dans l'environnement d'assemblage après les modifications Rust : ```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 ``` L'audit Markdown est rejoué après création du delta final. `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement d'assemblage ; aucun gate Cargo local n'est inventé. `pre.003` ne prétend pas avoir : ```text ouvert une session Yellowstone consommé une update depuis un réseau live appelé getTransaction créé une RawTransactionMaterial depuis le réseau assemblé la provenance composite Yellowstone + HTTP persisté une transaction issue de Yellowstone coalescé les hydrations traité Block / BlockMeta / Slot modifié la processing frontier branché from_slot / ReplayInfo exécuté un smoke live Worker ``` La tranche suivante reste `pre.004` : fermeture déterministe `signal -> get_transaction_observed -> Common RAW -> ingress` avec missing/mismatch et provenance composite, sans Block ni continuité/replay.