218 lines
7.1 KiB
Markdown
218 lines
7.1 KiB
Markdown
<!-- file: deltas/0.3.14/pre.007.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta `0.3.14-pre.007` — hydration des références connues
|
|
|
|
## Base requise
|
|
|
|
```text
|
|
0.3.14-pre.006
|
|
workspace.package.version = 0.3.14-pre.6
|
|
deltas/0.3.14/pre.006.md présent
|
|
```
|
|
|
|
## Gate de la base
|
|
|
|
Le gate opérateur de `0.3.14-pre.006` est validé avant ouverture de cette tranche :
|
|
|
|
```text
|
|
cargo fmt --all : PASS
|
|
cargo fmt --all -- --check : PASS
|
|
audit Rust workspace rules : PASS
|
|
audit Markdown tables : PASS
|
|
cargo check --workspace : PASS
|
|
cargo clippy --workspace --all-targets --all-features -- -D warnings : PASS
|
|
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features : PASS
|
|
```
|
|
|
|
Le gate Worker comprend notamment :
|
|
|
|
```text
|
|
129 unit tests : PASS
|
|
cross_layer_completeness : 8 PASS
|
|
dependency_boundary : 19 PASS
|
|
hardening : 31 PASS
|
|
public_api : 20 PASS
|
|
release_completeness : 8 PASS
|
|
```
|
|
|
|
## Objectif
|
|
|
|
Implémenter strictement la tranche `pre.007` du plan `035` :
|
|
|
|
```text
|
|
réutiliser getTransaction observed pour une référence déjà connue
|
|
réutiliser le registre global de coalescence network/signature/commitment existant
|
|
ne créer aucun second registre d'hydration
|
|
représenter getTransaction = null comme une obligation Missing, jamais comme une preuve d'absence
|
|
conserver exactement le slot déjà observé avec la référence
|
|
préférer le bloc de ce slot lorsque le même rôle HTTP expose getBlock
|
|
ne pas déclencher encore la réconciliation du gap-ledger ni modifier le supervisor
|
|
ne pas ajouter de retry réseau Worker
|
|
```
|
|
|
|
## Obligation de référence connue
|
|
|
|
`continuity.rs` matérialise un contrat privé :
|
|
|
|
```text
|
|
RawTransactionIngestKnownReferenceObligation
|
|
reference : network + signature déjà observés
|
|
slot : slot déjà observé
|
|
commitment : Confirmed ou Finalized exact
|
|
```
|
|
|
|
Le contrat refuse `Processed` et ne contient aucun état « absent ». Il ne peut donc pas convertir une réponse HTTP `null` en preuve que la transaction n'existait pas.
|
|
|
|
Cette obligation reste distincte de `TargetCoverage` : `KnownReferences` ne devient toujours jamais une configured target coverage.
|
|
|
|
## Réutilisation de la coalescence globale
|
|
|
|
Le chemin productif existant reste fondé sur :
|
|
|
|
```text
|
|
RawTransactionIngestGlobalHydrationRegistry
|
|
RawTransactionIngestHydrationKey
|
|
network
|
|
signature
|
|
commitment
|
|
fetch_hydration_shared(...)
|
|
fetch_hydration(...)
|
|
HttpTransportPool::get_transaction_observed(...)
|
|
```
|
|
|
|
Aucun registre `KnownReferenceHydrationRegistry`, semaphore parallèle ou second fanout HTTP n'est ajouté.
|
|
|
|
Deux demandes concurrentes portant la même clé de référence partagent donc toujours le leader/follower global déjà présent depuis `0.3.13`.
|
|
|
|
## Résolution de l'hydration
|
|
|
|
La qualification après `getTransaction observed` devient explicite :
|
|
|
|
```text
|
|
Available(ingress)
|
|
Missing {
|
|
obligation,
|
|
disposition
|
|
}
|
|
```
|
|
|
|
`Available` réutilise exactement `finalize_hydration` et le pipeline central Common RAW -> admission -> Store existant.
|
|
|
|
`Missing` conserve la référence et son slot. Il ne produit aucun ingress et ne ferme aucune obligation de continuité.
|
|
|
|
Le coordinator nominal existant conserve son comportement stable jusqu'à `pre.008` : lorsqu'une notification live ordinaire hydrate vers `null`, son pending de processing est soldé comme auparavant. La nouvelle représentation `Missing` est toutefois la primitive réutilisable par la réconciliation ; `pre.008` décidera explicitement de la conservation dans le gap-ledger au lieu de confondre ce résultat avec une absence prouvée.
|
|
|
|
## Préférence bloc du slot
|
|
|
|
Après un `getTransaction = null`, aucune requête bloc n'est lancée automatiquement dans cette tranche.
|
|
|
|
Le rôle HTTP exact est inspecté sans I/O supplémentaire :
|
|
|
|
```text
|
|
getBlock supporté sur le même rôle
|
|
-> PreferBlockSlot
|
|
|
|
getBlock non supporté
|
|
-> AwaitCoverage
|
|
```
|
|
|
|
`PreferBlockSlot` signifie uniquement que le slot déjà connu est la prochaine primitive de matériau à privilégier lors de la réconciliation. Cela n'autorise ni scan historique, ni broadening du scope filtré, ni ingestion de transactions inconnues du bloc.
|
|
|
|
Le scan/discovery borné de `pre.006` et cette préférence de matériau restent séparés jusqu'à l'unification `pre.008`.
|
|
|
|
## Tests ajoutés
|
|
|
|
Les unit tests couvrent :
|
|
|
|
```text
|
|
obligation connue conservant exactement reference/slot/commitment
|
|
rejet du commitment Processed
|
|
coalescence de deux hydrations concurrentes vers une seule requête getTransaction
|
|
résolution Available vers le pipeline Common RAW existant
|
|
getTransaction = null sans getBlock -> Missing/AwaitCoverage
|
|
getTransaction = null avec getBlock sur le même rôle -> Missing/PreferBlockSlot
|
|
```
|
|
|
|
Les canaris `hardening` et `release_completeness` garantissent en plus :
|
|
|
|
```text
|
|
un seul RawTransactionIngestGlobalHydrationRegistry
|
|
aucun second KnownReferenceHydrationRegistry
|
|
réutilisation de fetch_hydration_shared et get_transaction_observed
|
|
aucune nouvelle surface publique
|
|
aucune responsabilité lower-case repair dans crate-root
|
|
```
|
|
|
|
## Hors périmètre inchangé
|
|
|
|
```text
|
|
aucune conservation active du Missing dans le gap-ledger avant pre.008
|
|
aucun getBlock fallback exécuté automatiquement dans cette tranche
|
|
aucune modification du supervisor source-loss
|
|
aucune modification de la health policy
|
|
aucun retry réseau Worker parallèle à Transport
|
|
aucune source/provider supplémentaire
|
|
aucun EARLY/shred adapter
|
|
aucun backfill historique caller-driven
|
|
```
|
|
|
|
## Fichiers ajoutés
|
|
|
|
```text
|
|
deltas/0.3.14/pre.007.md
|
|
```
|
|
|
|
## Fichiers modifiés
|
|
|
|
```text
|
|
Cargo.toml
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/continuity.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/lib.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/continuity.rs
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs
|
|
```
|
|
|
|
## Fichiers supprimés
|
|
|
|
```text
|
|
aucun
|
|
```
|
|
|
|
## Version Cargo
|
|
|
|
Conformément à `VER-ID-009` :
|
|
|
|
```text
|
|
header Cargo.toml : 573 -> 574
|
|
workspace.package.version : 0.3.14-pre.6 -> 0.3.14-pre.7
|
|
```
|
|
|
|
Versions des fichiers modifiés :
|
|
|
|
```text
|
|
continuity.rs : 6 -> 7
|
|
lib.rs : 30 -> 31
|
|
runtime_resources.rs : 32 -> 33
|
|
unit_tests/continuity.rs : 4 -> 5
|
|
unit_tests/runtime_resources.rs : 26 -> 27
|
|
tests/hardening.rs : 30 -> 31
|
|
tests/release_completeness.rs : 25 -> 26
|
|
```
|
|
|
|
## Validation exécutée dans l'environnement de préparation
|
|
|
|
```text
|
|
python3 scripts/audit_rust_workspace_rules.py : PASS
|
|
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas : PASS
|
|
```
|
|
|
|
Les gates Cargo ne sont pas déclarés PASS dans l'environnement de préparation lorsqu'ils ne peuvent pas y être exécutés. Ils restent obligatoires côté opérateur avant `pre.008`.
|
|
|
|
## Prochaine tranche
|
|
|
|
`pre.008` : unification replay/redondance/discovery HTTP/hydration dans le ledger, calcul du continuity frontier et remplacement de la terminalité « first source failure » uniquement lorsqu'une `TargetCoverage` présente et future est explicitement prouvée ; aucun respawn Worker d'une source Transport.
|