v0.3.11-pre.009

This commit is contained in:
2026-09-08 16:22:40 +02:00
parent 63e1a866a3
commit 822e8fcd86
14 changed files with 747 additions and 99 deletions

135
deltas/0.3.11/pre.009.md Normal file
View File

@@ -0,0 +1,135 @@
<!-- file: deltas/0.3.11/pre.009.md -->
<!-- version: 1 -->
# Delta `0.3.11-pre.009` — hardening shutdown, backpressure et races fault/stop
## Base requise
```text
0.3.11-pre.008-fix.001
workspace.package.version = 0.3.11-pre.8.fix.1
```
Le gate opérateur du 8 septembre 2026 est vert sur `fmt`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict, 38 tests de la crate Worker et les doc-tests. Aucune dépendance/feature n'ayant changé, aucun `cargo tree` intermédiaire n'était requis.
## Objectif
Fermer uniquement le hardening `pre.009` du plan `032` : faults source sûrs, saturation observable, ordering stop/fault déterministe, deadline de drain, abort+join au timeout et absence de tâches orphelines. Aucune source live n'est introduite.
## Version
```text
identifiant de livraison : 0.3.11-pre.009
workspace.package.version : 0.3.11-pre.9
```
## Faults source
Les tâches source privées retournent `ksp_core_lib::Result<()>`. Une erreur source ou un `JoinError` devient :
```text
worker_raw_transaction_ingest.source_failed
```
Le détail distant/provider n'est pas propagé et `source_failure_total` est incrémenté via checked-add.
## Shutdown borné
Le drain complet est enveloppé par `shutdown_drain_timeout`. En cas de timeout :
```text
admission.close()
persistence.abort_all()
sources.abort_all()
join complet des persistences
join complet des sources
Faulted(worker_raw_transaction_ingest.drain_timeout)
```
Le terminal n'est donc jamais publié avant la récolte de toutes les tâches possédées.
## Ordering stop/fault
Le stop reste prioritaire dans le `select!`, mais un Store fault découvert pendant le drain n'est pas masqué. Un fault terminal déjà décidé n'est pas remplacé par un stop tardif. Le timeout de drain prévaut lorsqu'il empêche la clôture coopérative.
## Backpressure source-neutral
L'admission conserve une unique queue `mpsc` bornée. Le dequeue constate si cette queue était pleine à sa capacité configurée et incrémente `backpressure_wait_total`. Aucun drop, aucune queue secondaire et aucun `unbounded_channel` ne sont ajoutés.
## Tests ajoutés ou étendus
```text
source failure terminal + compteur
late stop ne remplace pas source_failed
stop puis Store fault pendant drain
saturation capacity=1 sans drop
backpressure_wait_total observable
drain timeout + abort/join des sources et persistences
aucune tâche active après terminal timeout
projection snapshot source/backpressure
error codes source_failed/drain_timeout publics
dependency firewall inchangé
```
## Fichiers ajoutés
```text
deltas/0.3.11/pre.009.md
```
## Fichiers modifiés
```text
Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/src/admission.rs
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/src/snapshot.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/admission.rs
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/snapshot.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.
## Dépendances
Aucune dépendance ni feature n'est ajoutée, supprimée ou modifiée. Le `Cargo.toml` de la crate Worker reste identique à la base.
## Validations exécutées dans l'environnement d'assemblage
```text
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
scan statique des frontières runtime/dependencies
```
L'environnement d'assemblage ne fournit ni `cargo`, ni `rustc`, ni `rustfmt`. Aucun gate Cargo de `pre.009` n'est déclaré PASS localement.
## Gate opérateur demandé
Aucune dépendance ni feature n'ayant changé, aucun `cargo tree` intermédiaire n'est 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
```
## Décision
`pre.010` reste bloquée jusqu'à validation opérateur verte du hardening shutdown/backpressure/fault races.
## Questions ouvertes
Aucune nouvelle question architecturale. Les sources live restent explicitement hors scope de `0.3.11`.