Files
khadhroony-solana-project/deltas/0.3.12/pre.007.md
2026-09-09 16:21:23 +02:00

6.5 KiB

Delta 0.3.12-pre.007 — processing frontier run-local bornée

Base requise

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 :

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

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 :

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 :

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 :

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 :

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

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

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 :

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

deltas/0.3.12/pre.007.md

Fichiers modifiés

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

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

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

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é