Files
khadhroony-solana-project/docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md
2026-09-10 21:55:02 +02:00

59 KiB
Raw Blame History

Validation v0.3.13 — WS standard / Helius / HTTP live + convergence multi-source

1. Rôle

Ce document enregistre les preuves réellement exécutées et les non-claims de 0.3.13. pre.001 ferme l'audit/planification, pre.002 matérialise la composition runtime multi-source, pre.003 ajoute Standard Solana logsSubscribe + hydration HTTP observée, pre.004 ajoute Standard Solana blockSubscribe RAW-direct qualifié Legacy/V0/V1, pre.005 ajoute Helius transactionSubscribe + hydration commune et pre.006 ajoute le live HTTP block polling run-local, sans activer encore la supervision simultanée.

2. Archive stable contrôlée

archive : khadhroony-solana-project-v0.3.12.zip
SHA-256 : 85c41eb9f8575ee58edd9863445cbc37b79ef59c4a7cf882679ff24dc8991bf5
bytes : 8260528
entries : 1981
files : 1788
directories : 193
absolute entries : 0
parent traversal entries : 0
duplicate entries : 0
symlink entries : 0
workspace members : 21
crate manifests : 21
workspace.package.version : 0.3.12
edition : 2024
stable delta : deltas/0.3.12/rel.001.md

Résultat structurel : PASS.

Artefacts interdits recherchés :

Cargo.lock : absent
rust-toolchain.toml : absent
rust-toolchain : absent
package-lock.json : absent
pnpm-lock.yaml : absent
yarn.lock : absent
.env : absent

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/0.3.12
Markdown table audit: clean (306 table(s), 199 file(s))

Résultat : PASS.

4. Preuve opérateur stable fournie

Le journal opérateur fourni avec l'ouverture 0.3.13 montre sur 0.3.12 :

cargo fmt --all -- --check : terminé sans erreur visible
audit Rust : clean, export completeness 0
audit Markdown ciblé stable : clean (306 tables, 199 fichiers)
cargo check --workspace : terminé avec succès
cargo clippy --workspace --all-targets --all-features -- -D warnings : terminé avec succès
cargo test -p ksp-worker-raw-transaction-ingest-lib : vert
cargo tree Worker --edges normal : produit
cargo tree Worker -e features : produit

Suites Worker affichées :

unit : 66 pass
cross_layer_completeness : 4 pass
dependency_boundary : 9 pass
hardening : 16 pass
public_api : 9 pass
release_completeness : 4 pass
doc-tests : 0

Cette preuve concerne la stable d'entrée. Elle n'est pas présentée comme une exécution locale post-modification de pre.001.

5. Cargo local dans l'environnement d'assemblage

cargo et rustfmt ne sont pas installés dans l'environnement d'assemblage courant.

Non exécuté localement avant ou après modification :

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

Aucune de ces commandes n'est déclarée PASS localement.

6. Audit des règles

Documents normatifs audités :

RULES.md
docs/rules/RULES_GENERAL.md
docs/rules/RULES_RUST.md
docs/rules/RULES_KSP.md
docs/rules/RULES_DEPENDENCIES.md
docs/rules/RULES_DOCUMENTATION.md
docs/rules/PROMPT_STRUCTURE.md
docs/rules/FILE_CONTRACTS.md
docs/rules/VERSION_WORKFLOW.md
docs/rules/SCENARIO_CONVENTION.md

Scan supplémentaire des identifiants normatifs :

fichiers de règles : 10
rule ids détectés : 489
rule ids uniques : 488
collision : KSP-CONFIG-018 x2

Le dépôt stable ne contenait pas de contradiction de contenu entre ces deux règles, mais l'identifiant normatif n'était pas unique.

Preuve historique : deltas/0.1.3/pre.014.md définit explicitement l'inventaire .env.example comme KSP-CONFIG-018. La règle desktop est donc renumérotée KSP-CONFIG-019 dans pre.001 ; aucun texte de règle n'est affaibli ni supprimé.

7. Audit dépendances et frontières

Contrôlé statiquement :

21 crates = 21 workspace members
aucune version package explicite hors workspace inheritance
aucune edition crate divergente
ksp-worker-raw-transaction-ingest-lib dépend de ksp-onchain-transport-lib
Worker ne dépend pas de ksp-config-lib
Worker ne dépend pas de ksp-job-backfill-lib
Worker ne dépend pas de ksp-store-postgres-lib
Worker ne dépend pas directement de reqwest/tonic/yellowstone-grpc-proto
Store physique absent du Worker

La primitive solana-keypair présente dans ksp-wallet-lib est autorisée explicitement par DEP-SOL-004 et n'est pas une violation.

Résultat : aucune violation de dépendance stable identifiée par cet audit.

8. Handoff 0.3.12 vérifié

Sources lues :

docs/plans/033-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY_PLAN.md
docs/validation/029-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY.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/

Contrats stables confirmés :

une source Yellowstone caller-composed
hydratation getTransaction observed
coalescence network/signature/commitment
source_key opaque 32 bytes
observation key = domain + network + signature + source_key
admission centrale bounded mpsc
canonicalisation Common RAW avant Store
persistence atomique transaction + observation
processing frontier run-local
reconnect/replay/gap sans repair

9. Common RAW et Store vérifiés

ksp-raw-transaction-lib expose :

RawTransactionMaterial
canonicalize_raw_transaction
assemble_raw_transaction_acquisition
wire Legacy/V0/V1

ksp-store-api / ksp-store-lib exposent déjà deux capabilities distinctes utiles à la convergence :

persist_raw_transaction_acquisition(transaction, observation, Normal)
record_raw_transaction_observation(observation)

La seconde est explicitement conçue pour une observation supplémentaire d'une transaction déjà persistée sans resoumettre le payload canonique.

Conclusion : aucun changement Store API n'est requis par le design pre.001.

10. Transport WS/HTTP vérifié

Surface standard :

SolanaStandardWsSession::connect
logs_subscribe
block_subscribe
shared WsSession actor
reconnect/resubscribe Transport-owned

Surface Helius :

HeliusLaserStreamWsSession::connect
transaction_subscribe
shared WsSession actor
pas d'escape hatch générique
blockSubscribe volontairement non exposé sur Helius facade

Surface HTTP :

get_transaction_observed
get_block_observed
get_slot
get_blocks
get_blocks_with_limit

Conclusion : aucun nouveau client HTTP/WS ni nouvelle dépendance réseau n'est requis dans Worker.

