v0.3.13-pre.011

This commit is contained in:
2026-09-10 21:27:18 +02:00
parent f636169783
commit 06319655b0
15 changed files with 778 additions and 69 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# Plan v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source RawTransaction
@@ -1479,3 +1479,80 @@ cargo test -p ksp-worker-raw-transaction-ingest-lib
```
Aucun `cargo tree` n'est requis : `pre.010` ne modifie ni dépendance ni feature. Le Transport n'est pas modifié par cette tranche snapshot/health.
## 80. Gate opérateur pre.010 reçu
Le 10 septembre 2026, le gate intermédiaire communiqué pour `0.3.13-pre.010` est entièrement vert pour les commandes exécutées : fmt, audits Rust, 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é.
## 81. Races et shutdown pre.011
La fermeture `pre.011` conserve l'ownership déjà établi mais rend les transitions concurrentes explicitement fail-closed :
```text
stop externe -> signal stop source avant passage Worker à Stopping
source fault déjà observée -> conservée face au stop concurrent
shutdown_drain_timeout expiré -> drain_timeout terminal prioritaire
abort du wrapper multi-source -> drop du JoinSet interne -> abort des enfants imbriqués
abort persistence -> join avant publication terminale
leader hydration abandonné -> followers notifiés Failed + clé réouvrable
publication hydration -> notification followers avant retrait de la clé sous le même mutex
```
Le Worker ne publie donc pas son terminal avant la récupération des tâches qu'il possède. Une tâche persistence libérée après un `drain_timeout` ne peut pas réapparaître comme succès tardif ni modifier le dernier snapshot terminal.
## 82. Compteurs et inventaire fail-closed pre.011
L'inventaire multi-source n'utilise plus d'addition saturante pour agréger :
```text
hydration_pending
source_reconnect_total
source_replay_attempt_total
source_continuity_gap_total
```
Chaque agrégat utilise `checked_add`; un overflow devient `worker_raw_transaction_ingest.counter_exhausted`. Une publication d'inventaire portant un index absent, une `source_key` incohérente ou une projection absente est rejetée par `runtime_invalid` au lieu d'être ignorée.
Si une source remonte précisément `counter_exhausted`, le supervisor conserve ce code terminal au lieu de le rabattre sur le code générique `source_failed`.
## 83. Preuves déterministes pre.011
Les preuves ajoutées couvrent au minimum :
```text
mauvaise source_key -> runtime_invalid fail-closed
index inventaire absent -> runtime_invalid fail-closed
overflow hydration_pending agrégé -> counter_exhausted
overflow reconnect agrégé -> counter_exhausted
abort leader hydration -> follower Failed + clé libérée
abort supervisor externe -> enfants source imbriqués abortés
stop concurrent + source fault prête -> fault conservée + sibling rejoint
counter_exhausted source -> terminal counter_exhausted non remappé
shutdown drain timeout -> aucune persistence tardive après terminal
ordre stop -> Stopping -> drain -> terminal verrouillé par canari
publication hydration atomique notification-avant-remove verrouillée par canari
```
Les canaris externes vérifient que ce durcissement reste privé au Worker, réutilise uniquement les façades existantes et n'ajoute aucune identité source/provider à l'API publique.
## 84. Frontière de tranche pre.011
`pre.011` ne change ni la politique de convergence, ni les quotas/fairness `pre.009`, ni la projection health `pre.010`. Il n'ajoute pas de failover, de scheduler, de retry Worker supplémentaire, de backend Store direct ou de client Transport secondaire.
La completeness/security exhaustive cross-layer appartient à `pre.012`; le gate technique complet, les graphes et les smokes accessibles appartiennent à `pre.013`.
## 85. Gate opérateur requis avant pre.012
```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
```
Aucun `cargo tree` n'est requis : `pre.011` ne modifie ni dépendance ni feature. Le Transport n'est pas modifié par cette tranche de hardening shutdown/races.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# Validation v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source
@@ -1485,3 +1485,98 @@ cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-raw-transaction-ingest-lib
```
## 82. Gate complet pre.010 reçu
Preuve opérateur du 10 septembre 2026 :
```text
fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 848 files
cargo check --workspace : PASS
clippy strict : PASS
Worker : 100 unit + 4 cross-layer + 17 dependency-boundary + 24 hardening + 18 public-api + 4 release-completeness, 0 échec
Worker doc-tests : 0
```
Le Transport n'était pas modifié par `pre.010` et n'a pas été rejoué. Aucun `cargo tree` n'est revendiqué.
## 83. Durcissement races/shutdown pre.011 matérialisé
La tranche ferme les transitions concurrentes suivantes sans changer les frontières de couche :
```text
stop vs source fault
abort supervisor vs enfants source imbriqués
abort leader hydration vs followers
publication hydration vs arrivée d'un nouveau leader
shutdown deadline vs persistence bloquée
counter exhaustion vs remapping générique source_failed
publication inventaire vs identité/index incohérent
```
`publish_and_remove` notifie les followers sous le mutex de registry avant de retirer la clé. Le retrait rend ensuite seulement la clé disponible à une nouvelle génération de leader. Le `Drop` du leader guard reste le chemin fail-closed pour un leader aborté avant publication normale.
## 84. Agrégation et terminalité vérifiées pre.011
L'inventaire agrégé utilise désormais `checked_add` pour `hydration_pending`, `source_reconnect_total`, `source_replay_attempt_total` et `source_continuity_gap_total`. Aucun clamp par `saturating_add` n'est admis dans cette agrégation.
Un overflow devient `worker_raw_transaction_ingest.counter_exhausted`. Ce code est préservé par le supervisor lorsqu'il provient d'une source, au lieu d'être converti en `worker_raw_transaction_ingest.source_failed`.
Les mises à jour d'inventaire invalides échouent explicitement sur des codes internes stables :
```text
source.inventory_entry_missing
source.inventory_key_mismatch
source.inventory_projection_missing
```
Aucune valeur source/provider n'est recopiée dans l'erreur.
## 85. Preuves unitaires et externes pre.011
Les tests ajoutés prouvent :
```text
stale identity/index inventaire rejetés
counter overflow agrégé détecté
leader hydration aborté -> follower réveillé + registry nettoyée
abort du supervisor source -> enfant imbriqué détruit
stop et fault simultanés -> fault non masquée et sibling rejoint
drain timeout -> persistence abortée/jointe et aucune complétion tardive
terminal counter_exhausted retenu après source completion
```
Les canaris `dependency_boundary`, `hardening`, `public_api` et `release_completeness` verrouillent l'ownership, l'ordre terminal, l'atomicité notification/retrait, l'absence de `unbounded_channel`, l'absence de backend/client direct et l'absence de nouvelle surface publique d'identité source.
## 86. Non-claims pre.011
```text
pas de changement Transport
pas de nouvelle dépendance/feature
pas de retry/failover supplémentaire
pas de politique de réparation historique
pas de changement convergence/fairness
pas de nouvelle surface snapshot publique
pas encore de completeness/security cross-layer exhaustive pre.012
pas encore de gate technique/live pre.013
```
## 87. Validation locale d'assemblage et gate avant pre.012
Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent `NON EXÉCUTÉ LOCAL`.
Gate opérateur demandé :
```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
```
Aucun `cargo tree` n'est requis et le Transport n'a pas besoin d'être rejoué pour cette tranche qui ne modifie ni le graphe ni `ksp-onchain-transport-lib`.