Files
khadhroony-solana-project/deltas/0.3.11/pre.007.md
2026-09-08 11:32:41 +02:00

5.3 KiB

Delta 0.3.11-pre.007 — persistence Store bornée et outcomes déterministes

Base requise

0.3.11-pre.006-fix.001
workspace.package.version = 0.3.11-pre.6.fix.1

Le gate opérateur du 8 septembre 2026 est vert sur fmt, audits Rust/Markdown, cargo check --workspace, Clippy strict, les 22 tests de la crate Worker et les doc-tests. Aucun cargo tree n'a été rejoué après le fix, celui-ci n'ayant modifié aucune dépendance ni feature.

Objectif

Matérialiser uniquement la responsabilité pre.007 du plan 032 : persistence atomique via la façade Store, mode Normal, concurrence bornée, classification entity/observation, idempotence/purge et terminaux dédiés content conflict/Store failure. Aucun snapshot concret et aucune source réseau.

Version

identifiant de livraison : 0.3.11-pre.007
workspace.package.version : 0.3.11-pre.7

Port Store privé

La crate ajoute un port RawTransactionIngestPersistencePort crate-private, implémenté par ksp_store_lib::Store et utilisé exclusivement avec :

RawTransactionWrite::persist_raw_transaction_acquisition(..., RawTransactionAcquisitionMode::Normal)

Aucun backend Store concret n'entre dans le graphe ou dans le code Worker.

Outcomes

Classification exacte :

Inserted       + Inserted       -> Inserted / Inserted
AlreadyPresent + Inserted       -> AlreadyPresent / Inserted
AlreadyPresent + AlreadyPresent -> AlreadyPresent / AlreadyPresent
SkippedPurged  + NotRecorded    -> SkippedPurged / NotRecorded

Rehydrated et les couples impossibles deviennent runtime_invalid.

Faults Store

Deux codes publics deviennent actifs :

worker_raw_transaction_ingest.content_conflict
worker_raw_transaction_ingest.store_failed

Le conflit Store canonique est projeté sur content_conflict. Toute autre erreur Store est réduite à store_failed en conservant uniquement son domain/code sûr, jamais son texte arbitraire.

Concurrence bornée

Le supervisor possède un JoinSet privé de persistences et n'admet une nouvelle acquisition que lorsque :

in_flight_persistence < persistence_concurrency

Aucune queue secondaire ou persistence non bornée n'est introduite. Le harness bloque quatre writes avec une limite de deux et exige max_active == 2.

Drain

Sur stop ou fault : nouvelles admissions fermées, acquisitions déjà admises drainées/persistées, persistences rejointes, sources rejointes, puis terminal. Le timeout/abort et la priorité complète des races terminales restent dans pre.009.

Tests ajoutés ou étendus

mode Normal exact
new/idempotent/purged + observation distincte
Rehydrated/couples impossibles rejetés
network mismatch avant write
content conflict redacted
Store failure redacted
persistence concurrency réellement bornée
terminaux runtime content_conflict/store_failed
ErrorCode publics stables
dependency boundary persistence privée / backend direct interdit

Fichiers ajoutés

crates/ksp-worker-raw-transaction-ingest-lib/src/persistence.rs
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/persistence.rs
deltas/0.3.11/pre.007.md

Fichiers modifiés

Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/src/error.rs
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/tests/dependency_boundary.rs
crates/ksp-worker-raw-transaction-ingest-lib/tests/public_api.rs
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs
docs/plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md
docs/validation/028-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION.md

Fichiers supprimés

Aucun.

Hors scope conservé

snapshots concrets / compteurs publics
source live / Transport
Config
backend Store direct
ForceRehydrate
source_failed / counter_exhausted
drain timeout / abort forcé
retry / reconnect / gap repair

Validations exécutées dans l'environnement d'assemblage

General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean

scan production : aucun unwrap, expect, panic, unbounded_channel
scan scope : aucun backend Store direct, aucun Transport, aucun snapshot concret

L'environnement d'assemblage ne fournit ni cargo, ni rustc, ni rustfmt. Aucun gate Cargo de pre.007 n'est déclaré PASS localement.

Gate opérateur demandé

Aucune dépendance ni feature n'a changé dans cette tranche ; aucun cargo tree intermédiaire n'est donc 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

Décision

pre.008 reste bloquée jusqu'à validation opérateur verte de la persistence Normal, des outcomes/idempotences, de la concurrence bornée et des terminaux Store/conflict.

Questions ouvertes

Aucune nouvelle question architecturale. Les snapshots/counters restent dans pre.008; le hardening fault/shutdown reste dans pre.009.