199 lines
7.3 KiB
Markdown
199 lines
7.3 KiB
Markdown
<!-- file: deltas/0.3.13/pre.008.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta 0.3.13-pre.008 — convergence cross-source et observations multiples
|
|
|
|
## Base requise
|
|
|
|
```text
|
|
livraison précédente : 0.3.13-pre.007
|
|
Cargo base : 0.3.13-pre.7
|
|
delta base : deltas/0.3.13/pre.007.md
|
|
archive delta base : ksp-general-0.3.13-pre.007.zip
|
|
```
|
|
|
|
Le gate opérateur communiqué le 10 septembre 2026 est vert pour toutes les commandes exécutées : `cargo fmt`, `cargo fmt --check`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict et toutes les suites `ksp-worker-raw-transaction-ingest-lib` (`90` unit, `4` cross-layer, `14` dependency-boundary, `21` hardening, `15` 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 ici.
|
|
|
|
## Objectif
|
|
|
|
Fermer la convergence des sources live simultanées sans dupliquer l'identité `RawTransaction` :
|
|
|
|
```text
|
|
plusieurs sources reference-bearing
|
|
-> une hydration globale par (network, signature, commitment)
|
|
-> acquisitions source-distinctes
|
|
-> canonicalisation RAW commune
|
|
-> convergence par (network, signature) + content hash
|
|
-> une entity RAW
|
|
-> plusieurs observations déterministes
|
|
```
|
|
|
|
## Version
|
|
|
|
```text
|
|
livraison : 0.3.13-pre.008
|
|
workspace.package.version : 0.3.13-pre.8
|
|
archive : ksp-general-0.3.13-pre.008.zip
|
|
```
|
|
|
|
`Cargo.toml` passe de la version de fichier `552` à `553`.
|
|
|
|
## Hydration globale cross-source
|
|
|
|
`RawTransactionIngestRuntimeResources::run_live_sources` crée un `RawTransactionIngestGlobalHydrationRegistry` privé partagé par Yellowstone, Standard Logs et Helius Transaction. Standard Block et HTTP Block Polling restent RAW-direct et n'entrent pas dans ce registre.
|
|
|
|
La clé reste exactement :
|
|
|
|
```text
|
|
(network, signature, commitment)
|
|
```
|
|
|
|
Le premier demandeur devient leader et exécute le `getTransaction observed` existant. Les suivants s'abonnent au même résultat via un `watch` privé. La registry est bornée par `admission_queue_capacity`, publie soit le résultat observed soit un `ErrorCode` sûr, puis retire la clé.
|
|
|
|
Les signaux source restent distincts : le même résultat d'hydration est finalisé séparément avec le contexte/provenance de chaque signal.
|
|
|
|
## Convergence persistence
|
|
|
|
Le runtime possède un `RawTransactionIngestPersistenceConvergence` privé et run-local. Sa capacité productive est :
|
|
|
|
```text
|
|
max(admission_queue_capacity, persistence_concurrency)
|
|
```
|
|
|
|
Chaque identité `(network, signature)` possède un verrou async local et mémorise le `RawContentHash` canonique après une première persistence réussie non purgée.
|
|
|
|
```text
|
|
première acquisition
|
|
-> persist_raw_transaction_acquisition
|
|
-> Store atomique entity + observation
|
|
|
|
même identity + même content hash
|
|
-> record_raw_transaction_observation uniquement
|
|
|
|
même identity + hash divergent
|
|
-> content conflict terminal
|
|
```
|
|
|
|
Le cache évince uniquement une entrée inactive lorsqu'il atteint sa borne. Le runtime dimensionne cette borne pour couvrir toutes les tâches persistence simultanées valides.
|
|
|
|
## Observations multiples
|
|
|
|
L'`observation_key` reste dérivée de la référence canonique et du `source_key` privé. Deux sources distinctes observant le même RAW produisent donc une seule référence/entity mais des observations déterministes distinctes.
|
|
|
|
Un replay de la même observation retourne `AlreadyPresent` sans réécriture de l'entité. Une observation supplémentaire `NotRecorded` est incohérente pour une entité déjà durable et devient une faute runtime sûre.
|
|
|
|
## Preuves ajoutées
|
|
|
|
Tests unitaires déterministes :
|
|
|
|
```text
|
|
deux source_key -> même référence/hash canonique, observation_key distinctes
|
|
registry globale -> un leader, un follower, publication partagée puis retrait
|
|
première identity -> une persistence atomique
|
|
seconde observation distincte -> record_observation seul
|
|
replay même observation -> AlreadyPresent sans nouvelle persistence entity
|
|
```
|
|
|
|
Canaris externes :
|
|
|
|
```text
|
|
dependency_boundary : Store/Transport facades uniquement, pas de backend/client direct
|
|
hardening : caches bornés, hash conflict-checked, convergence privée, aucun canal unbounded
|
|
public_api : registry/cache/hydration key/source_key non exposés
|
|
release_completeness : présence obligatoire des trois canaris pre.008
|
|
```
|
|
|
|
## Frontière de tranche
|
|
|
|
`pre.008` ne ferme pas encore :
|
|
|
|
```text
|
|
fairness adversariale sous duplicate storm prolongé
|
|
starvation entre sources
|
|
matrice complète de disagreement provider/source
|
|
stress des bornes globales
|
|
nouveaux compteurs/health publics multi-source
|
|
```
|
|
|
|
Ces points restent `pre.009` et `pre.010` selon le plan.
|
|
|
|
## 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/lib.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/persistence.rs
|
|
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/admission.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/persistence.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.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.008.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.008` restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques KSP, le scan normatif, le contrôle exhaustif du diff, des headers et du ZIP sont exécutés avant livraison.
|
|
|
|
Résultats statiques finaux :
|
|
|
|
```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, 842 files)
|
|
Normative rule definitions: 489
|
|
Unique normative IDs: 489
|
|
Duplicates: 0
|
|
```
|
|
|
|
Contrôle ciblé :
|
|
|
|
```text
|
|
17 fichiers existants modifiés
|
|
1 fichier ajouté
|
|
0 suppression
|
|
17/17 headers existants : +1
|
|
nouvelle dépendance : aucune
|
|
backend Store physique direct : absent
|
|
client HTTP/gRPC direct : absent
|
|
unbounded_channel : absent
|
|
convergence/registry publiques : absentes
|
|
```
|
|
|
|
## Gate opérateur requis avant pre.009
|
|
|
|
```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
|
|
```
|