Files
2026-09-09 13:30:15 +02:00

7.3 KiB

Delta 0.3.12-pre.006 — source Yellowstone productive + coalescence bornée

Base requise

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 :

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

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 :

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 :

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 :

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 :

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

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

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

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 :

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

deltas/0.3.12/pre.006.md

Fichiers modifiés

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

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

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

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é