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.