220 lines
7.3 KiB
Markdown
220 lines
7.3 KiB
Markdown
<!-- file: deltas/0.3.12/pre.006.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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é
|
|
```
|