# 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 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 ```