11. Config/secrets vérifiés

config/std.transport.json contient les profils committed standard/public actuels. config/examples/std.transport.example.json démontre déjà les formes Helius LaserStream Mainnet/Devnet.

KSP_SECRET_HELIUS_API_KEY existe déjà dans l'inventaire .env.example et dans les contrats Config/tests concernés.

Conclusion pre.001 :

aucune nouvelle variable secret
aucun profil Config ajouté dans cette tranche
Config reste hors Worker
pre.005 décidera un profil committed seulement si un consumer/smoke concret le justifie

12. Audit externe courant

Consulté le 10 septembre 2026.

12.1 logsSubscribe

Solana confirme all, allWithVotes et mentions avec un seul pubkey par appel. La notification contient contexte/slot, signature, erreur et logs mais pas le RAW complet.

Décision : hydration obligatoire.

12.2 blockSubscribe

Solana maintient la méthode comme instable et conditionnée à l'activation validator. Commitment confirmed/finalized seulement.

Le guide Transaction V1 courant impose la préparation maxSupportedTransactionVersion = 1; sinon V1 peut provoquer -32015 en HTTP et block:null/stagnation côté blockSubscribe.

Décision : toutes les nouvelles requêtes transaction/block de 0.3.13 utilisent 1 lorsque la surface le permet. La qualification RAW-direct V1 reste test-gated en pre.004.

12.3 Helius

La référence Helius courante liste transactionSubscribe comme extension supportée et blockSubscribe parmi les méthodes instables non supportées sur LaserStream WSS.

Le pricing courant place transactionSubscribe à partir de Developer, pas sur Free.

Décision : aucun tier n'est codé ; smoke live conditionnel.

Sources :

https://solana.com/docs/rpc/websocket/logssubscribe
https://solana.com/docs/rpc/websocket/blocksubscribe
https://solana.com/docs/core/transactions/versioned-transactions
https://www.helius.dev/docs/api-reference/rpc/websocket-methods
https://www.helius.dev/pricing

13. Contrats de source fermés par pre.001

13.1 Yellowstone

input : channel/request + HTTP pool/role
output : reference signal + continuity
bound : Transport + global Worker queue
retry/reconnect : Transport
proof : non-regression 0.3.12

13.2 Standard logs

input : standard WS endpoint/filter/confirmed-or-finalized + HTTP pool/role
output : signature/slot reference signal
bound : WS notification queue + global Worker queue
retry/reconnect : Transport WS
hydration retry : Transport HTTP
proof : deterministic notification -> one observed getTransaction -> RAW golden

13.3 Standard block

input : standard WS + full/base64 + confirmed/finalized + maxVersion=1
output : complete material for qualified versions
bound : WS queue + global Worker queue
retry/reconnect : Transport WS
proof : RAW parity Legacy/V0, V1 dedicated fixture, block:null canary

13.4 Helius transaction

input : Helius WS + full/base64 + maxVersion=1 + HTTP pool/role
output : reference signal then hydration
bound : Transport Helius filters/queue + global Worker queue
retry/reconnect : Transport WS
hydration retry : Transport HTTP
proof : deterministic Helius notification -> RAW golden; live conditional

13.5 HTTP live polling

input : HTTP pool/roles + confirmed/finalized + polling settings
run bound : getSlot at source start; never scan lower slot
output : getBlock observed transactions
source timer owner : Worker
HTTP retry/rate-limit : Transport
proof : deterministic tip/skipped/null/stop tests

14. Bornes fermées

live sources : 1..32
source signal queue : settings.admission_queue_capacity()
pending signals global : <= settings.admission_queue_capacity()
hydration in-flight : <= settings.persistence_concurrency()
no provider-private unbounded Worker queue
HTTP poll interval : 100 ms .. 30 s, default 1 s
HTTP poll max blocks/cycle : 1 .. 1024, default 128

Ces bornes sont des décisions de plan à matérialiser/tester dans les prereleases techniques correspondantes ; elles ne sont pas encore une API de pre.001.

15. Convergence et observations

Décision : coalescence avant hydration par (network, signature, commitment) pour toutes les sources reference-only.

Une hydration peut servir plusieurs observation seeds. Après canonicalisation :

première observation : persistence atomique entity + observation
suivantes : record_raw_transaction_observation

Même identité/content identique : idempotent.

Même identité/content divergent : content conflict explicite et terminal.

16. Health/terminalité

L'inventaire de sources reste interne et borné. La projection publique future est source-neutral et agrège des counts d'états sans provider material.

Décision conservative : un Failed terminal d'une source configurée reste terminal pour le Worker en 0.3.13, car aucune preuve de coverage équivalent n'existe encore. Failover/degraded non-terminal appartient au gap-repair/coverage 0.3.14.

17. Sizing

Release maintenue avec :

pre.002 resources multi-source
pre.003 logs + hydration
pre.004 blockSubscribe
pre.005 Helius
pre.006 HTTP polling
pre.007 supervisor/inventory
pre.008 convergence/observations
pre.009 conflict/backpressure/fairness
pre.010 snapshot/health
pre.011 races/shutdown
pre.012 completeness/security
pre.013 gate technique/live
pre.014 documentation
pre.015 publication prep
rel.001 stable

Aucune responsabilité de fermeture n'est fusionnée.

18. Non-claims pre.001

pre.001 ne prétend pas :

avoir ajouté une source productive
avoir modifié le runtime Worker multi-source
avoir exécuté un smoke Helius
avoir prouvé blockSubscribe V1 en live
avoir exécuté cargo dans l'environnement d'assemblage
avoir implémenté gap repair/failover
avoir ajouté un profil Config Helius committed

19. Validation post-modification pre.001

Exécuté :

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), 828 file(s))

Résultat : PASS.

Exécuté :

supplemental normative rule-id scan
489 ids, 489 uniques, 0 duplicate

Résultat : PASS.

Comparaison exhaustive du working tree avec l'archive stable après suppression du cache Python généré par l'audit :

added : 3
  deltas/0.3.13/pre.001.md
  docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md
  docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md
modified : 2
  Cargo.toml
  docs/rules/RULES_KSP.md
deleted : 0
extra/unexpected : 0

Résultat : PASS.

Cargo post-modification reste NON EXÉCUTÉ LOCAL parce que le toolchain n'est pas disponible.

20. Gate opérateur requis avant pre.002

Après application du delta :

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
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

pre.002 ne doit pas commencer si cette livraison révèle une anomalie de règles/version/archive non corrigée.

