v0.3.14-pre.008-fix.001

This commit is contained in:
2026-09-12 09:44:36 +02:00
parent 505cc8c3f6
commit ec94001ab8
3 changed files with 277 additions and 45 deletions

View File

@@ -0,0 +1,172 @@
<!-- file: deltas/0.3.14/pre.008-fix.001.md -->
<!-- version: 1 -->
# Delta `0.3.14-pre.008-fix.001` — libération du guard avant `await`
## Base requise
```text
0.3.14-pre.008
workspace.package.version = 0.3.14-pre.8
deltas/0.3.14/pre.008.md présent
```
## Objectif
Corriger strictement la tranche `pre.008` après le gate opérateur, sans modifier sa responsabilité fonctionnelle :
```text
rendre le future du supervisor Send
ne jamais conserver un std::sync::MutexGuard à travers un await
préserver exactement la décision source-loss de pre.008
ne pas avancer la health policy prévue en pre.009
```
## Défaut observé
Le gate opérateur de `0.3.14-pre.008` a produit :
```text
cargo fmt --all : PASS
cargo fmt --all -- --check : PASS
audit Rust workspace rules : PASS
audit Markdown tables : PASS
cargo check --workspace : FAIL
cargo clippy --workspace --all-targets --all-features -- -D warnings : FAIL
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features : compilation impossible sur le même défaut Send
```
Le compilateur refuse le future de `supervise_live_source_tasks` :
```text
future cannot be sent between threads safely
std::sync::MutexGuard<RawTransactionIngestSourceInventory> is not Send
await dans drain_live_source_tasks alors que le guard peut encore être vivant
```
## Cause
`pre.008` appelait `inventory.supervisor_state()` dans un bloc qui contenait aussi la branche d'erreur avec `drain_live_source_tasks(...).await`.
Même si le guard n'est pas utilisé après `supervisor_state()`, sa portée lexicale englobait la branche asynchrone. Le compilateur devait donc considérer que le `std::sync::MutexGuard` pouvait traverser l'`await`, ce qui rendait le future non-`Send` et interdisait son utilisation dans `JoinSet::spawn` et `tokio::spawn`.
## Correction
La lecture synchronisée de l'inventaire est séparée en deux étapes :
```text
1. verrouiller inventory et calculer supervisor_state() dans un bloc strictement synchrone
2. sortir de ce bloc, donc détruire le MutexGuard
3. seulement ensuite traiter Result et éventuellement await drain_live_source_tasks(...)
```
Aucun `tokio::Mutex` n'est introduit. Aucun lock n'est conservé pendant une attente asynchrone.
La valeur, les erreurs et les décisions issues de `supervisor_state()` restent identiques.
## Fichiers ajoutés
```text
deltas/0.3.14/pre.008-fix.001.md
```
## Fichiers modifiés
```text
Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
```
## Fichiers supprimés
```text
aucun
```
## Version Cargo
Le fix modifie du code Rust ; conformément à `VER-ID-007` et `VER-ID-010` :
```text
header Cargo.toml : 576 -> 577
workspace.package.version : 0.3.14-pre.8 -> 0.3.14-pre.8.fix.1
```
Version de fichier :
```text
src/runtime_resources.rs : 35 -> 36
```
## Frontières préservées
```text
aucun changement de TargetCoverage
aucun changement de continuity frontier
aucun changement de coverage epoch
aucun changement de gap ledger
aucun changement de source-loss classification
aucun respawn Worker
aucun nouveau scheduler ou task
aucun changement Transport
aucune nouvelle requête HTTP
aucune nouvelle dépendance ou feature
aucun accès Config
aucun Job Backfill
aucun backend Store physique
aucune croissance de surface publique
```
## Validations exécutées
Dans le sandbox de préparation :
```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
inspection de la portée du MutexGuard autour de supervise_live_source_tasks
comparaison exacte pre.008 -> pre.008-fix.001
contrôle du contenu de l'archive delta
unzip -t de l'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 :
```text
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
```
## Décisions prises
```text
fix strict de pre.008
réduction de portée lexicale du std::sync::MutexGuard
aucun passage à tokio::Mutex
aucun allow/expect lint
aucune modification fonctionnelle de la réconciliation
pre.009 reste la première tranche autorisée à modifier la health policy multi-source
```
## Questions ouvertes
```text
aucune pour ce fix
```
## Gate opérateur après application
```bash
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
```