Files
khadhroony-solana-project/docs/validation/029-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY.md
2026-09-08 23:44:19 +02:00

15 KiB
Raw Blame History

Validation v0.3.12 — Yellowstone + hydration HTTP + continuité de run du Worker RawTransaction

1. Rôle du document

Ce document enregistre les preuves réellement exécutées, les non-claims et les gates progressifs de 0.3.12. Une commande non exécutée n'est jamais déclarée PASS.

pre.001 est un gate de lecture/audit/sizing. Il ne contient aucun code Worker réseau productif.

2. Gate pre.001 — base stable

2.1 Archive contrôlée

archive : khadhroony-solana-project-v0.3.11.zip
SHA-256 : a6bb59935650a7f48630d12ef80fbd1a44a84819dd129b085ff7f467369535fc
bytes : 8125100
entries : 1950
unzip -t : PASS
root unique : PASS
absolute entries : 0
path traversal : 0
symlinks : 0
.git/ : 0
target/ : 0
node_modules/ : 0
Cargo.lock : 0
.env : 0
workspace members : 21
workspace.package.version : 0.3.11

deltas/0.3.11/rel.001.md est présent.

2.2 Préconditions fonctionnelles

Contrôlé dans la stable :

ksp-worker-raw-transaction-ingest-lib présent
README/USAGE présents
aucun edge Worker -> Transport
aucune source réseau productive dans src/
ksp-raw-transaction-lib présent
ksp-onchain-transport-lib présent avec Yellowstone gRPC générique
ksp-store-lib présent
ksp-job-backfill-lib ne dépend pas du Worker

Résultat : PASS.

3. Baseline statique locale avant modification

Exécuté dans l'archive extraite :

python3 scripts/audit_rust_workspace_rules.py
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean

Résultat : PASS.

Exécuté :

python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
Markdown table audit: clean (340 table(s), 798 file(s))

Résultat : PASS.

4. Cargo local dans l'environnement d'assemblage

cargo n'est pas installé dans l'environnement d'assemblage utilisé pour pre.001.

Non exécuté localement :

cargo fmt --all -- --check
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-targets --all-features
cargo tree --duplicates

Ces commandes ne sont pas déclarées PASS localement.

5. Preuve opérateur de la stable 0.3.11

Le journal fourni avec la demande d'ouverture montre sur la stable :

cargo clean : exécuté
cargo fmt --all -- --check : sans erreur visible
audit Rust : clean
audit Markdown : clean (340 tables, 798 fichiers)
cargo check --workspace : terminé sans erreur
cargo clippy --workspace --all-targets --all-features -- -D warnings : terminé sans erreur
cargo test --workspace : suites affichées vertes ; tests live opt-in ignorés conformément à leur contrat
cargo tree Worker normal/features : demandé dans le journal opérateur

Cette preuve opérateur concerne l'état stable d'entrée. Elle n'est pas réétiquetée comme exécution locale de 0.3.12-pre.001.

6. Audit humain des règles

Sources lues pour le gate :

RULES.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/rules/RULES_GENERAL.md
docs/rules/RULES_KSP.md
docs/rules/RULES_RUST.md
docs/rules/RULES_DEPENDENCIES.md
docs/rules/RULES_DOCUMENTATION.md
docs/rules/FILE_CONTRACTS.md
docs/rules/VERSION_WORKFLOW.md
docs/rules/PROMPT_STRUCTURE.md

Résultat : aucune divergence normative active nécessitant une correction de règle en pre.001.

Vérifications clés :

D2 reste STRUCTURAL
nom Worker canonique = ksp-worker-raw-transaction-ingest-lib
Worker/Job restent séparés
Config reste propriétaire de l'environnement et des secrets
Store backend direct reste interdit au Worker
VER-ID-009 impose 0.3.12-pre.1 pour cette prerelease non-fix

7. Sources internes de handoff auditées

Lecture/inventaire réalisés sur :

docs/plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md
docs/validation/028-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION.md
crates/ksp-worker-raw-transaction-ingest-lib/Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/README.md
crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md
crates/ksp-worker-raw-transaction-ingest-lib/src/
crates/ksp-worker-raw-transaction-ingest-lib/tests/
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/

docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md
docs/plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md
docs/validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md
crates/ksp-raw-transaction-lib/README.md
crates/ksp-raw-transaction-lib/USAGE.md
crates/ksp-raw-transaction-lib/src/
crates/ksp-raw-transaction-lib/tests/

crates/ksp-onchain-transport-lib/Cargo.toml
crates/ksp-onchain-transport-lib/README.md
crates/ksp-onchain-transport-lib/USAGE.md
crates/ksp-onchain-transport-lib/src/grpc_*.rs
crates/ksp-onchain-transport-lib/src/rpc_transactions.rs
crates/ksp-onchain-transport-lib/src/rpc_blocks.rs
crates/ksp-onchain-transport-lib/tests/