21. Gate opérateur pre.001 reçu avant pre.002

Le journal opérateur du 10 septembre 2026 sur 0.3.13-pre.1 montre :

cargo fmt --all -- --check : PASS
General Rust rule audit : clean
Rust export completeness audit : 0 candidate
KSP workspace Rust rule audit : clean
Markdown table audit : clean (340 tables, 828 files)
cargo check --workspace : PASS
cargo clippy --workspace --all-targets --all-features -- -D warnings : PASS
cargo test -p ksp-worker-raw-transaction-ingest-lib : PASS
cargo tree Worker --edges normal : produit
cargo tree Worker -e features : produit
cargo tree --duplicates : produit

Suites Worker affichées :

unit : 66 pass
cross_layer_completeness : 4 pass
dependency_boundary : 9 pass
hardening : 16 pass
public_api : 9 pass
release_completeness : 4 pass
doc-tests : 0

Le gate pre.001 -> pre.002 est donc satisfait.

22. Implémentation pre.002

pre.002 ajoute dans le Worker :

MAX_RAW_TRANSACTION_INGEST_LIVE_SOURCES = 32
collection privée Vec<RawTransactionIngestLiveSource>
discriminant privé capability-owned : Yellowstone
source_count public source-neutral
try_push_yellowstone_source transactionnel
validation réseau globale
rejet duplicate logical source identity
rejet > 32
rejet cross-network

L'identité Yellowstone est calculée sans URL/credential/payload distant :

KSP source-key domain
source family = yellowstone
network
safe provider identity
safe endpoint identity
commitment
opaque deterministic Yellowstone Subscribe request identity
SHA-256 -> [u8; 32]

Le rôle/pool HTTP d'hydration n'entre volontairement pas dans cette identité : il qualifie la stratégie d'enrichissement d'un signal, pas l'identité de la source live Yellowstone. Deux subscriptions Yellowstone identiques ne peuvent donc pas contourner le rejet de doublon en changeant uniquement de rôle HTTP.

Transport fournit l'identité de requête sous YellowstoneSubscribeRequestIdentity : les sept familles de filtres sont encodées séparément dans l'ordre canonique des noms de BTreeMap, avec leur protobuf exact, puis les options communes sont encodées avec les maps vidées. Les bytes restent privés ; Debug n'expose que leur longueur et l'API ne fournit aucun getter des bytes.

Aucune nouvelle dépendance n'est ajoutée : Transport réutilise le prost réexporté par yellowstone-grpc-proto déjà présent.

23. Gate d'activation multi-source pre.002

Le modèle final 0.3.13 exige le démarrage simultané de toutes les sources configurées, mais le supervisor/source inventory appartient explicitement à pre.007.

Décision de sûreté pour pre.002 :

1 source Yellowstone : voie productive 0.3.12 conservée
2..32 sources validées : composition acceptée
start avec 2..32 sources : erreur stable avant spawn
aucun démarrage silencieux d'un sous-ensemble
aucune nouvelle famille de source productive

Condition d'erreur interne :

runtime_resources.multi_source_activation_pending

Cette barrière sera retirée uniquement lorsque pre.007 possédera le supervisor simultané et ses preuves de stop/fault/join.

24. Preuves déterministes ajoutées pre.002

Transport :

request identity stable malgré ordre d'insertion des filtres
request identity change si le contenu logique du filtre change
Debug de l'identité ne révèle pas les noms de filtres
surface publique identité disponible via crate root
absence de bytes/as_bytes escape hatch

Worker :

source_key stable pour même source logique
source_key change si request fingerprint ou endpoint-safe identity change
exactement 32 sources acceptées
33e source rejetée transactionnellement
duplicate logical identity rejeté
cross-network source rejetée
Debug runtime resources = source_count seulement
multi-source start fail-closed avant supervisor tranche
surface publique = bound + count + push capability-specific, sans source_key public

25. Validations locales post-modification pre.002

Le toolchain Cargo/Rustfmt reste indisponible dans l'environnement d'assemblage. Les validations Cargo ci-dessous devront donc être exécutées par l'opérateur avant pre.003 et ne sont pas déclarées PASS localement.

Résultat après toutes les modifications de la tranche :

General Rust rule audit : clean
Rust export completeness audit : 0 candidate
KSP workspace Rust rule audit : clean
Markdown table audit : clean (340 tables, 829 files)
normative rule definitions : 489 / 489 uniques / 0 duplicate definition id

26. Non-claims pre.002

pre.002 ne prétend pas :

avoir ajouté logsSubscribe productif
avoir ajouté blockSubscribe productif
avoir ajouté Helius transactionSubscribe productif
avoir ajouté HTTP block polling productif
avoir démarré plusieurs sources simultanément
avoir déplacé le coordinator Yellowstone vers le niveau Worker global
avoir implémenté observation fanout multi-source
avoir modifié Common RAW ou Store API
avoir ajouté une dépendance externe
avoir exécuté Cargo localement

27. Gate opérateur requis avant pre.003

Après application du delta :

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
cargo test -p ksp-onchain-transport-lib
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

pre.003 ne doit pas commencer si cette livraison révèle une anomalie de règles, API, version, archive ou dépendance non corrigée.

28. Gate opérateur pre.002-fix.001 reçu avant pre.003

Le correctif de format 0.3.13-pre.002-fix.001 a été validé par lopérateur après cargo clean :

cargo fmt --all                         : PASS
cargo fmt --all -- --check             : PASS, silencieux
General Rust rule audit                 : clean
Rust export completeness audit          : 0 candidate
KSP workspace Rust rule audit           : clean
Markdown table audit                    : clean (340 tables, 830 files)
cargo check --workspace                 : PASS
clippy workspace/all-targets/all-features -D warnings : PASS
ksp-onchain-transport-lib unit tests     : 389 pass
transport public_api                     : 52 pass
transport release_completeness           : 44 pass
transport doc-tests                      : 4 pass
live transport smokes                    : ignored opt-in, comme prévu
ksp-worker-raw-transaction-ingest-lib unit tests : 70 pass
cross_layer_completeness                 : 4 pass
dependency_boundary                      : 9 pass
hardening                                : 16 pass
public_api                               : 10 pass
release_completeness                     : 4 pass
worker doc-tests                         : 0

Le gate pre.002-fix.001 -> pre.003 est satisfait.

29. Implémentation pre.003 — Standard Logs + hydration

pre.003 ajoute RawTransactionIngestStandardLogsSource, construite exclusivement à partir de surfaces Transport déjà publiques :

