# Delta `0.3.12-pre.006` — source Yellowstone productive + coalescence bornée ## Base requise ```text 0.3.12-pre.005-fix.001 workspace.package.version = 0.3.12-pre.5.fix.1 ``` Le gate opérateur communiqué pour cette base est entièrement vert : audits Rust/Markdown, `cargo check --workspace`, Clippy strict et 56 tests Worker avec toutes les suites d'intégration associées. ## Objectif Ouvrir la première source Yellowstone réellement productive en réutilisant exclusivement les moteurs déjà qualifiés : ```text Transport Yellowstone session adapters Transaction/Status/Block hydration HTTP getTransaction observed coalescence bornée RawTransactionIngress existant SourceTasks JoinSet existant supervisor/admission/persistence existants ``` La tranche ne crée ni processing frontier, ni politique Worker de reconnect/from_slot/ReplayInfo, ni repair historique. ## Version ```text workspace.package.version = 0.3.12-pre.6 ``` ## Source task productive `RawTransactionIngestWorker::start_with_runtime_resources` consomme maintenant les ressources validées et ajoute exactement un child source au `JoinSet` privé existant. Le child appelle uniquement la façade Transport : ```text YellowstoneGrpcChannel::open_standard_subscribe SolanaYellowstoneGrpcSubscribeSession::next_update SolanaYellowstoneGrpcSubscribeSession::close ``` Aucun client `tonic`, `reqwest`, proto Yellowstone ou SDK provider n'est instancié par le Worker. L'ouverture est stop-preemptible. Après stop/fault, les hydrations privées sont abort/join et la session est fermée via Transport. Toute erreur distante est réduite à un `ErrorCode` KSP sûr avant de remonter au supervisor, qui conserve son mapping stable `source_failed`. ## Activation des adapters Les adapters `Transaction`, `TransactionStatus`, `Block`, `BlockMeta` et `Slot` sortent de `#[cfg(test)]` car ils possèdent désormais un consumer productif réel, conformément à `RUST-API-008`. Le routage est : ```text Transaction/TransactionStatus/Block -> candidat hydration BlockMeta/Slot -> continuity-only, aucune admission RAW Account/Entry/Ping/Pong -> ignorés par le vertical RAW ``` Le wrapper fixture `hydrate_yellowstone_signal` reste test-only ; le chemin productif sépare fetch HTTP et finalisation afin de permettre le fan-out coalescé. ## Coalescence La clé est exactement `(network, signature, commitment)`. Un `RawTransactionIngestHydrationCoordinator` privé possède : ```text BTreeMap pending JoinSet hydration max_in_flight = settings.persistence_concurrency() max_pending_signals = MAX_RAW_TRANSACTION_INGEST_ADMISSION_QUEUE_CAPACITY ``` Des signaux Transaction/Status/Block identiques partagent donc un seul `getTransaction` in-flight. À la complétion, la réponse HTTP observée est finalisée séparément pour chaque signal afin de conserver family/filter/observed_at et donc des provenances distinctes. Aucun cache terminé n'est conservé. La saturation applique de la backpressure au stream et ne provoque aucun drop silencieux. ## Hydration/admission Le fetch reste strictement : ```text get_transaction_observed base64 confirmed | finalized maxSupportedTransactionVersion = 0 ``` La finalisation conserve tous les guards `pre.004` : network, source route, slot, transaction index, signature wire et provenance composite depuis le winner HTTP réel. `null` ne produit aucun ingress. Les ingresses disponibles passent uniquement par le sender central créé par `RawTransactionAdmission::new`; la persistence Normal reste inchangée. ## Continuité `BlockMeta` et `Slot` sont réellement reçus/projetés dans le source task, mais restent continuity-only. Aucune frontier n'est maintenue et aucun gap n'est interprété dans cette tranche. Le snapshot reconnect/replay de Transport n'est pas encore consommé par le Worker ; cette responsabilité reste `pre.008`. ## API / dépendances ```text aucun nouvel export public aucun nouveau module aucune nouvelle dépendance Cargo Worker -> Transport reste l'unique edge live Worker -> Config/Backfill/Store backend reste interdit ``` ## Canaris ajoutés/ajustés ```text source runtime réellement supervisée par SourceTasks open_standard_subscribe/next_update/close présents coalescence key network/signature/commitment Transaction + Status identiques -> une pending key / une hydration task bounded pending/in-flight stop preemptible abort/join hydration aucun getBlock/get_block_observed aucun remote error/dead_error/secret public API et module inventory inchangés anciens canaris pre.003-pre.005 ajustés de offline -> private/Transport-only ``` ## Décisions prises ```text coalescence productive dans le Worker, retry réseau reste Transport concurrence hydration bornée par le budget de concurrence runtime déjà validé pending total borné par la borne maximale d'admission publiée fan-out après fetch partagé, avant admission source close via Transport uniquement frontier/reconnect/replay non anticipés ``` ## Questions ouvertes Aucune question ouverte ne bloque `pre.006`. Restent réservés : ```text processing frontier run-local : pre.007 reconnect/from_slot/ReplayInfo : pre.008 races/retry/backpressure final : pre.009 cross-layer completeness/security : pre.010 live opt-in : pre.011 ``` ## Fichiers ajoutés ```text deltas/0.3.12/pre.006.md ``` ## Fichiers modifiés ```text Cargo.toml crates/ksp-worker-raw-transaction-ingest-lib/src/lib.rs crates/ksp-worker-raw-transaction-ingest-lib/src/runtime.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/release_completeness.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs docs/validation/029-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY.md ``` ## Fichiers supprimés Aucun. ## Validations exécutées dans l'environnement d'assemblage ```text 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 ``` Des scanners statiques ciblés vérifient également le confinement Transport, l'absence de `get_block_observed`, l'absence de dépendances directes interdites, la clé de coalescence et l'inventaire public/module inchangé. ## Validations non exécutées dans l'environnement d'assemblage `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement d'assemblage. Aucun gate Cargo local n'est revendiqué. ## Gate opérateur requis ```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 ``` ## Non-claims ```text pas de processing frontier pas d'interprétation reconnect/replay Worker pas de from_slot Worker pas de ReplayInfo Worker pas de détection de gap de rétention pas de repair/backfill implicite pas de getBlock pas de nouveau backend/Config edge pas de smoke live revendiqué ```