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é