WsEndpointSettings kind solana_standard
SolanaLogsSubscribeFilter
SolanaCommitment Confirmed ou Finalized
HttpTransportPool
HttpRoleName hydration

La construction reste sans I/O et valide avant spawn : endpoint/protocole, commitment, réseau, provenance sûre et existence dune route getTransaction compatible sur le même cluster. Aucun endpoint URL, filtre brut, credential ou client inférieur nest exposé par lAPI Worker.

Au runtime :

SolanaStandardWsSession::connect
    -> logs_subscribe
    -> context.slot + signature seulement
    -> coordinator dhydration Worker source-neutral
    -> get_transaction_observed
       encoding = base64
       maxSupportedTransactionVersion = 1
    -> Common RAW
    -> admission centrale existante
    -> Store

logs et err ne sont jamais copiés dans le signal Worker. Le reconnect, le resubscribe et le backpressure de la subscription restent possédés par le même acteur WebSocket Transport. Retry/reroutage/rate-limit HTTP restent possédés par Transport.

La voie Yellowstone réutilise le même contrat dhydration source-neutral et passe elle aussi à maxSupportedTransactionVersion = 1; aucune nouvelle queue, aucun second client HTTP et aucun acteur WebSocket Worker ne sont introduits.

30. Identité et bornes pre.003

Lidentité logique Standard Logs est déterministe et opaque :

domain KSP live source key
family = standard_logs
network
safe provider identity
safe endpoint identity
commitment
private filter fingerprint
SHA-256 -> [u8; 32]

Le rôle/pool HTTP dhydration est volontairement exclu de lidentité live. Les trois variantes All, AllWithVotes, Mentions(pubkey) produisent des empreintes distinctes ; la valeur dun pubkey Mentions napparaît pas dans Debug.

Les bornes du coordinator sont maintenant alignées sur les settings effectifs :

in-flight hydration <= persistence_concurrency
pending source signals <= admission_queue_capacity

Une activation mono-source Yellowstone ou Standard Logs est autorisée. Une composition 2..32 reste validable mais son démarrage demeure runtime_resources.multi_source_activation_pending avant spawn jusquà pre.007.

31. Preuves déterministes ajoutées pre.003

Worker unit tests ajoutés :

validation protocole/commitment/route HTTP Standard Logs
source_key filter-sensitive et hydration-role-neutral
redaction Mentions/URL/source-key bytes
projection reference-only slot/signature
fixture logs -> une hydration HTTP -> exact matériau Common RAW
requête getTransaction = base64 + maxSupportedTransactionVersion 1
rejet duplicate Standard Logs identity

Canaris externes ajoutés/étendus :

public_api : construction et composition Standard Logs depuis crate root
dependency_boundary : Transport facade only, sans Config/Job/backend/direct network crate
hardening : aucune copie logs/err/payload/url, Debug borné
release_completeness : nouvelle surface et nouveaux canaris obligatoires

Les preuves de reconnect/resubscribe/backpressure restent celles de ksp-onchain-transport-lib, car le Worker délègue ces mécanismes au SolanaStandardWsSession existant plutôt que de les réimplémenter.

32. Validations locales post-modification pre.003

Le toolchain Cargo/Rustfmt nest pas disponible dans lenvironnement dassemblage. Les commandes Cargo post-pre.003 sont donc NON EXÉCUTÉ LOCAL et devront être confirmées par lopérateur.

Les audits statiques réellement exécutés sont consignés dans deltas/0.3.13/pre.003.md.

33. Non-claims pre.003

pre.003 ne prétend pas :

avoir ajouté blockSubscribe productif
avoir ajouté Helius transactionSubscribe productif
avoir ajouté HTTP live polling
avoir activé plusieurs sources simultanément
avoir implémenté le fanout dobservations Store multi-source
avoir rendu le coordinator partagé entre plusieurs tâches source simultanées
avoir ajouté du gap repair ou du backfill
avoir ajouté une dépendance réseau directe au Worker
avoir exécuté Cargo localement après modification

34. Gate opérateur requis avant pre.004

Après application du delta :

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
cargo test -p ksp-onchain-transport-lib
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

pre.004 ne doit pas commencer si une anomalie de format, règle, compilation, API, dépendance ou test apparaît.

35. Gate opérateur pre.003-fix.003 reçu avant pre.004

Le gate fourni par l'opérateur sur 0.3.13-pre.3.fix.3 est vert pour toutes les commandes exécutées :

cargo fmt --all                         : PASS
cargo fmt --all -- --check             : PASS, silencieux
General Rust rule audit                 : clean
Rust export completeness audit          : 0 candidate
KSP workspace Rust rule audit           : clean
Markdown table audit                    : clean (340 tables, 834 files)
cargo check --workspace                 : PASS
clippy workspace/all-targets/all-features -D warnings : PASS
ksp-worker-raw-transaction-ingest-lib unit tests : 75 pass
cross_layer_completeness                 : 4 pass
dependency_boundary                      : 10 pass
hardening                                : 17 pass
public_api                               : 11 pass
release_completeness                     : 4 pass
worker doc-tests                         : 0

Cette exécution ne contenait pas cargo test -p ksp-onchain-transport-lib ni les commandes cargo tree; aucune nouvelle affirmation n'est ajoutée pour ces commandes. Le gate Worker demandé après pre.003-fix.003 est satisfait.

36. Implémentation pre.004 — Standard Block RAW-direct

pre.004 ajoute RawTransactionIngestStandardBlockSource à l'agrégat runtime existant. La construction reste sans I/O et exige :

WsEndpointSettings kind solana_standard
SolanaBlockSubscribeFilter
SolanaCommitment Confirmed ou Finalized

Au runtime, la source réutilise SolanaStandardWsSession::connect et block_subscribe avec :

encoding = Base64
transactionDetails = Full
maxSupportedTransactionVersion = 1
showRewards = false

Aucun HttpTransportPool, aucun getBlock HTTP et aucun second acteur WebSocket ne sont ajoutés à cette source.

37. Qualification RAW-direct et sûreté block:null

La projection accepte uniquement des versions explicitement qualifiées :

Legacy -> RawTransactionVersion::Legacy
0      -> RawTransactionVersion::Number(0)
1      -> RawTransactionVersion::Number(1)
>1     -> source.standard_block_transaction_version_unsupported
omise/null -> source.standard_block_transaction_version_unqualified

