4.4 KiB
Delta 0.3.13-pre.011 — races/shutdown hardening
Objet
Fermer les races stop/fault et l'ownership des tâches source/hydration/persistence avant la tranche de completeness/security cross-layer, sans modifier Transport, le graphe de dépendances ou les politiques de convergence/fairness déjà acquises.
Shutdown et ownership
Le supervisor conserve l'ordre terminal explicite : signal de stop source, passage Worker à Stopping, drain borné, abort+join si la deadline expire, puis publication du terminal. L'abort du wrapper multi-source détruit son JoinSet privé et annule donc aussi les tâches source imbriquées avant retour.
Une faute source déjà observée n'est pas masquée par un stop concurrent. Le drain_timeout reste prioritaire lorsqu'une récupération bornée dépasse réellement sa deadline. Une persistence encore bloquée à cette échéance est abortée et jointe ; elle ne peut pas publier de succès tardif après le snapshot terminal.
Hydration partagée
RawTransactionIngestGlobalHydrationRegistry::publish_and_remove notifie désormais les followers sous le mutex de registry avant de retirer la clé. Une nouvelle génération de leader ne peut donc pas s'intercaler entre le retrait de la clé et la notification des followers existants.
Le leader guard conserve son cleanup fail-closed : si un leader est aborté avant publication normale, les followers reçoivent une faute source sûre et la clé redevient ensuite disponible.
Inventaire et compteurs
L'agrégation multi-source remplace les additions saturantes par checked_add pour hydration_pending, source_reconnect_total, source_replay_attempt_total et source_continuity_gap_total. Un overflow devient worker_raw_transaction_ingest.counter_exhausted.
Une mise à jour d'inventaire avec index absent, source_key incohérente ou projection absente échoue explicitement par runtime_invalid au lieu d'être ignorée. Lorsqu'une source remonte counter_exhausted, le supervisor préserve ce code terminal et ne le remappe pas en source_failed.
Preuves ajoutées
Les tests couvrent l'identité/index d'inventaire invalides, les overflows d'agrégats, l'abort d'un leader hydration, l'abort du supervisor externe et de ses enfants imbriqués, la race stop/source fault, la conservation de counter_exhausted, le drain timeout sans completion tardive, l'ordre terminal et l'atomicité notification-avant-retrait.
Les canaris externes verrouillent l'absence de queue non bornée, backend Store direct, client Transport secondaire ou nouvelle surface publique d'identité source.
Frontière
Aucun changement de Transport, Store API, dépendance, feature, convergence, quotas/fairness, snapshot public ou politique de failover. La completeness/security exhaustive reste pre.012; le gate technique/live complet et les graphes restent pre.013.
Gate reçu avant cette tranche
Le gate opérateur 0.3.13-pre.010 est vert pour toutes les commandes exécutées : fmt, audits, Markdown 340/848, workspace check, Clippy strict, puis Worker 100 unit + 4 cross-layer + 17 dependency-boundary + 24 hardening + 18 public-api + 4 release-completeness et 0 doc-test.
Le Transport n'était pas modifié par pre.010 et n'a pas été rejoué. Aucun cargo tree n'était requis ni exécuté.
Validation locale d'assemblage
Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Aucun résultat Cargo post-modification n'est déclaré PASS localement. Les audits statiques et contrôles de packaging effectivement exécutés sont les seules preuves locales consignées pour cette livraison.
Les audits statiques finaux d'assemblage sont clean : règles Rust générales, export completeness 0, règles KSP, Markdown 340/849, et inventaire normatif 489/489 sans doublon.
Gate opérateur avant pre.012
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
Aucun cargo tree n'est requis ; aucune dépendance ni feature n'a changé. Le Transport n'est pas modifié par cette tranche de hardening shutdown/races.