v0.3.14-pre.007
This commit is contained in:
217
deltas/0.3.14/pre.007.md
Normal file
217
deltas/0.3.14/pre.007.md
Normal file
@@ -0,0 +1,217 @@
|
||||
<!-- 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.
|
||||
Reference in New Issue
Block a user