# Delta `0.3.12-pre.005` — Block transactionnel + BlockMeta/Slot continuity-only ## Base requise ```text 0.3.12-pre.004-fix.001 workspace.package.version = 0.3.12-pre.4.fix.1 ``` Le gate opérateur communiqué pour cette base est entièrement vert : audits Rust/Markdown, `cargo check --workspace`, Clippy strict, 17 tests Common RAW et 52 tests Worker avec toutes les suites d'intégration associées. ## Objectif Fermer les adapters privés Yellowstone restants nécessaires avant le source task productif : ```text Block -> N signaux transactionnels d'hydration dans l'ordre source BlockMeta -> signal continuity-only Slot -> signal continuity-only ``` La tranche ne branche ni session live, ni reconnect policy Worker, ni `from_slot`, ni `ReplayInfo`, ni processing frontier. ## Version ```text workspace.package.version = 0.3.12-pre.5 ``` ## Block `YellowstoneBlockUpdate` implémente un adapter privé borné qui lit uniquement les identités nécessaires au P0 : ```text filters created_at slot transactions[].signature transactions[].index ``` Chaque transaction incluse produit un `RawTransactionIngestSourceSignal` avec `family = Block`. L'ordre du `Vec` de sortie suit strictement l'ordre `transactions[]` du DTO Transport. Aucun body/meta Yellowstone n'entre dans Common RAW directement. La future hydration réutilise `getTransaction` et la provenance composite `yellowstone_http`; la méthode d'acquisition devient `block_get_transaction`, distincte de `transaction_get_transaction` et `status_get_transaction`. `get_block_observed` reste hors P0 et n'est pas introduit. ## BlockMeta et Slot Les deux DTOs convergent vers un signal Worker privé séparé, `RawTransactionIngestContinuitySignal`. Sa forme est strictement bornée à : ```text created_at family matched_filter_count matched_filter_fingerprint matched_filter_id network parent_slot route slot status ``` `BlockMeta` fournit slot/parent et aucun status. Ses blockhash, rewards, block_time, block_height et compteurs ne sont pas utilisés comme preuve de complétude transactionnelle dans cette tranche. `Slot` fournit slot/parent/status. Les sept états Yellowstone sont mappés vers un enum Worker privé source-neutral. Le diagnostic `dead_error` n'est jamais lu. Aucun signal continuity-only ne peut produire un `RawTransactionIngress`. ## `RUST-API-008` Le consumer productif n'arrive qu'en `pre.006`. Les adapters et projecteurs privés `Block`/`BlockMeta`/`Slot` restent donc sous `#[cfg(test)]`, comme la chaîne Transaction/Status/hydration déjà qualifiée. Aucun `#[allow(dead_code)]`, `#[expect(dead_code)]` ou export public artificiel n'est ajouté. ## Canaris ```text Block -> 3 signatures exactes dans l'ordre source, avec indexes non triés conservés Block -> slot/network/filter context commun Block -> méthode de provenance block_get_transaction BlockMeta -> continuity-only slot/parent sans status Slot -> continuity-only slot/parent/status mapping exact Processed/Confirmed/Finalized/FirstShredReceived/Completed/CreatedBank/Dead Debug continuity sans filter names ni RAW material scanner continuity sans signature/transaction/meta/payload/body/error/dead_error impls réels YellowstoneBlockUpdate/YellowstoneBlockMetaUpdate/YellowstoneSlotUpdate présents aucun open_standard_subscribe/next_update/get_block_observed aucune dépendance directe Config/Backfill/backend/reqwest/tonic/proto ``` ## Décisions prises ```text Block est une troisième famille de discovery/hydration, pas un second pipeline RAW BlockMeta et Slot sont continuity-only les compteurs BlockMeta ne prouvent jamais la complétude dead_error ne traverse jamais la frontière Worker getBlock reste hors P0 reconnect/from_slot/ReplayInfo restent pre.008 activation source productive et coalescence restent pre.006 ``` ## Questions ouvertes Aucune question ouverte ne bloque `pre.005`. Restent réservés : ```text source task productive + coalescence : pre.006 processing frontier run-local : pre.007 reconnect/from_slot/ReplayInfo : pre.008 races/retry/backpressure : pre.009 ``` ## Fichiers ajoutés ```text deltas/0.3.12/pre.005.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_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 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 ``` Les scanners source ciblés vérifient également l'absence d'I/O live prématurée, de `get_block_observed`, de `dead_error` dans l'adapter Slot et de dépendances d'implémentation directes interdites. ## Validations non exécutées dans l'environnement d'assemblage `cargo`, `rustc` et `rustfmt` ne sont pas installés dans l'environnement d'assemblage. Aucun résultat Cargo local n'est déclaré PASS. 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 source Yellowstone productive pas de stream ouvert pas de getBlock pas de RAW direct depuis Block pas de RAW depuis BlockMeta/Slot pas de coalescence productive pas de frontier pas de reconnect/replay/repair Worker pas de smoke live Worker ```