6.3 KiB
Delta 0.3.14-pre.002-fix.001 — correction frontières replay et dead-code continuity
Base requise
0.3.14-pre.002
workspace.package.version = 0.3.14-pre.2
deltas/0.3.14/pre.002.md présent
Objectif
Corriger strictement la tranche pre.002 après le gate opérateur, sans étendre son périmètre fonctionnel :
supprimer la mutation Worker du cursor Yellowstone from_slot
préserver la propriété Transport-owned replay
supprimer le dead_code de RawTransactionIngestGapRange::new sans suppression de validation ni lint bypass
conserver pre.002 sans repair I/O
Défauts observés
Le gate opérateur sur 0.3.14-pre.2 a produit :
cargo check --workspace : PASS avec 1 warning dead_code
cargo clippy --workspace --all-targets --all-features -- -D warnings : FAIL
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features : FAIL
Clippy :
associated function `new` is never used
crates/ksp-worker-raw-transaction-ingest-lib/src/continuity.rs:102
-D dead-code implied by -D warnings
Test d'intégration :
v0_3_12_pre_008_worker_observes_transport_reconnect_replay_and_faults_only_on_proven_retention_gap : FAIL
Worker took ownership of replay/repair responsibility: set_from_slot(
Les 114 unit tests du crate passaient avant l'échec du test de frontière.
Cause
pre.002 construisait le fingerprint de coverage Yellowstone en clonant la requête puis en supprimant :
commitment
from_slot
ping
La suppression de from_slot appelait YellowstoneSubscribeRequest::set_from_slot(None) depuis runtime_resources.rs. Même sans I/O, cette mutation viole la frontière durable établie en 0.3.12-pre.008 : le Worker observe le replay Yellowstone mais ne possède ni ne modifie son cursor ; la responsabilité from_slot reste dans Transport.
Le constructeur privé RawTransactionIngestGapRange::new était par ailleurs appelé uniquement depuis les unit tests de pre.002, donc considéré mort dans la compilation normale de la bibliothèque.
Correction
Yellowstone coverage fingerprint
Le Worker continue de neutraliser uniquement les éléments communs qu'il peut traiter sans absorber la responsabilité replay :
commitment -> retiré du fingerprint opaque, car porté séparément par TargetCoverage
ping -> retiré du fingerprint opaque, car non métier
from_slot -> conservé dans l'identité opaque Transport
Le Worker n'appelle plus set_from_slot.
Conserver from_slot dans l'identité rend la comparaison de deux scopes Yellowstone volontairement plus conservative : deux requêtes identiques métier mais portant des cursors replay différents peuvent rester distinctes. Cette différence ne peut pas broaden la coverage ni produire une fausse preuve de complétude. Une éventuelle identité Transport spécifiquement dédiée au scope métier relève d'une tranche Transport ultérieure, pas de ce fix.
Cette correction remplace donc la décision trop agressive de pre.002 qui annonçait l'exclusion du cursor replay du fingerprint Worker.
Gap range validation
RawTransactionIngestGapLedger::validate_invariants() réutilise maintenant RawTransactionIngestGapRange::new(start_slot, end_slot) pour revalider chaque plage retenue.
Cela :
rend le constructeur vivant dans le code de production
conserve le rejet reversed
conserve le contrôle checked du span inclusif
ajoute au recheck du ledger la borne MAX_RAW_TRANSACTION_INGEST_REPAIR_RANGE_SLOTS
n'introduit aucun allow/expect dead_code
Fichiers ajoutés
deltas/0.3.14/pre.002-fix.001.md
Fichiers modifiés
Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/src/continuity.rs
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
Fichiers supprimés
aucun
Version Cargo
Le fix modifie du code Rust ; conformément à VER-ID-007 et VER-ID-010 :
header Cargo.toml : 567 -> 568
workspace.package.version : 0.3.14-pre.2 -> 0.3.14-pre.2.fix.1
Versions de fichiers :
continuity.rs : 1 -> 2
runtime_resources.rs : 27 -> 28
Frontières préservées
aucun repair I/O
aucune nouvelle tâche
aucune nouvelle socket
aucun retry Worker
aucune nouvelle dépendance
aucune nouvelle feature
aucun accès Config depuis Worker
aucun accès Job Backfill depuis Worker
aucun backend Store physique depuis Worker
aucune mutation Worker de Yellowstone from_slot
Validations exécutées
Dans le sandbox de préparation :
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.14
scan statique de la frontière set_from_slot dans runtime_resources.rs
scan du constructeur RawTransactionIngestGapRange::new dans le chemin production
comparaison exacte pre.002 -> pre.002-fix.001
contrôle contenu archive delta
unzip -t archive delta
Validations non exécutées
Le sandbox de préparation ne fournit pas le toolchain Cargo/Rust. Les gates suivants restent à exécuter côté opérateur :
cargo fmt --all
cargo fmt --all -- --check
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
Le test de frontière existant qui a détecté la régression n'est ni modifié ni assoupli.
Décisions prises
fix strict de pre.002, sans nouvelle responsabilité fonctionnelle
Transport reste propriétaire de from_slot/replay
le Worker privilégie une identité Yellowstone conservative plutôt qu'une normalisation interdite
le ledger revalide ses ranges via le constructeur canonique
aucun lint bypass n'est accepté pour dead_code
Questions ouvertes
aucune pour ce fix
Gate opérateur après application
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
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features