Le matériau Common RAW direct est construit à partir du wire Base64 de chaque transaction avec signature embarquée, slot, blockTime, meta, version et index de transaction. La fixture V1 locale sérialise un vrai RawSolanaTransactionMessage::V1 par les types publics de ksp-raw-transaction-lib avant projection ; la tranche ne déduit donc pas V1 d'une simple étiquette.

Les gardes suivantes sont fail-closed avant progression de frontier :

context.slot != notification.slot
notification.err != null
block == null
transactions omitted/null
transaction non Base64
version omise/null/>1
signature embarquée invalide
index usize non représentable en u32

block: null n'est jamais traité comme bloc vide ou slot settled. Pour un bloc non vide, le slot n'est enregistré settled qu'après l'admission réussie de toutes ses transactions. La voie directe ne détourne pas hydration_pending; un arrêt ou une faute au milieu du bloc ne produit aucune progression transitoire.

38. Identité, redaction et composition pre.004

La clé logique Standard Block est dérivée de :

domain KSP live source key
family = standard_block
network
safe provider identity
safe endpoint identity
commitment
private block-filter fingerprint
SHA-256 -> [u8; 32]

Debug n'expose que des identités sûres, le type de filtre et les longueurs d'empreinte/clé. Un pubkey de MentionsAccountOrProgram n'est pas recopié. L'agrégat public gagne from_standard_block_source et try_push_standard_block_source avec les mêmes bornes 1..32, invariant réseau unique et rejet transactionnel des doublons.

Une seule source reste productivement activable. Une collection 2..32 demeure runtime_resources.multi_source_activation_pending avant spawn jusqu'à pre.007.

39. Preuves déterministes ajoutées pre.004

Worker unit tests ajoutés couvrent :

validation protocol/commitment Standard Block
source_key stable, filter-sensitive et redacted
qualification exacte Legacy/V0/V1
rejet version omise/null/>1
fixture V1 wire -> matériau Common RAW direct exact
rejet duplicate Standard Block identity

Canaris externes ajoutés/étendus :

public_api : construction et composition Standard Block depuis crate root
dependency_boundary : façade Transport uniquement, sans getBlock HTTP/direct network crate
hardening : block:null/version/encoding/redaction explicites
release_completeness : export et canaris pre.004 obligatoires

40. Validations locales post-modification pre.004

Le toolchain Cargo/Rustfmt reste indisponible dans l'environnement d'assemblage. Les commandes Cargo post-pre.004 sont donc NON EXÉCUTÉ LOCAL; seuls les audits statiques effectivement lancés sont déclarés PASS dans le delta de livraison.

41. Non-claims pre.004

pre.004 ne prétend pas :

avoir ajouté Helius transactionSubscribe productif
avoir ajouté HTTP live polling
avoir activé plusieurs sources simultanément
avoir implémenté le fanout d'observations Store multi-source
avoir ajouté un fallback HTTP getBlock/getTransaction à Standard Block
avoir étendu le RAW-direct à une version >1 ou ambiguë
avoir transformé block:null en progression
avoir ajouté une dépendance réseau directe au Worker
avoir exécuté Cargo localement après modification

42. Gate opérateur requis avant pre.005

Après application du delta :

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
cargo test -p ksp-onchain-transport-lib
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

pre.005 ne doit pas commencer si une anomalie de format, règle, compilation, API, dépendance ou test apparaît.

43. Gate opérateur pre.004-fix.001

Preuve reçue le 10 septembre 2026 :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 836 files
cargo check --workspace : PASS
clippy workspace all-targets all-features -D warnings : PASS
worker unit : 79/79 PASS
cross-layer : 4/4 PASS
dependency boundary : 11/11 PASS
hardening : 18/18 PASS
public API : 12/12 PASS
release completeness : 4/4 PASS

44. Surface pre.005 matérialisée

RawTransactionIngestHeliusTransactionSource
RawTransactionIngestRuntimeResources::from_helius_transaction_source
RawTransactionIngestRuntimeResources::try_push_helius_transaction_source
HeliusLaserStreamWsSession::connect
HeliusLaserStreamWsSession::transaction_subscribe
HeliusTransactionSubscribeOptions Full/Base64/maxV1/showRewards=false
project_helius_transaction_signal
hydration source-neutral get_transaction_observed

Aucun changement Config/Transport/manifeste de crate n'est requis.

45. Contrats Helius vérifiés statiquement

La tranche exige :

protocol = helius_laserstream
commitment = confirmed | finalized
HTTP hydration route = get_transaction sur même réseau
notification productive = Full uniquement
signal Worker = signature + slot + transactionIndex + route/filter safe identity
nested transaction payload = non copié
protocol de provenance convergée = helius_ws_http
acquisition method = transaction_get_transaction

La source key inclut le filtre complet sous empreinte SHA-256 privée, avec normalisation de l'ordre des listes de pubkeys. Le rôle d'hydration n'entre pas dans l'identité live.

46. Config, secret et tier

Les profils Helius LaserStream Mainnet/Devnet et KSP_SECRET_HELIUS_API_KEY existaient avant pre.005. Le Worker reçoit seulement WsEndpointSettings déjà résolu et ne dépend jamais de Config. Aucun tier provider, prix, quota ou entitlement n'est codé ; l'éligibilité réelle d'un compte Helius reste une propriété externe/live.

47. Preuves unitaires et externes attendues

unit : request fixed Full/Base64/maxV1/showRewards=false
unit : protocol/commitment/cross-network hydration rejection
unit : source key stable/filter-sensitive/order-normalized/redacted
unit : Full reference projection signature/slot/index only
unit : reference -> HTTP getTransaction -> Common RAW exact
unit : duplicate Helius source rejected transactionally
public_api : root constructor/from/push typed
boundary : facade Helius + one common getTransaction only
hardening : nested payload/secret/tier absent
release : export inventory + canaries pre.005

48. Validation locale d'assemblage pre.005

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL; seuls les audits statiques effectivement exécutés peuvent être déclarés PASS dans le delta.

49. Non-claims pre.005

pas de multi-source simultané avant pre.007
pas de HTTP live polling avant pre.006
pas de RAW-direct depuis le nested payload Helius
pas de SDK Helius
pas de secret/Config dans le Worker
pas de tier/quota provider codé
pas de nouveau profil Config
pas de changement Transport

50. Gate opérateur requis avant pre.006

cargo fmt --all
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
cargo test -p ksp-onchain-transport-lib
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

51. Gate opérateur pre.005-fix.001 reçu

