# 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 ```