v0.3.13-pre.011
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user