Preuve communiquée le 10 septembre 2026 :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 838 files
cargo check --workspace : PASS
clippy workspace all-targets all-features -D warnings : PASS
worker unit : 84/84 PASS
cross-layer : 4/4 PASS
dependency boundary : 12/12 PASS
hardening : 19/19 PASS
public API : 13/13 PASS
release completeness : 4/4 PASS

52. Surface pre.006 matérialisée

RawTransactionIngestHttpBlockPollingSource
RawTransactionIngestRuntimeResources::from_http_block_polling_source
RawTransactionIngestRuntimeResources::try_push_http_block_polling_source
getSlot(commitment) au démarrage et à chaque cycle
getBlocksWithLimit(next_scan_slot, bounded_limit, commitment)
getBlock observed sur les slots listés
Full/Base64/maxV1/rewards=false
RAW-direct Legacy/V0/V1
timer Worker stop-preemptible

Aucun manifeste de crate ni aucune dépendance Transport/Config supplémentaire n'est requis.

53. Invariants statiques vérifiés pre.006

La tranche encode explicitement :

start_slot = premier getSlot du run
next_scan_slot initial = start_slot
aucune découverte avant next_scan_slot
découverte strictement croissante
getBlock=null sur slot listé => next_scan_slot reste ce slot
skipped slot non listé => pas de faux gap
slot settled seulement après admission de tout le bloc
aucun hydration_pending pour la voie RAW-direct
version Legacy/V0/V1 qualifiée, ambiguë/>1 rejetée
provenance endpoint/provider réellement observé sur getBlock
source_key indépendant du poll interval et du batch size

Les anciens canaris de 0.3.12 qui interdisaient globalement get_block_observed/tokio::time::sleep ont été resserrés plutôt que supprimés : le coordinator d'hydration continue de ne posséder ni polling ni retry, tandis que ces primitives sont explicitement permises et bornées dans la seule source HTTP polling.

54. Validation locale d'assemblage pre.006

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent donc NON EXÉCUTÉ LOCAL. Les audits statiques exécutés sur l'état final sont consignés dans le delta pre.006.

55. Non-claims pre.006

pas de scan historique avant le start_slot du run
pas de checkpoint durable de polling
pas de Backfill implicite
pas de multi-source simultané avant pre.007
pas de retry/backoff HTTP implémenté dans le Worker
pas de client reqwest direct
pas de Config lu dans le Worker
pas de version transaction >1 ou ambiguë acceptée
pas de getBlock=null assimilé à un slot vide

56. Gate opérateur requis avant pre.007

cargo fmt --all
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
cargo test -p ksp-onchain-transport-lib
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

57. Gate opérateur pre.006-fix.001 reçu

Preuve communiquée le 10 septembre 2026 sur les commandes exécutées :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 840 files
cargo check --workspace : PASS
clippy workspace all-targets all-features -D warnings : PASS
worker unit : 88/88 PASS
cross-layer : 4/4 PASS
dependency boundary : 13/13 PASS
hardening : 20/20 PASS
public API : 14/14 PASS
release completeness : 4/4 PASS

Les sorties Transport ciblées et cargo tree demandées dans le gate complet ne figurent pas dans le log reçu et ne sont donc pas déclarées PASS.

58. Surface pre.007 matérialisée

RawTransactionIngestRuntimeResources::run_live_sources
RawTransactionIngestSourceInventory privé
RawTransactionIngestSourceInventoryPublisher privé
JoinSet privé 1..32 sources
stop fanout privé
drain/join de toutes les sources
projection processing frontier agrégée
suppression de multi_source_activation_pending

Aucune nouvelle API publique n'est nécessaire : les méthodes from_*, try_push_*, source_count et start_with_runtime_resources existantes suffisent à composer puis lancer plusieurs sources.

59. Invariants supervisor/source inventory vérifiés statiquement

La tranche exige :

1..32 sources validées avant run
toutes les sources présentes sont spawnees
aucun sous-ensemble silencieux
aucune politique primary/standby/fallback
une source fautive arrête les autres et le supervisor les join
une fermeture source avant stop est terminale
source_key reste privée
inventaire borné initialisé depuis les source_key validées
frontier globale conservatrice = minimum seulement si toutes les sources ont une frontier
oldest pending global = minimum
état source agrégé sans provider material

Les tests déterministes ajoutés utilisent des tasks factices pour prouver le join de trois sources au stop et le stop/join d'une sœur après faute, sans I/O réseau.

60. Validation locale d'assemblage pre.007

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL; seuls les audits statiques effectivement exécutés sont déclarés PASS dans le delta.

61. Non-claims pre.007

pas de coalescence cross-source complète avant pre.008
pas d'unique hydration globale cross-source garantie avant pre.008
pas d'observations Store multiples convergées avant pre.008
pas de fairness duplicate-storm fermée avant pre.009
pas de nouveaux compteurs/health publics multi-source avant pre.010
pas de failover/degraded non-terminal d'une source
pas de preuve de coverage entre sources

62. Gate opérateur requis avant pre.008

cargo fmt --all
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
cargo test -p ksp-onchain-transport-lib
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

63. Gate opérateur pre.007 reçu

Preuve communiquée le 10 septembre 2026 : fmt PASS, audits Rust clean/export completeness 0, Markdown clean 340/841, cargo check --workspace PASS, Clippy strict PASS, Worker 90/90 unit, 4/4 cross-layer, 14/14 dependency-boundary, 21/21 hardening, 15/15 public-api, 4/4 release-completeness et 0 doc-test. Le log fourni ne contient pas les sorties Transport ciblées ni les trois cargo tree.

64. Surface pre.008 matérialisée

RawTransactionIngestGlobalHydrationRegistry privé
coalescence globale (network, signature, commitment)
leader unique getTransaction observed
résultat partagé par watch borné/retiré
RawTransactionIngestPersistenceConvergence privé
clé canonique (network, signature)
hash canonique conflict-checked
première persistence atomique entity + observation
observations suivantes via record_raw_transaction_observation
RawObservationKey source-distincte et idempotente

65. Invariants pre.008

aucun fanout HTTP pour une même clé d'hydration simultanée
aucune fusion des identités de source dans l'API publique
une identité RAW canonique n'est pas dupliquée par source
hash divergent pour même network/signature => content conflict terminal
observation source différente => observation durable supplémentaire
replay même observation => AlreadyPresent sans réécriture RAW
registre hydration <= admission_queue_capacity
cache persistence runtime <= max(admission_queue_capacity, persistence_concurrency)
aucun backend Store physique ni client HTTP direct dans Worker

