217 lines
6.5 KiB
Markdown
217 lines
6.5 KiB
Markdown
<!-- file: deltas/0.3.12/pre.007.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# Delta `0.3.12-pre.007` — processing frontier run-local bornée
|
|
|
|
## Base requise
|
|
|
|
```text
|
|
0.3.12-pre.006-fix.001
|
|
workspace.package.version = 0.3.12-pre.6.fix.1
|
|
```
|
|
|
|
Le gate opérateur communiqué pour cette base est entièrement vert : audits Rust/Markdown, `cargo check --workspace`, Clippy strict, 58 tests Worker et toutes les suites d'intégration associées.
|
|
|
|
## Objectif
|
|
|
|
Ajouter la processing frontier run-local prévue au plan sans anticiper reconnect/replay/repair :
|
|
|
|
```text
|
|
source work observed
|
|
pending / settled par slot
|
|
oldest pending slot
|
|
highest unblocked actually-observed settled slot
|
|
latest-value snapshot projection
|
|
```
|
|
|
|
La frontier reste strictement processing-only.
|
|
|
|
## Version
|
|
|
|
```text
|
|
workspace.package.version = 0.3.12-pre.7
|
|
```
|
|
|
|
## Définition pending / settled
|
|
|
|
Un signal transactionnel devient pending seulement après validation de sa clé d'hydration et insertion dans le coordinator borné.
|
|
|
|
Il devient settled lorsque :
|
|
|
|
```text
|
|
hydration HTTP -> Missing
|
|
ou
|
|
hydration HTTP -> Available puis ingress accepté par la queue centrale
|
|
```
|
|
|
|
`BlockMeta` et `Slot` sont continuity-only et deviennent settled dès leur projection locale, sans créer de RAW.
|
|
|
|
Un signal non admis à cause d'un stop ou d'un fault reste pending dans la dernière projection de run. `settled` ne signifie jamais Store persisted/durable.
|
|
|
|
## Frontier
|
|
|
|
Le tracker privé maintient :
|
|
|
|
```text
|
|
pending_total
|
|
pending par slot
|
|
settled par slot retenu
|
|
oldest_pending_slot
|
|
processing_frontier_slot
|
|
```
|
|
|
|
La frontier est la plus haute slot réellement observée/settled située avant la plus ancienne slot encore pending. Sans pending, elle devient la plus haute slot settled effectivement observée.
|
|
|
|
Ainsi, une slot pending empêche explicitement toute progression à travers elle.
|
|
|
|
## Borne mémoire
|
|
|
|
Les slots pending sont conservées exactement. Les slots settled-only sont compactées par intervalles autour des slots pending : un seul maximum settled est conservé par intervalle.
|
|
|
|
La représentation est donc bornée linéairement par le nombre de slots pending distinctes, lui-même borné par le coordinator d'hydration. Un flux continuity-only sans pending se compacte à une seule candidate.
|
|
|
|
Aucun historique de slots non borné n'est conservé.
|
|
|
|
## Projection snapshot
|
|
|
|
Le source task émet une projection privée latest-value par `tokio::sync::watch` :
|
|
|
|
```text
|
|
hydration_pending
|
|
processing_frontier_slot
|
|
oldest_pending_slot
|
|
```
|
|
|
|
Le supervisor reste l'unique owner/mutateur du snapshot concret et applique ces valeurs via `RawTransactionIngestSnapshotPublisher`.
|
|
|
|
Les trois getters deviennent publics sur `RawTransactionIngestSnapshot`. Aucun nouveau type public ni module public n'est ajouté.
|
|
|
|
`WorkerActivity` considère désormais `hydration_pending > 0` comme activité réelle même si la queue centrale et la persistence sont momentanément vides.
|
|
|
|
## Sécurité / redaction
|
|
|
|
La projection ne transporte jamais :
|
|
|
|
```text
|
|
signature
|
|
filter id/value
|
|
provider
|
|
endpoint
|
|
transaction/meta
|
|
URL/header/credential
|
|
remote error text
|
|
```
|
|
|
|
Les erreurs de compteur/frontier utilisent uniquement des codes/contextes internes sûrs.
|
|
|
|
## Canaris ajoutés/ajustés
|
|
|
|
```text
|
|
frontier ne traverse jamais une slot pending
|
|
oldest pending avance après settlement
|
|
frontier rejoint la plus haute slot settled lorsque tout pending est résolu
|
|
compaction bornée des settled-only
|
|
snapshot initial frontier vide
|
|
snapshot latest-value des trois getters
|
|
WorkerActivity active sur hydration pending
|
|
public getters exacts
|
|
source.run inclut le publisher frontier privé
|
|
aucun ReplayInfo/from_slot/continuity_gap/repair
|
|
aucun backend/direct protocol edge
|
|
release completeness inclut les nouveaux canaris
|
|
```
|
|
|
|
## Décisions prises
|
|
|
|
```text
|
|
frontier = source-processing, pas Store durability
|
|
Missing = settled source-processing
|
|
Available = settled après send admission réussi
|
|
continuity-only = settled immédiat local
|
|
projection supervisor via watch latest-value
|
|
pas de checkpoint persistant
|
|
pas de claim monotone de blockchain completeness
|
|
```
|
|
|
|
## Questions ouvertes
|
|
|
|
Aucune question ne bloque `pre.007`.
|
|
|
|
Restent réservés :
|
|
|
|
```text
|
|
reconnect / from_slot / ReplayInfo / retention gap : pre.008
|
|
races/retry/backpressure final : pre.009
|
|
cross-layer completeness/security : pre.010
|
|
live opt-in : pre.011
|
|
```
|
|
|
|
## Fichiers ajoutés
|
|
|
|
```text
|
|
deltas/0.3.12/pre.007.md
|
|
```
|
|
|
|
## Fichiers modifiés
|
|
|
|
```text
|
|
Cargo.toml
|
|
crates/ksp-worker-raw-transaction-ingest-lib/src/lib.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/src/snapshot.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
|
|
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/snapshot.rs
|
|
docs/validation/029-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY.md
|
|
```
|
|
|
|
## Fichiers supprimés
|
|
|
|
Aucun.
|
|
|
|
## Validations exécutées dans l'environnement d'assemblage
|
|
|
|
```text
|
|
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
|
|
```
|
|
|
|
Des scanners statiques ciblés vérifient également la borne du tracker, le blocage par oldest pending, les getters publics, le confinement Transport et l'absence de responsabilités `pre.008`.
|
|
|
|
## Validations non exécutées dans l'environnement d'assemblage
|
|
|
|
`cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement d'assemblage. Aucun gate Cargo local n'est revendiqué.
|
|
|
|
## Gate opérateur requis
|
|
|
|
```bash
|
|
cargo fmt --all
|
|
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-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
|
|
```
|
|
|
|
## Non-claims
|
|
|
|
```text
|
|
pas de reconnect policy Worker
|
|
pas de from_slot Worker
|
|
pas d'interprétation ReplayInfo
|
|
pas de preuve replay
|
|
pas de continuity gap fault
|
|
pas de repair/backfill implicite
|
|
pas de checkpoint inter-process
|
|
pas de getBlock
|
|
pas de nouveau backend/Config edge
|
|
pas de smoke live revendiqué
|
|
```
|