Files
khadhroony-solana-project/deltas/0.3.15/pre.014.md
2026-09-17 13:02:10 +02:00

112 lines
4.1 KiB
Markdown

<!-- file: deltas/0.3.15/pre.014.md -->
<!-- version: 1 -->
# Delta v0.3.15-pre.014 — convergence inter-provider diagnostiquable
## Base
```text
ksp-general-0.3.15-pre.013.zip
SHA-256: 4d463230f45a55f68994443f138afd246b6ec34bea21357c2cedfe5d8fe1c5c6
```
Le gate opérateur de `pre.013` est propre et le live ne reproduit plus le `grpc_backpressure_overflow` fermé par cette tranche. Yellowstone devient néanmoins terminal `content_conflict` une fois pendant l'exécution parallèle avec HTTP Block Polling.
Le diagnostic de `pre.012-fix.004` prouve que le conflit ne porte ni sur le slot, ni sur `block_time`, ni sur les octets/instructions de transaction, ni sur la version, ni sur `transactionIndex`. Seul `meta.logMessages` diffère. La version déjà canonique provient de `solana_mainnet_public`; la version entrante est hydratée par `publicnode_solana_mainnet_rpc` après trigger Yellowstone, toutes deux en `confirmed`.
## Diagnostic ajouté
Chaque `getBlock` réussi des voies Yellowstone Block Hydration et HTTP Block Polling émet désormais un diagnostic DEBUG sûr :
```text
domain=raw_transaction_ingest.block_identity
source_kind
network
slot
provider
endpoint_id
commitment
parent_slot
block_height
block_identity_fingerprint
```
`block_identity_fingerprint` est un SHA-256 domain-separated calculé à partir de `blockhash`, `previousBlockhash`, `parentSlot` et `blockHeight`. Les blockhash bruts ne sont jamais journalisés.
Lors d'un `content_conflict`, Store complète son masque existant avec :
```text
stored_slot
incoming_slot
log_messages_diagnostic_available
stored_log_messages_state
incoming_log_messages_state
stored_log_messages_count
incoming_log_messages_count
log_messages_first_mismatch_index
stored_log_messages_first_kind
incoming_log_messages_first_kind
stored_log_messages_first_length
incoming_log_messages_first_length
stored_log_messages_prefix_of_incoming
incoming_log_messages_prefix_of_stored
stored_log_messages_has_truncation_marker
incoming_log_messages_has_truncation_marker
```
Les types de ligne sont réduits à une taxonomie statique ; aucun texte arbitraire de log n'est recopié.
## Frontières
Aucun changement de :
```text
RawTransaction canonical identity
égalité / content_hash
politique fail-closed content_conflict
Store schema
Transport gRPC / HTTP
Config
Desk
Backfill
public Worker API
public Store API
```
`logMessages` reste partie intégrante du payload canonique tant que la cause de la divergence n'est pas prouvée.
## Canaris
```text
v0_3_15_pre_014_log_messages_conflict_diagnostic_distinguishes_prefix_truncation_and_line_kind_without_text
v0_3_15_pre_014_log_messages_conflict_diagnostic_detects_strict_prefix_without_exposing_line_material
v0_3_15_pre_014_content_conflict_diagnostic_exposes_only_block_slot_and_bounded_log_shape
v0_3_15_pre_014_cross_provider_block_identity_diagnostic_is_safe_and_covers_both_get_block_routes
v0_3_15_pre_014_cross_provider_convergence_diagnostic_adds_no_public_worker_surface
```
## Version
```text
workspace.package.version : 0.3.15-pre.14
root Cargo header counter : 628
```
## Validation attendue
```text
cargo fmt --all
cargo fmt --all -- --check
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/0.3.15
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-store-postgres-lib --all-targets --all-features
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features
cargo test --workspace --all-targets --all-features
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev)
```
Live : Yellowstone + HTTP Block Polling en `confirmed` jusqu'à reproduction d'un conflit. Au slot annoncé par Store, comparer les deux `block_identity_fingerprint`, puis lire la forme bornée de `logMessages`. Si nécessaire, répéter ensuite la même expérience en `finalized` comme diagnostic de finalité, sans changer le défaut produit par défaut.