66. Validation locale d'assemblage pre.008

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL; les audits statiques et contrôles de packaging sont consignés dans le delta pre.008.

67. Non-claims pre.008

pas encore de fairness adversariale complète avant pre.009
pas encore de canari starvation/duplicate storm cross-source complet avant pre.009
pas de failover provider implicite
pas de préférence silencieuse entre sources divergentes
pas de nouveaux compteurs/health publics multi-source avant pre.010

68. Gate complet pre.008-fix.002 reçu

Le 10 septembre 2026, le gate Worker puis son complément Transport/graphe ont été fournis et sont verts pour toutes les commandes exécutées :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 844 files
cargo check --workspace : PASS
clippy strict : PASS
Worker : 94 unit + 4 cross-layer + 15 dependency-boundary + 22 hardening + 16 public-api + 4 release-completeness, 0 échec
Transport : 389 unit + 52 public-api + 44 release-completeness + 4 doc-tests, 0 échec
smokes Transport live opt-in : 5 ignored comme prévu
cargo tree worker normal/features : exécutés sans erreur
cargo tree --duplicates : exécuté sans erreur et liste les doublons existants du workspace

Aucun smoke live ignoré n'est requalifié en preuve réseau réelle.

69. Surface pre.009 matérialisée

validate_hydration_fairness_capacity privé
hydration_pending_limit privé
hydration_in_flight_limit privé
quotas statiques par source reference-bearing
RawTransactionIngestGlobalHydrationRegistry max_pending exact
sémaphore global hydration
RawTransactionIngestHydrationLeaderGuard privé
RawTransactionIngestCanonicalState privé
comparaison slot/block_time/format/hash avant observation additionnelle

Aucune API publique ni dépendance supplémentaire n'est requise.

70. Invariants globaux pre.009

Pour une composition productive valide :

hydration_source_count <= admission_queue_capacity
hydration_source_count <= persistence_concurrency
somme quotas pending = admission_queue_capacity
somme quotas hydration tasks = persistence_concurrency
quota de chaque source reference-bearing >= 1
global registry distinct keys <= admission_queue_capacity
HTTP leader effectivement ouvert <= persistence_concurrency
source count <= 32

Une composition sous-provisionnée échoue avant spawn. Il n'existe aucune extension silencieuse des bornes configurées, aucune queue provider privée et aucune unbounded_channel.

71. Duplicate storm, fairness et cleanup

Les tests déterministes ajoutés vérifient :

32 subscriptions identiques -> une seule entrée/leader global
clés distinctes au-delà de max_pending -> runtime_invalid sûr
sémaphore capacité 1 -> seconde acquisition simultanée refusée
leader guard droppé -> follower reçoit Failed et la clé peut redevenir leader
queue admission capacité 1 -> une seconde source déjà prête n'est pas affamée par la répétition d'une storm

Le test de fairness ne revendique ni priorité métier ni scheduler pondéré. Il vérifie le comportement minimal attendu du canal borné commun et les quotas réservent une capacité aux autres sources reference-bearing.

72. Disagreement/content conflict pre.009

Pour une même identité (network, signature), le cache run-local compare maintenant :

slot
block_time
format_id
format_version
content_hash

Les cas slot divergent, block time divergent et contenu/hash divergent sont testés comme content conflicts terminaux avant record_raw_transaction_observation. Le Store reste l'autorité durable finale et aucune politique de majority vote, provider priority, preferred provider ou overwrite conflict n'est admise.

73. Canaris externes pre.009

Les suites externes sont étendues pour verrouiller :

dependency-boundary : bornes/fairness restent dans Worker + façades existantes
hardening : quotas, sémaphore, cleanup, disagreement et absence de provider preference
public-api : registry, leader guard, quotas et canonical state restent privés
release-completeness : présence obligatoire des trois nouveaux canaris

74. Validation locale d'assemblage pre.009

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL; seules les validations statiques effectivement exécutées et les contrôles de packaging pourront être déclarés PASS dans le delta.

75. Non-claims pre.009

pas de nouveaux compteurs/health publics avant pre.010
pas de QoS/scheduler pondéré
pas de failover provider implicite
pas de source primary/standby
pas de majority vote
pas de préférence provider/tier
pas de overwrite d'un conflit canonique
pas de preuve live réseau nouvelle

76. Gate opérateur requis avant pre.010

cargo fmt --all
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
cargo test -p ksp-onchain-transport-lib
cargo test -p ksp-worker-raw-transaction-ingest-lib

Aucun cargo tree n'est requis pour ce gate : pre.009 ne modifie ni dépendance ni feature. Les graphes seront réaudités si le graphe change ou à la fermeture technique de 0.3.13.

77. Gate complet pre.009-fix.002 reçu

Preuve opérateur du 10 septembre 2026 :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 847 files
cargo check --workspace : PASS
clippy strict : PASS
Transport : 389 unit + 52 public-api + 44 release-completeness + 4 doc-tests, 0 échec
smokes Transport live opt-in : 5 ignored comme prévu
Worker : 99 unit + 4 cross-layer + 16 dependency-boundary + 23 hardening + 17 public-api + 4 release-completeness, 0 échec
Worker doc-tests : 0

Aucun cargo tree n'est revendiqué pour ce gate.

78. Surface pre.010 matérialisée

RawTransactionIngestSnapshot::source_total
RawTransactionIngestSnapshot::source_active
RawTransactionIngestSnapshot::source_reconnecting
RawTransactionIngestSnapshot::source_failed
projection privée with_source_counts
inventaire privé -> comptes source-neutral
source_total initialisé depuis RawTransactionIngestRuntimeResources::source_count
health commune conservative

Les informations par source restent dans l'inventaire privé; le snapshot public ne contient aucune source_key ni information provider/endpoint/filter.

79. Invariants health/activity pre.010

Running + source_failed > 0 -> Unhealthy
Running + source_reconnecting > 0 -> Degraded
Running + source_total > 0 + source_active < source_total -> Degraded
Running + toutes sources attendues Active -> Healthy
Faulted -> Unhealthy
Stopping/Stopped -> dernière health qualifiée

WorkerActivity::Active continue à représenter du travail concret ou un reconnect/closing, pas simplement l'existence d'une source ouverte.

80. Non-claims pre.010

pas de snapshot public par source
pas de provider health/tier/endpoint public
pas de failover ou coverage inference
pas de changement des quotas/fairness pre.009
pas de changement de convergence persistence
pas encore de fermeture exhaustive des races/shutdown pre.011
pas de nouvelle dépendance/feature

