v0.3.13-pre.009
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md -->
|
||||
<!-- version: 8 -->
|
||||
<!-- version: 9 -->
|
||||
|
||||
# Plan v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source RawTransaction
|
||||
|
||||
@@ -361,6 +361,8 @@ shutdown timeout : bornes 0.3.12 conservées
|
||||
|
||||
Le coordinator doit utiliser la capacité effective configurée plutôt que la constante maximale comme borne opérationnelle de pending.
|
||||
|
||||
Pour matérialiser simultanément cette borne et la fairness minimale sans scheduler pondéré, `pre.009` partitionne statiquement les deux capacités entre les seules sources reference-bearing. Une composition est refusée avant spawn si leur nombre dépasse `admission_queue_capacity` ou `persistence_concurrency`; sinon chaque source reçoit au moins une part et les sommes des quotas restent exactement dans les capacités configurées. Un sémaphore global conserve en plus un guard défensif sur les hydrations HTTP effectivement ouvertes.
|
||||
|
||||
### 9.4 Fairness minimale
|
||||
|
||||
Aucune source ne reçoit une queue Worker non bornée. Tous les producteurs attendent sur le même canal borné et subissent le même backpressure.
|
||||
@@ -404,7 +406,7 @@ même identité + payload/hash divergent = content conflict explicite
|
||||
|
||||
Aucune majorité de providers, préférence de tier ou overwrite n'est autorisé.
|
||||
|
||||
Le Store reste l'autorité durable finale du conflit. Le coordinator peut détecter plus tôt une divergence lorsque plusieurs matériaux complets de même identité coexistent dans le même lot, mais cette optimisation ne remplace jamais le guard Store.
|
||||
Le Store reste l'autorité durable finale du conflit. Le coordinator peut détecter plus tôt une divergence lorsque plusieurs matériaux complets de même identité coexistent dans le même lot, mais cette optimisation ne remplace jamais le guard Store. La comparaison précoce `pre.009` couvre les dimensions durables disponibles sans recopier le payload dans le cache : slot, block time, format id/version et hash canonique ; les bytes restent protégés par la canonicalisation Common RAW et le guard Store.
|
||||
|
||||
Un content conflict reste terminal pour le Worker en `0.3.13`.
|
||||
|
||||
@@ -1283,3 +1285,125 @@ cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal
|
||||
cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
## 67. Gate opérateur pre.008-fix.002 reçu avant pre.009
|
||||
|
||||
Le gate complet a été fermé en deux exécutions opérateur consécutives le 10 septembre 2026.
|
||||
|
||||
La première exécution confirme :
|
||||
|
||||
```text
|
||||
fmt : PASS
|
||||
audits Rust : clean / export completeness 0
|
||||
Markdown : clean, 340 tables / 844 files
|
||||
cargo check --workspace : PASS
|
||||
clippy workspace all-targets all-features -D warnings : PASS
|
||||
worker unit : 94/94 PASS
|
||||
cross-layer : 4/4 PASS
|
||||
dependency boundary : 15/15 PASS
|
||||
hardening : 22/22 PASS
|
||||
public API : 16/16 PASS
|
||||
release completeness : 4/4 PASS
|
||||
worker doc-tests : 0/0 PASS
|
||||
```
|
||||
|
||||
La seconde exécution ferme les commandes étendues qui manquaient jusque-là :
|
||||
|
||||
```text
|
||||
ksp-onchain-transport-lib unit : 389/389 PASS
|
||||
transport public API : 52/52 PASS
|
||||
transport release completeness : 44/44 PASS
|
||||
transport doc-tests : 4/4 PASS
|
||||
smokes live opt-in : 5 ignored comme prévu
|
||||
cargo tree worker --edges normal : exécuté sans erreur
|
||||
cargo tree worker -e features : exécuté sans erreur
|
||||
cargo tree --duplicates : exécuté sans erreur ; doublons workspace existants listés, aucune promesse de graphe sans doublon
|
||||
```
|
||||
|
||||
Ce gate autorise `pre.009` sans réouvrir Transport ni modifier les dépendances du Worker.
|
||||
|
||||
## 68. Implémentation pre.009 — bornes globales et fairness minimale
|
||||
|
||||
Les seules sources reference-bearing sont Yellowstone, Standard Logs et Helius Transaction. `run_live_sources` compte ces sources avant tout spawn et vérifie deux compatibilités de capacité :
|
||||
|
||||
```text
|
||||
hydration_source_count <= admission_queue_capacity
|
||||
hydration_source_count <= persistence_concurrency
|
||||
```
|
||||
|
||||
Une violation est fail-closed avant spawn avec un `runtime_invalid` stable et sans exposer de valeur sensible. Lorsque la composition est valide, les quotas sont répartis de façon déterministe suivant l'ordre déjà validé des sources :
|
||||
|
||||
```text
|
||||
somme hydration pending quotas = admission_queue_capacity
|
||||
somme hydration in-flight quotas = persistence_concurrency
|
||||
chaque source reference-bearing reçoit au moins 1 pending et 1 in-flight
|
||||
```
|
||||
|
||||
Le partage utilise quotient + reste et n'introduit ni priorité provider, ni scheduler pondéré, ni queue privée non bornée. Une source hostile ne peut donc pas consommer la part réservée aux autres sources reference-bearing. Standard Block et HTTP Block Polling continuent à passer directement par l'admission centrale bornée lorsqu'ils produisent du Common RAW.
|
||||
|
||||
Le registre global d'hydration conserve `max_pending = admission_queue_capacity`. Un sémaphore Tokio global de `persistence_concurrency` constitue un second guard défensif : même si un invariant local régressait, le nombre d'hydrations HTTP leader effectivement ouvertes resterait borné.
|
||||
|
||||
## 69. Duplicate storms, cleanup et starvation
|
||||
|
||||
La coalescence globale de `pre.008` reste `(network, signature, commitment)`. Un duplicate storm sur une clé existante ne crée pas de nouvelle entrée globale et ne déclenche pas de second leader HTTP. Les clés distinctes restent bornées par le budget global ; saturation produit une faute runtime sûre plutôt qu'une croissance mémoire.
|
||||
|
||||
Chaque leader global possède désormais un guard privé de cleanup. Si sa tâche est annulée ou droppée avant publication normale, le guard retire la clé du registre et publie une faute source sûre aux followers. Aucune entrée leader orpheline ne doit survivre à un abort/shutdown.
|
||||
|
||||
La fairness de l'admission centrale est prouvée sur une queue bornée de capacité `1` : après qu'une source storm a rejoint la file d'attente, une seconde source prête rejoint la même queue et est admise avant la réitération suivante de la storm. La preuve ne revendique pas de QoS pondérée ; elle verrouille seulement l'absence de starvation indéfinie d'une source déjà prête sous le contrat FIFO du canal borné utilisé.
|
||||
|
||||
## 70. Disagreement et content conflict pre.009
|
||||
|
||||
Le cache de convergence persistence ne se limite plus au seul `RawContentHash`. Pour une même identité durable `(network, signature)`, il conserve un état canonique borné contenant :
|
||||
|
||||
```text
|
||||
slot
|
||||
block_time
|
||||
format_id
|
||||
format_version
|
||||
content_hash
|
||||
```
|
||||
|
||||
Une divergence sur l'une de ces dimensions devient immédiatement le content conflict terminal existant, avant toute observation additionnelle. Les bytes ne sont pas recopiés dans le cache ; ils sont déjà représentés par le hash issu de la canonicalisation Common RAW, et le Store conserve son contrôle durable final incluant les bytes exacts.
|
||||
|
||||
La politique reste strictement conservatrice : aucune majorité de sources, aucun first-provider-wins, aucune préférence de tier/provider et aucun overwrite ne sont introduits.
|
||||
|
||||
## 71. Preuves déterministes pre.009
|
||||
|
||||
Les preuves ajoutées couvrent au minimum :
|
||||
|
||||
```text
|
||||
partition exacte des budgets pending et in-flight
|
||||
refus des compositions sous-provisionnées avant spawn
|
||||
chaque source reference-bearing reçoit une part non nulle
|
||||
storm de 32 duplicats -> une seule clé globale leader
|
||||
clé globale distincte au-delà de la borne -> saturation sûre
|
||||
sémaphore global -> une seule permit active pour capacité 1
|
||||
drop du leader guard -> publication Failed + clé réouvrable
|
||||
storm admission -> seconde source prête progresse avant la répétition suivante
|
||||
même signature + slot divergent -> content conflict
|
||||
même signature + block_time divergent -> content conflict
|
||||
même signature + contenu/hash divergent -> content conflict
|
||||
aucune observation additionnelle après disagreement
|
||||
```
|
||||
|
||||
Les canaris externes verrouillent en plus l'absence de backend Store direct, client réseau direct, queue non bornée, politique provider-preference et exposition publique des quotas/registry/canonical state.
|
||||
|
||||
## 72. Frontière de tranche pre.009
|
||||
|
||||
`pre.009` ferme disagreements, duplicate storms, bornes globales d'hydration et fairness minimale. Elle ne modifie pas les compteurs/snapshots publics pour exposer une health multi-source détaillée : cette projection appartient à `pre.010`. Elle n'introduit pas non plus de failover, de dégradation non terminale, de priorité provider ni de scheduling pondéré.
|
||||
|
||||
## 73. Gate opérateur requis avant pre.010
|
||||
|
||||
```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-onchain-transport-lib
|
||||
cargo test -p ksp-worker-raw-transaction-ingest-lib
|
||||
cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal
|
||||
cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user