219 lines
8.6 KiB
Markdown
219 lines
8.6 KiB
Markdown
<!-- file: deltas/0.3.13/pre.007.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta 0.3.13-pre.007 — supervision et inventaire multi-source
|
|
|
|
## Base requise
|
|
|
|
```text
|
|
livraison précédente : 0.3.13-pre.006-fix.001
|
|
Cargo base : 0.3.13-pre.6.fix.1
|
|
delta base : deltas/0.3.13/pre.006-fix.001.md
|
|
archive delta base : ksp-general-0.3.13-pre.006-fix.001.zip
|
|
```
|
|
|
|
Le gate opérateur communiqué le 10 septembre 2026 est vert sur toutes les commandes exécutées : `cargo fmt`, `cargo fmt --check`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict et toutes les suites de `ksp-worker-raw-transaction-ingest-lib` (`88` unit, `4` cross-layer, `13` dependency-boundary, `20` hardening, `14` public-api, `4` release-completeness, `0` doc-test). Le log reçu ne contient pas les sorties séparées `cargo test -p ksp-onchain-transport-lib` ni les trois commandes `cargo tree`; elles ne sont donc pas déclarées PASS dans ce delta.
|
|
|
|
## Objectif
|
|
|
|
Activer réellement la collection `1..32` déjà composable depuis `pre.002` :
|
|
|
|
```text
|
|
RawTransactionIngestRuntimeResources
|
|
-> validation complète réseau / doublons / borne
|
|
-> spawn de toutes les sources configurées
|
|
-> inventaire privé source_key -> latest state/frontier
|
|
-> projection frontier source-neutral agrégée
|
|
-> terminalité conservatrice si une source disparaît ou échoue
|
|
```
|
|
|
|
Aucun provider n'est traité comme primaire, fallback ou standby.
|
|
|
|
## Version
|
|
|
|
```text
|
|
livraison : 0.3.13-pre.007
|
|
workspace.package.version : 0.3.13-pre.7
|
|
archive : ksp-general-0.3.13-pre.007.zip
|
|
```
|
|
|
|
`Cargo.toml` passe de la version de fichier `551` à `552`.
|
|
|
|
## Supervisor multi-source
|
|
|
|
`RawTransactionIngestWorker::start_with_runtime_resources` ne vérifie plus `validate_single_source_activation`. Après validation du réseau, le runtime délègue à `RawTransactionIngestRuntimeResources::run_live_sources`.
|
|
|
|
Le supervisor privé :
|
|
|
|
```text
|
|
crée un stop channel source-owned
|
|
crée un JoinSet borné par la collection 1..32
|
|
spawn chaque source configurée exactement une fois
|
|
clone uniquement les handles nécessaires
|
|
rejoint toutes les tasks avant de rendre son résultat
|
|
```
|
|
|
|
La vieille erreur `runtime_resources.multi_source_activation_pending` disparaît du code production.
|
|
|
|
## Terminalité conservatrice
|
|
|
|
La politique reste fail-closed :
|
|
|
|
```text
|
|
stop Worker
|
|
-> fanout stop vers toutes les sources
|
|
-> join complet
|
|
-> Ok seulement si les sources ferment sans erreur
|
|
|
|
source Err
|
|
-> stop immédiat des autres sources
|
|
-> join complet
|
|
-> faute source terminale
|
|
|
|
source Ok avant stop Worker
|
|
-> fermeture inattendue d'une source configurée
|
|
-> stop des autres sources
|
|
-> faute terminale
|
|
|
|
JoinError
|
|
-> faute terminale sûre
|
|
```
|
|
|
|
Le Worker ne suppose pas qu'une autre source couvre les mêmes filtres, le même provider universe ou la même complétude.
|
|
|
|
## Inventaire privé et processing frontier
|
|
|
|
`RawTransactionIngestSourceInventory` et `RawTransactionIngestSourceInventoryPublisher` restent privés au module runtime resources. L'inventaire est initialisé depuis les `source_key` déjà validées et possède exactement une entrée latest-value par source du run.
|
|
|
|
Chaque source conserve son propre publisher local. Un wrapper privé reporte ses projections dans l'inventaire puis publie une projection globale conservative :
|
|
|
|
```text
|
|
hydration_pending : somme saturante temporaire des sources
|
|
oldest_pending_slot : minimum global
|
|
processing_frontier_slot : None si une source n'a pas encore de frontier
|
|
sinon minimum de toutes les frontiers
|
|
source_state : Failed > Reconnecting > Closing > Active > Closed/None
|
|
reconnect/replay/gap : agrégation saturante, jamais wrap arithmétique
|
|
```
|
|
|
|
Le choix du minimum n'est pas une preuve de coverage blockchain. La frontier reste run-local et source-neutral.
|
|
|
|
## Propriété d'ownership
|
|
|
|
Les sources physiques continuent d'appartenir à leurs façades Transport existantes. Le Worker ne crée ni client reqwest, ni socket alternatif, ni SDK provider. Le supervisor ajoute uniquement l'ownership des tasks source et de leur lifecycle commun.
|
|
|
|
Une source qui termine avant le stop est explicitement marquée `Closed` ou `Failed` dans l'inventaire avant le résultat du supervisor. Les identités `source_key` restent privées et ne sont jamais projetées dans `RawTransactionIngestSnapshot` ou le crate root.
|
|
|
|
## Preuves ajoutées
|
|
|
|
Unit tests déterministes :
|
|
|
|
```text
|
|
inventaire 2 sources : pending/frontier/state/counters agrégés conservativement
|
|
stop supervisor : trois tasks source actives reçoivent le stop et sont toutes jointes
|
|
source failure : la source sœur reçoit le stop et est jointe avant retour de faute
|
|
```
|
|
|
|
Canaris externes :
|
|
|
|
```text
|
|
dependency_boundary : run_live_sources, JoinSet, inventaire privé, vieille barrière absente
|
|
hardening : stop/fault/join fail-closed, aucune policy primary/standby, aucun canal unbounded
|
|
public_api : inventaire/live-source/source_key non exportés
|
|
```
|
|
|
|
Les canaris historiques `0.3.12` qui cherchaient `run_single_live_source` sont mis à jour vers le supervisor multi-source au lieu d'être supprimés.
|
|
|
|
## Frontière de tranche
|
|
|
|
`pre.007` active la simultanéité, mais ne ferme pas encore la convergence transactionnelle cross-source :
|
|
|
|
```text
|
|
pas de coalescence globale de la même signature entre plusieurs sources
|
|
pas d'unique hydration cross-source garantie
|
|
pas de fusion de plusieurs provenance/observation seeds vers une acquisition canonique unique
|
|
pas encore de record_raw_transaction_observation pour les observations supplémentaires convergées
|
|
pas encore de fairness durcie duplicate-storm
|
|
pas encore de source_total/source_active/source_failed publics
|
|
```
|
|
|
|
Les coordinators d'hydration des sources reference-bearing restent donc source-local pendant cette tranche. La fermeture de la coalescence globale et des observations multiples appartient à `pre.008`, puis les bornes/fairness renforcées à `pre.009`.
|
|
|
|
## Documentation
|
|
|
|
Le README du crate décrit désormais le supervisor 1..32, la terminalité conservative et la frontier agrégée. `USAGE.md` reste version-neutral et montre comment composer plusieurs sources via les `try_push_*` existants sans mentionner le numéro de prerelease.
|
|
|
|
Le plan et la validation consignent le gate opérateur réellement reçu et distinguent explicitement ce qui reste reporté à `pre.008+`.
|
|
|
|
## Fichiers modifiés
|
|
|
|
```text
|
|
Cargo.toml
|
|
crates/ksp-worker-raw-transaction-ingest-lib/README.md
|
|
crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/dependency_boundary.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/public_api.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs
|
|
docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md
|
|
docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md
|
|
```
|
|
|
|
## Fichiers ajoutés
|
|
|
|
```text
|
|
deltas/0.3.13/pre.007.md
|
|
```
|
|
|
|
## Fichiers supprimés
|
|
|
|
```text
|
|
aucun
|
|
```
|
|
|
|
## Validation dans l'environnement d'assemblage
|
|
|
|
Le toolchain Rust/Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-`pre.007` restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques KSP, le scan normatif, les versions de fichiers et le diff exhaustif sont exécutés sur l'état exact avant packaging.
|
|
|
|
## Résultats statiques finaux de l'assemblage
|
|
|
|
```text
|
|
General Rust rule audit: clean
|
|
Rust export completeness audit: 0 candidate(s)
|
|
KSP workspace Rust rule audit: clean
|
|
Markdown table audit: clean (340 tables, 841 files)
|
|
Normative rule definitions: 489
|
|
Unique normative IDs: 489
|
|
Duplicates: 0
|
|
```
|
|
|
|
Contrôle ciblé du supervisor :
|
|
|
|
```text
|
|
ancienne barrière validate_single_source_activation : absente
|
|
runtime_resources.multi_source_activation_pending : absent du code production
|
|
inventaire source public : absent
|
|
source_key public : absent
|
|
unbounded_channel : absent
|
|
nouvelle dépendance : aucune
|
|
```
|
|
|
|
## Gate opérateur requis avant pre.008
|
|
|
|
```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
|
|
```
|