81. Validation locale d'assemblage et gate avant pre.011

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL.

Gate opérateur demandé :

cargo fmt --all
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
cargo test -p ksp-worker-raw-transaction-ingest-lib

82. Gate complet pre.010 reçu

Preuve opérateur du 10 septembre 2026 :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 848 files
cargo check --workspace : PASS
clippy strict : PASS
Worker : 100 unit + 4 cross-layer + 17 dependency-boundary + 24 hardening + 18 public-api + 4 release-completeness, 0 échec
Worker doc-tests : 0

Le Transport n'était pas modifié par pre.010 et n'a pas été rejoué. Aucun cargo tree n'est revendiqué.

83. Durcissement races/shutdown pre.011 matérialisé

La tranche ferme les transitions concurrentes suivantes sans changer les frontières de couche :

stop vs source fault
abort supervisor vs enfants source imbriqués
abort leader hydration vs followers
publication hydration vs arrivée d'un nouveau leader
shutdown deadline vs persistence bloquée
counter exhaustion vs remapping générique source_failed
publication inventaire vs identité/index incohérent

publish_and_remove notifie les followers sous le mutex de registry avant de retirer la clé. Le retrait rend ensuite seulement la clé disponible à une nouvelle génération de leader. Le Drop du leader guard reste le chemin fail-closed pour un leader aborté avant publication normale.

84. Agrégation et terminalité vérifiées pre.011

L'inventaire agrégé utilise désormais checked_add pour hydration_pending, source_reconnect_total, source_replay_attempt_total et source_continuity_gap_total. Aucun clamp par saturating_add n'est admis dans cette agrégation.

Un overflow devient worker_raw_transaction_ingest.counter_exhausted. Ce code est préservé par le supervisor lorsqu'il provient d'une source, au lieu d'être converti en worker_raw_transaction_ingest.source_failed.

Les mises à jour d'inventaire invalides échouent explicitement sur des codes internes stables :

source.inventory_entry_missing
source.inventory_key_mismatch
source.inventory_projection_missing

Aucune valeur source/provider n'est recopiée dans l'erreur.

85. Preuves unitaires et externes pre.011

Les tests ajoutés prouvent :

stale identity/index inventaire rejetés
counter overflow agrégé détecté
leader hydration aborté -> follower réveillé + registry nettoyée
abort du supervisor source -> enfant imbriqué détruit
stop et fault simultanés -> fault non masquée et sibling rejoint
drain timeout -> persistence abortée/jointe et aucune complétion tardive
terminal counter_exhausted retenu après source completion

Les canaris dependency_boundary, hardening, public_api et release_completeness verrouillent l'ownership, l'ordre terminal, l'atomicité notification/retrait, l'absence de unbounded_channel, l'absence de backend/client direct et l'absence de nouvelle surface publique d'identité source.

86. Non-claims pre.011

pas de changement Transport
pas de nouvelle dépendance/feature
pas de retry/failover supplémentaire
pas de politique de réparation historique
pas de changement convergence/fairness
pas de nouvelle surface snapshot publique
pas encore de completeness/security cross-layer exhaustive pre.012
pas encore de gate technique/live pre.013

87. Validation locale d'assemblage et gate avant pre.012

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-modification restent NON EXÉCUTÉ LOCAL.

Gate opérateur demandé :

cargo fmt --all
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
cargo test -p ksp-worker-raw-transaction-ingest-lib

Aucun cargo tree n'est requis et le Transport n'a pas besoin d'être rejoué pour cette tranche qui ne modifie ni le graphe ni ksp-onchain-transport-lib.

88. Gate complet pre.011 reçu

Preuve opérateur du 10 septembre 2026 :

fmt : PASS
audits Rust : clean / export completeness 0
Markdown : clean, 340 tables / 849 files
cargo check --workspace : PASS
clippy strict : PASS
Worker : 106 unit + 4 cross-layer + 18 dependency-boundary + 25 hardening + 19 public-api + 4 release-completeness, 0 échec
Worker doc-tests : 0

Le Transport et les graphes n'étaient pas requis pour ce gate intermédiaire et ne sont pas revendiqués.

89. Matrice cross-layer pre.012

La suite cross_layer_completeness ajoute quatre canaris de fermeture :

all_five_live_source_families_share_one_worker_common_raw_store_pipeline
legacy_v0_v1_is_proven_from_transport_through_worker_common_raw_to_store
yellowstone_non_regression_covers_identity_v1_reconnect_gap_and_worker_hydration
security_redaction_matrix_covers_all_live_sources_and_lower_layers

La matrice vérifie explicitement les façades Transport HTTP/WS/gRPC, les cinq discriminants de sources Worker, la convergence/hydration/persistence communes, les types Common RAW, puis les bridges Store persist_raw_transaction_acquisition et record_raw_transaction_observation.

90. Legacy/V0/V1 et Yellowstone

La fermeture Legacy/V0/V1 vérifie simultanément :

Yellowstone Transport conserve le matériau V1
getBlock/getTransaction restent version-aware jusqu'à maxSupportedTransactionVersion = 1
Standard Block et HTTP Polling qualifient Legacy/V0/V1
Common RAW conserve les goldens Legacy/V0/V1 et le hash canonique V1
Worker transmet slot/block_time/format_id/format_version/content_hash vers la convergence Store
Store conserve le payload RAW de manière opaque avec entity + observations

La non-régression Yellowstone vérifie séparément request identity opaque, Transaction/TransactionStatus/Block, reconnect/replay, retention gap, hydration observée et coalescence globale Worker.

91. Security et absence d'élargissement

Les canaris de fermeture prouvent :

graphe Worker normal inchangé
aucun module d'implémentation public
aucune source_key/registry/canonical state publique
redaction Yellowstone/Helius/Standard sources
redaction Common RAW
redaction Store API / Store / PostgreSQL backend
aucune dépendance réseau/backend directe ajoutée au Worker

pre.012 est donc test/documentation-only hors bump mécanique de prerelease.

92. Gate technique/live avant pre.013

Le toolchain Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage ; aucun résultat Cargo post-modification n'est revendiqué localement.

Le gate de pre.013 est volontairement le gate de fermeture technique : workspace complet, Clippy strict, tests all-targets/all-features, graphes et duplicates. Les smokes live accessibles y sont exécutés ; les autres sont qualifiés NON EXÉCUTÉ.