crates/ksp-store-lib/README.md
crates/ksp-store-lib/USAGE.md
crates/ksp-store-lib/src/
crates/ksp-worker-api/README.md
crates/ksp-worker-api/USAGE.md
crates/ksp-worker-api/src/
crates/ksp-config-lib/README.md
crates/ksp-config-lib/USAGE.md
crates/ksp-config-lib/src/

Le résultat d'inventaire est détaillé dans le plan 033.

8. Preuve Worker stable

Le Worker stable possède exactement huit fichiers de production sous src/ :

admission.rs
error.rs
identity.rs
lib.rs
persistence.rs
runtime.rs
settings.rs
snapshot.rs

Le manifest normal ne contient pas ksp-onchain-transport-lib, ksp-config-lib, ksp-job-backfill-lib, backend physique, Tonic, Reqwest ni Yellowstone proto.

Un scan source grpc|yellowstone|http|ws|transport ne révèle qu'une documentation signalant l'absence de source live ; aucun adapter réseau productif n'est présent.

Résultat : PASS pour la précondition 0.3.11.

9. Preuve Transport actuelle

Contrats existants confirmés :

YellowstoneGrpcChannel::open_standard_subscribe
SolanaYellowstoneGrpcSubscribeSession::next_update
SolanaYellowstoneGrpcSubscribeSession::snapshot
YellowstoneSubscribeRequest::set_from_slot
YellowstoneReplayInfo::first_available
HttpTransportPool::get_transaction_observed
HttpTransportPool::get_block_observed
HttpObservedValue::{value, endpoint_name, provider}

Le snapshot Yellowstone indique explicitement :

continuity_gap_count : seulement gap prouvé par borne ReplayInfo
replay_attempt_count : tentative, pas preuve de couverture
duplicate_update_count : observabilité, duplicates toujours livrés
last_requested_from_slot
last_observed_slot

Résultat : PASS pour la réutilisation du moteur existant.

10. Audit externe de fraîcheur

10.1 Yellowstone versions

Source docs.rs courante :

yellowstone-grpc-proto latest : 12.7.0
publication : 2026-08-29
workspace KSP : ^12.7

Résultat : aucune mise à jour de dépendance nécessaire en pre.001.

10.2 Replay upstream

Le changelog upstream du 22 juillet 2026 documente la correction yellowstone-grpc-geyser 14.2.1 pour un cas où from_slot + blocks était accepté mais aucun Block replay n'était livré avant reprise live.

Impact de validation :

subscribe accepted != replay proven
from_slot sent != replay proven
first_available compatible != replay proven

Cette menace doit posséder un canari KSP et, si un provider live est disponible, un smoke dédié.

10.3 Solana HTTP

La documentation officielle courante confirme que getTransaction à confirmed/finalized, en Base64, fournit les champs nécessaires à la conversion Common RAW déjà qualifiée : blockTime, meta, slot, transaction, version.

Résultat : hydration getTransaction maintenue comme référence P0.

10.4 Providers

OrbitFlare documente encore Devnet gRPC et un free tier Devnet-only. Helius LaserStream documente Yellowstone wire compatibility et un replay provider-specific d'environ 216 000 slots / 24 heures. Ces valeurs ne sont pas transposées dans les constantes KSP.

PublicNode reste operator-only dans KSP ; aucune nouvelle assertion provider n'est ajoutée faute de source primaire indexée suffisamment précise pendant ce gate.

11. Gate de matrice Yellowstone fermé

11.1 Transaction

Preuve interne : YellowstoneTransactionUpdate contient slot, filter names, created_at et YellowstoneTransactionInfo; ce dernier contient signature, transaction, meta, index.

Conclusion : candidat hydration ; RAW-direct non prouvé.

11.2 TransactionStatus

Preuve interne : slot, signature, index, is_vote, error optionnelle.

Conclusion : discovery/hydration seulement.

11.3 Block

Preuve interne : slot, block_time, transactions avec transaction/meta/signature/index, compteurs et metadata block.

Conclusion : chaque transaction peut devenir candidat hydration ; aucun pipeline block RAW parallèle.

11.4 BlockMeta

Conclusion : continuity/health only ; aucune signature donc aucune hydration transaction autonome.

11.5 Slot

Conclusion : continuity/health only ; aucune admission RAW.

11.6 from_slot

Conclusion : mécanisme Transport de replay au reconnect, pas checkpoint historique Worker.

11.7 ReplayInfo

Conclusion : first_available prouve seulement une limite de rétention. Un gap est prouvé quand la demande est antérieure à cette borne ; le cas inverse ne prouve pas que toutes les updates filtrées ont été livrées.

12. Gate architecture d'injection fermé

Décision :

nouvel edge autorisé : Worker -> ksp-onchain-transport-lib
Worker -> Config : interdit
Worker -> Job : interdit
Worker -> backend : interdit
Worker -> Tonic/Reqwest/yellowstone-grpc-proto direct : non retenu

La composition supérieure construit YellowstoneGrpcChannel, YellowstoneSubscribeRequest, HttpTransportPool et HttpRoleName. pre.002 matérialise exactement :

