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é