# 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é ```