RawTransactionIngestYellowstoneSource::new(...)
RawTransactionIngestRuntimeResources::new(yellowstone_source)
RawTransactionIngestWorker::start_with_runtime_resources(settings, Arc<Store>, resources)

Les champs restent privés. RawTransactionIngestWorker::start(settings, Arc<Store>) reste disponible comme foundation source-neutral. Aucune API publique enqueue n'est ouverte.

13. Gate hydration/provenance fermé

Hydration P0 :

get_transaction_observed
Base64
confirmed/finalized uniquement
maxSupportedTransactionVersion = 0

Provenance : route composite encodée dans les champs RawAcquisitionProvenance existants, avec provider/endpoint réels du winner HTTP et identité sûre Yellowstone, sous MAX_RAW_CODE_BYTES. Aucune migration Store.

Un code composite impossible à représenter est rejeté ; aucune troncature silencieuse.

14. Gate continuité fermé

Décisions :

Transport high-watermark != Worker processing frontier
processing frontier != blockchain completeness
reconnect != replay
replay != repair
continuity gap prouvé => fault Worker sûr
aucun Backfill automatique
aucun checkpoint persistant inter-process
pending hydration peut survivre au reconnect source dans le même run

Le split pre.007/pre.008 évite de coder frontier et replay semantics dans une seule tranche.

15. Threat model à transformer en tests

Canaris obligatoires :

secret/URL/header redaction
remote status/error text not copied
bounded signal/hydration queues
bounded coalescence
no duplicate HTTP in-flight for same key
no double retry storm
stop during connect/reconnect/hydration/replay
no admission after stop frontier
no orphan task after terminal
counter checked arithmetic
stale frontier never labelled complete
continuity gap terminal and safe

16. Smokes live

16.1 Disponibilité démontrée par le dépôt

Présents et ignored :

yellowstone_orbitflare_smoke
yellowstone_publicnode_smoke

Ils exigent des tokens fournis de manière operator-only.

16.2 Disponibilité opérateur pour pre.001

Aucun secret live n'est fourni dans l'archive. Le journal stable montre ces tests comme ignorés par défaut.

Résultat :

Worker live smoke : NON EXÉCUTÉ en pre.001
raison : pipeline productif pas encore implémenté + secret/provider live non fourni au gate

Aucun faux PASS live n'est enregistré.

17. Graphe Cargo cible vérifiable à partir de pre.002

Attendu :

Worker -> core
Worker -> logging
Worker -> onchain-transport
Worker -> raw-transaction
Worker -> store facade default-features=false
Worker -> worker-api
Worker -> sha2
Worker -> tokio

Toujours absent :

Config
Job Backfill
Store backend
Tauri
provider SDK
Tonic direct
Reqwest direct
Yellowstone proto direct

18. Sizing et décision release

Forecast retenu :

pre.001 audit/sizing/plan
pre.002 Transport resource/source contract
pre.003 Transaction + TransactionStatus signal adapters
pre.004 HTTP hydration + provenance composite
pre.005 Block + BlockMeta + Slot adapters
pre.006 productive source task + supervisor/coalescence
pre.007 processing frontier
pre.008 reconnect/from_slot/ReplayInfo
pre.009 races/retry/backpressure hardening
pre.010 cross-layer completeness/security
pre.011 technical/live gate
pre.012 documentation reconciliation
pre.013 publication preparation
rel.001

Décision : 0.3.12 reste ouverte et n'est pas rescindée. Toute tranche dépassant réellement 1520 minutes est scindée avant exécution.

19. Validation après modification de pre.001

Exécuté sur le delta complet :

python3 scripts/audit_rust_workspace_rules.py
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean

python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
Markdown table audit: clean (340 table(s), 801 file(s))

Résultat : PASS pour les audits statiques locaux.

Cargo reste NON EXÉCUTÉ localement car l'outil n'est pas installé.

Le gate opérateur demandé après application du delta est :

cargo fmt --all -- --check
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

pre.001 n'ajoutant aucun Rust, les tests ciblés Worker restent une preuve de non-régression facultative mais recommandée :

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

20. Non-claims pre.001

pre.001 ne prétend pas avoir :

ajouté l'edge Worker -> Transport dans Cargo
ouvert une session Yellowstone dans le Worker
hydraté une transaction live
persisté un RAW live Yellowstone
prouvé un RAW-direct Yellowstone
prouvé un replay provider complet
implémenté une frontier
implémenté un repair
enrichi les snapshots runtime
exécuté un smoke live Worker
exécuté Cargo dans l'environnement d'assemblage

21. Critère de sortie pre.001

Le gate est fermé si :

base stable prouvée
règles auditées
surfaces internes inventoriées
fraîcheur externe auditée
matrice Yellowstone fermée
injection runtime décidée
hydration/provenance décidées
frontier/replay/repair distingués
threat model défini
smokes classifiés
Cargo graph cible défini
forecast <20 min par tranche
maintien/split décidé
plan + validation + delta créés
audits statiques post-modification verts