Files
khadhroony-solana-project/docs/validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md
2026-08-25 21:00:19 +02:00

53 KiB
Raw Blame History

Validation 0.2.8 — Helius LaserStream WebSocket

Statut : matrice finale validée de la release stable 0.2.8. pre.011 est entièrement vert : 335/335 unit Transport, 41/41 API, 34/34 completeness, 4/4 doctests et workspace complet. Les audits Cargo tree finaux de pre.010 restent valides ; rel.001 ne change aucun runtime ni dépendance.

1. Références

prompt                     prompts/013-V0_2_8_START_PROMPT.md
plan                       docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md
base stable                v0.2.7 / deltas/0.2.7/rel.001.md
pre.001                    deltas/0.2.8/pre.001.md
fix architecture           deltas/0.2.8/pre.001-fix.001.md
fix forecast/nomenclature  deltas/0.2.8/pre.001-fix.002.md
pre.002                     deltas/0.2.8/pre.002.md
pre.002 Clippy/docs fix     deltas/0.2.8/pre.002-fix.001.md
pre.003                     deltas/0.2.8/pre.003.md
pre.004                     deltas/0.2.8/pre.004.md
pre.004 redaction/devnet fix deltas/0.2.8/pre.004-fix.001.md
pre.004 provenance fix       deltas/0.2.8/pre.004-fix.002.md
pre.005                     deltas/0.2.8/pre.005.md
pre.005 visibility/test fix     deltas/0.2.8/pre.005-fix.001.md
pre.005 dead-code fix           deltas/0.2.8/pre.005-fix.002.md
pre.006 actor transaction        deltas/0.2.8/pre.006.md
pre.007 heartbeat Helius           deltas/0.2.8/pre.007.md
pre.007 test determinism fix        deltas/0.2.8/pre.007-fix.001.md
pre.007 scheduler observation fix    deltas/0.2.8/pre.007-fix.002.md
pre.007 paused-I/O observation fix    deltas/0.2.8/pre.007-fix.003.md
pre.007 dependency-firewall fix        deltas/0.2.8/pre.007-fix.004.md
pre.008 adversarial/compliance guard      deltas/0.2.8/pre.008.md
pre.009 compliance provider/current         deltas/0.2.8/pre.009.md
pre.010 docs/smoke/tree final                 deltas/0.2.8/pre.010.md
pre.011 candidate/prompt                    deltas/0.2.8/pre.011.md
rel.001 publication stable                deltas/0.2.8/rel.001.md
validation standard WS     docs/validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md
HTTP compliance            docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
KSP-TRANSPORT-007          docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md

Audit Helius initial : 2026-08-23.

2. Gate pre.001 fermé

Baseline opérateur acquise :

cargo fmt --all                               OK
python3 scripts/audit_rust_workspace_rules.py clean
cargo check --workspace                       OK
cargo clippy --workspace --all-targets        OK
cargo test --workspace                        OK

Graphes requis reçus :

cargo tree -p ksp-onchain-transport-lib               OK / inspecté
cargo tree -p ksp-onchain-transport-lib --duplicates  OK / inspecté

Versions résolues observées :

futures-util       0.3.34
tokio              1.53.1
tokio-tungstenite  0.30.0
reqwest             0.13.4

Doublons ciblés visibles :

syn            2.0.119 / 3.0.3
webpki-roots   0.26.11 / 1.0.9

Verdict : doublons transitifs, aucune nouvelle dépendance Helius, aucune anomalie bloquante du gate.

2.1 Checklist de fermeture pre.001

[x] base stable inspectée
[x] baseline opérateur disponible
[x] sources Helius courantes relues
[x] terminologie/endpoints/auth clarifiés
[x] surface standard supportée/non supportée inventoriée
[x] transactionSubscribe/unsubscribe inventoriés
[x] tokenAccounts inventorié
[x] notifyOn classé deprecated/no-op
[x] divergence slotsUpdates enregistrée et arbitrée explicitement
[x] architecture corrigée : surfaces protocolaires séparées
[x] moteur WsSession/actor unique préservé
[x] stratégie de compatibilité WsSession 0.2.7 définie
[x] heartbeat ownership décidé
[x] Config shape décidée
[x] credential strategy décidée
[x] aucune nouvelle dépendance justifiée
[x] forecast recalibré au format compact historique et fixes groupés sous `pre.001`
[x] namespace `helius_laserstream` explicitement WebSocket-owned
[x] futur LaserStream gRPC maintenu distinct et hors contrat WS
[x] cargo tree direct exécuté par opérateur
[x] cargo tree duplicates exécuté par opérateur
[x] doublons ciblés analysés comme transitifs/non bloquants

Verdict : gate 0.2.8-pre.001 positif ; pre.002 + fix.001 et pre.003 sont entièrement verts et fermés. pre.004 est ouvert.

3. Matrice provider normative

Capability Standard KSP Helius doc actuelle Décision 0.2.8 Surface Helius attendue Preuve finale attendue
accountSubscribe pair oui supporté réutiliser wire standard présente exact wire + no regression
logsSubscribe pair oui supporté réutiliser wire standard présente exact wire + no regression
programSubscribe pair oui supporté réutiliser wire standard présente exact wire + no regression
rootSubscribe pair oui supporté réutiliser standard présente exact wire + no regression
signatureSubscribe pair oui supporté réutiliser standard présente one-shot conservé
slotSubscribe pair oui supporté réutiliser standard présente exact wire + no regression
blockSubscribe pair oui, unstable non supporté ne pas exposer Helius absente API absence + guard interne avant I/O
slotsUpdatesSubscribe pair oui, unstable page spécifique + overview courant = disponible réutiliser wire standard présente exact wire + warning unstable
voteSubscribe pair oui, unstable non supporté ne pas exposer Helius absente API absence + guard interne avant I/O
transactionSubscribe non standard extension Helius ajouter typed présente request/ack/notification fixtures
transactionUnsubscribe non standard documenté dans référence transaction ajouter via handle présente exact method + late-message race
tokenAccounts non standard none/balanceChanged/all ajouter typed présente dans filter enum + serialization
notifyOn account non standard deprecated, no-op Agave 4.2 ne pas exposer absente absence DTO public
notifyOn program non standard deprecated, no-op Agave 4.2 ne pas exposer absente absence DTO public
enhanced account extra non standard mentionné, wire exact non publié report explicite absente réaudit final
proactive heartbeat absent standard 10 min idle, ping recommandé Helius-only actor policy interne deterministic timer tests
replay historique absent standard pas de contrat WS KSP interdit absent docs/canary no promise

4. Matrice des façades protocolaires

4.1 Surface attendue

Famille SolanaStandardWsSession HeliusLaserStreamWsSession DTO/wire
Account oui oui partagé standard
Block oui non standard seulement
Logs oui oui partagé standard
Program oui oui partagé standard
Root oui oui partagé standard
Signature oui oui partagé standard
Slot oui oui partagé standard
SlotsUpdates oui oui partagé standard
Vote oui non standard seulement
Helius Transaction non oui provider-specific

4.2 Invariants architecture

Critère Décision Preuve cible État
actor physique un seul WsSession actor partagé source/runtime canary pre.002 implémenté
façade standard SolanaStandardWsSession public API canary pre.002 implémenté
façade Helius HeliusLaserStreamWsSession public API canary pre.002 implémenté
namespace LaserStream WS WsProtocolKind + ws_endpoints possèdent helius_laserstream API/Config/docs canary pre.004 validé
LaserStream gRPC backend/type/Config distincts, hors 0.2.8 absence de réutilisation WS décidé
escape hatch Helius aucun inner()/into_inner() public compile-fail/source canary pre.002 implémenté
generic Helius WsSession::connect ne doit pas permettre de contourner la façade invalid protocol pre-I/O canary pre.002 implémenté
Helius unsupported absent de la façade compile-fail/API absence canary pre.003 validé
standard Helius commun délégation vers le même wire/actor exact fixture pre.003 validé
DTO duplication seulement si wire/sémantique divergent public/source audit décidé
Config direction Config -> Transport uniquement ownership tests pre.004 validé
heartbeat Helius-only, actor commun deterministic timers décidé
secret query URL derrière WsEndpointUrl redaction canaries pre.004 validé
new Rust dependency aucune manifest/tree audit décidé

5. Contrat transactionSubscribe à valider

5.1 Filter

Champ Type Limite/état Statut
vote bool optionnel pas de limite locale supplémentaire audit fermé
failed bool optionnel pas de limite locale supplémentaire audit fermé
signature string optionnelle provider valide la signature audit fermé
accountInclude string[] <= 50 000 audit fermé
accountExclude string[] <= 50 000 audit fermé
accountRequired string[] <= 50 000 audit fermé
tokenAccounts enum string none, balanceChanged, all audit fermé

5.2 Options

Champ Valeurs Règle Statut
commitment processed/confirmed/finalized réutilisation possible à vérifier audit fermé
encoding base58/base64/jsonParsed enum Helius restreint audit fermé
transactionDetails full/signatures/accounts/none complet audit fermé
showRewards bool optionnel audit fermé
maxSupportedTransactionVersion integer requis pour accounts/full audit fermé

5.3 Notification

method = transactionNotification
full documented result = transaction + signature + slot + transactionIndex

Validation finale :

aucune forme inventée
types précis pour les formes prouvées
fallback borné si une forme officielle reste insuffisamment explicitée
aucun payload brut dans logs/snapshots

6. Validation lifecycle/provider

[x] un seul actor/socket implementation path dans le code `pre.002`
[x] SolanaStandardWsSession public et constructible — test Transport opérateur vert
[x] HeliusLaserStreamWsSession public et constructible — test Transport opérateur vert
[x] `helius_laserstream` reste possédé par le namespace WebSocket
[x] aucune API/Config gRPC n'est anticipée ou aliasée sur le contrat WS
[x] WsSession historique reste public et son constructeur devient explicitement standard-only
[x] Helius facade n'expose pas blockSubscribe en `pre.002`
[x] Helius facade n'expose pas slotsUpdatesSubscribe en `pre.002`
[x] Helius facade n'expose pas voteSubscribe en `pre.002`
[x] SolanaStandard facade n'expose pas transactionSubscribe
[x] Helius facade n'expose aucun escape hatch vers le handle générique
[x] protocol mismatch rejeté avant I/O — fixture opérateur verte
[x] 6 familles standard Helius utilisent le wire standard exact — fixture `pre.003` opérateur verte
[x] transaction subscribe/ack exact — fixture `pre.005` validée puis consommée par le handle live `pre.006`
[x] transaction unsubscribe/result exact — fixture `pre.005` validée puis registry actor `pre.006`
[x] transaction notification dispatch exact — canari `pre.006` opérateur vert
[ ] notification decode failure isole la logical subscription
[ ] provider RPC application error ne tue pas la session
[x] late notification après unsubscribe ne réactive rien — canari `pre.006` opérateur vert
[x] reconnect invalide/remappe remote ids — canari `pre.006` 41 -> 99 opérateur vert
[x] resubscribe garde local id — canari `pre.006` opérateur vert
[ ] unsubscribe pendant reconnect gagne
[ ] heartbeat n'écrit qu'en Active
[ ] heartbeat est annulé au close
[ ] heartbeat write failure suit reconnect borné
[ ] shutdown interrompt heartbeat/backoff
[ ] oversized inbound frame reste borné
[x] queue overflow d'une transaction subscription n'affecte pas les autres — canari transaction + root `pre.006` opérateur vert
[ ] payload/filters/api-key absents de Debug/snapshots sûrs

7. Non-régressions

[x] standard WebSocket 18/18 toujours comptabilisé pour SolanaStandard — release completeness vert
[x] partition standard unstable 3/9 inchangée — tests hérités verts
[x] signature one-shot inchangée — tests hérités verts
[x] HTTP current 52/52 inchangé — workspace/release completeness verts
[x] HTTP historical 14/14 inchangé — workspace/release completeness verts
[x] KSP-TRANSPORT-007 inchangé — tests Transport/workspace verts
[x] Config V1 HTTP-only backward readable — tests Config workspace verts
[x] Config V2 solana_standard backward readable — tests Config workspace verts
[x] Config V2 helius_laserstream mappe vers WsProtocolKind::HeliusLaserStream — test pre.004 atteint cette assertion avant l'échec safe_value
[x] schema V2 accepte helius_laserstream sans relâcher les autres contraintes — fixture chargée par le test pre.004
[x] no Transport -> Config/Wallet/Store/Program/tracing direct — audits/tests ownership verts

8. Sécurité/redaction

[x] api-key absente de Debug WsEndpointUrl — canaries héritées + pre.002 vert
[ ] KSP_SECRET_HELIUS_API_KEY redacted dans safe_value Config — comportement correct observé, attente du test corrigée par fix.001, checkpoint à rejouer
[ ] KSP_SECRET_HELIUS_API_KEY absente de ResolvedTransportConfig Debug — assertion située après le faux négatif, checkpoint fix.001 à rejouer
[ ] api-key absente de Debug settings/session/subscription
[ ] api-key absente des KspError safe contexts
[ ] URL complète absente des snapshots
[ ] remote subscription id absent des snapshots publics
[ ] raw transaction payload absent des logs/snapshots
[ ] large filter addresses non loggées
[ ] provider error payload arbitraire non copié dans context
[x] façade Helius ne permet pas de contourner les capabilities par exposition du inner — source + doctest compile_fail verts

9. Smoke live

Statut initial : non exécuté.

Contrat cible : opt-in, Config résout l'api-key, Transport ne lit pas l'environnement. Aucun secret n'est versionné ou affiché. Un échec lié au plan/credential provider doit rester distinguable d'une panne du moteur.

10. Preuves pre.003 et pre.004

Checkpoint pre.003 reçu :

cargo fmt --all                                OK
python3 scripts/audit_rust_workspace_rules.py  clean
cargo check --workspace                        OK
cargo clippy --workspace --all-targets         OK
cargo test -p ksp-onchain-transport-lib        OK
cargo test --workspace                         OK

Preuves spécifiques acquises :

[x] Helius accountSubscribe/accountUnsubscribe
[x] Helius programSubscribe/programUnsubscribe
[x] Helius logsSubscribe/logsUnsubscribe
[x] Helius signatureSubscribe/signatureUnsubscribe
[x] Helius slotSubscribe/slotUnsubscribe
[x] Helius rootSubscribe/rootUnsubscribe
[x] compile-fail Helius blockSubscribe
[x] compile-fail Helius slotsUpdatesSubscribe
[x] compile-fail Helius voteSubscribe
[x] public API canary des six wrappers
[x] release completeness canary

La fixture Transport rapporte 314 tests unitaires verts, 38 tests public API verts, 26 tests release-completeness verts et 4 doctests compile-fail verts. pre.003 est donc DONE.

Surface pre.004 préparée :

[x] schema `ws_endpoints[].kind` accepte `helius_laserstream`
[x] adapter Config mappe `helius_laserstream` vers `WsProtocolKind::HeliusLaserStream`
[x] fixture Config matérialise un endpoint Helius mainnet typé
[x] fixture Config matérialise un profil Helius devnet distinct — fix.001/fix.002 validés
[x] exemple Transport matérialise Helius mainnet sans credential réel
[x] exemple Transport matérialise Helius devnet dans un profil distinct — fix.001/fix.002 validés
[x] `.env.example` inventorie `KSP_SECRET_HELIUS_API_KEY`
[x] interpolation du secret produit l'URL runtime Helius attendue
[x] safe_value conserve les littéraux Helius mainnet/devnet et redige uniquement l'api-key (`...api-key=********`)
[x] Debug de `ResolvedTransportConfig` n'expose pas la clé
[x] Config produit un endpoint composable avec `HeliusLaserStreamWsSession`
[x] `config/std.transport.json` canonique reste standard-only

pre.004 n'introduisait aucun transactionSubscribe, heartbeat, changement du moteur WebSocket ou nouvelle dépendance ; son checkpoint final est désormais vert.

11. Audit structurel des documents actifs

Contrats appliqués :

docs/plans/*.md       = planification, décisions, audit de scope, forecast, stratégie de validation
docs/validation/*.md  = matrices, critères, états et preuves réellement exécutées
deltas/0.2.8/*.md     = journal immuable de chaque livraison

Constats pre.002-fix.001 :

[x] docs/plans est ordonné : 000-README puis 001..015 sans collision
[x] docs/validation est ordonné : 000-README puis 001..011 sans collision
[x] aucun nouveau répertoire documentaire n'est nécessaire pour Helius WebSocket
[x] le plan 015 garde une seule responsabilité : organiser la release 0.2.8
[x] la validation 011 garde une seule responsabilité : rapprocher critères et preuves 0.2.8
[x] le delta du fix reste le seul journal détaillé de la livraison
[x] le forecast détaillé n'est plus dupliqué dans la validation
[x] les sections architecture auparavant séparées sont regroupées dans le plan
[x] l'ordre du plan suit désormais : état/forecast -> sources/baseline -> héritage -> audit -> matrice -> architecture -> risques -> validation -> clôture

Aucun split en fichiers supplémentaires n'est retenu : les plans historiques 0.2.50.2.7 sont de taille comparable ou supérieure, et le contenu du plan 015 reste entièrement centré sur une seule release. Le problème identifié était l'ordre interne et la duplication de responsabilités, pas la nécessité d'un nouveau type de document.

12. Gates opérateur pre.004 / fix.001 / fix.002

Premier passage pre.004 reçu le 2026-08-23 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[x] cargo check --workspace
[x] cargo clippy --workspace --all-targets
[ ] cargo test -p ksp-config-lib — 109/110 ; faux négatif safe_value Helius
[x] cargo test -p ksp-onchain-transport-lib — vert
[ ] cargo test --workspace — échoue uniquement sur le même test Config

Observation exacte :

observé  = wss://mainnet.helius-rpc.com/?api-key=********
attendu  = ********

L'observé est conforme au contrat historique du résolveur Config : dans une chaîne composée, les littéraux non sensibles restent visibles dans la projection sûre tandis que chaque placeholder secret est remplacé par ********. Le fix ne modifie donc pas le runtime ; il corrige le canari pour attendre l'URL sûre segmentaire exacte. La revue du même checkpoint complète également la couverture Config avec un profil Helius Devnet distinct utilisant wss://devnet.helius-rpc.com/?api-key=..., afin que mainnet et devnet soient tous deux prouvés sans mélange de clusters.

Second passage reçu après pre.004-fix.001 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[x] cargo check --workspace
[x] cargo clippy --workspace --all-targets
[ ] cargo test -p ksp-config-lib — 109/110 ; provenance Helius composée attendue à tort sur 1 segment
[x] cargo test -p ksp-onchain-transport-lib — vert

Observation exacte :

provenance.len() observé = 2
provenance.len() attendu = 1

Le comportement runtime est correct. Une chaîne wss://...api-key=${KSP_SECRET_HELIUS_API_KEY} contient un segment littéral suivi d'un segment issu de l'environnement ; la provenance ordonnée doit donc être :

0 = DocumentLiteral
1 = EnvironmentProcess(KSP_SECRET_HELIUS_API_KEY)

pre.004-fix.002 modifie uniquement le canari mainnet/devnet pour vérifier ces deux segments. Les profils, URLs, redaction, schema et mapping restent inchangés.

Checkpoint reçu après pre.004-fix.002 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[x] cargo check --workspace
[x] cargo clippy --workspace --all-targets
[x] cargo test -p ksp-config-lib — 110/110 + ownership/public API
[x] cargo test -p ksp-onchain-transport-lib — 314 unit + 38 public + 26 completeness + 4 doctests
[x] cargo test --workspace

Verdict : pre.004 DONE ; pre.004-fix.001 DONE ; pre.004-fix.002 DONE.

13. Préparation pre.005 — contrat Helius transaction

Sources matérialisées :

crates/ksp-onchain-transport-lib/src/ws_helius_transactions.rs
crates/ksp-onchain-transport-lib/unit_tests/ws_helius_transactions.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs

Contrats préparés :

[x] HeliusTransactionSubscribeFilter couvre vote/failed/signature/accountInclude/accountExclude/accountRequired/tokenAccounts
[x] accountInclude/accountExclude/accountRequired conservent omission vs [] explicite
[x] chacune des trois listes est bornée localement à 50_000
[x] HeliusTokenAccountsFilter = none/balanceChanged/all
[x] HeliusTransactionSubscribeEncoding = base58/base64/jsonParsed
[x] transactionDetails réutilise SolanaTransactionDetails = full/signatures/accounts/none
[x] maxSupportedTransactionVersion est exigé pour accounts/full
[x] options absentes vs objet {} explicite restent distinctes
[x] transactionSubscribe ack numérique et transactionUnsubscribe booléen ont des décodeurs stricts
[x] transactionUnsubscribe encode exactement [remoteSubscriptionId]
[x] Debug filtre/request expose des comptes et indicateurs, jamais signature/adresses
[x] fixture locale route subscribe/unsubscribe via le WsSession actor existant
[x] aucun second actor/socket
[x] aucun transaction_subscribe public avant pre.006
[x] aucune nouvelle dépendance

Validation statique disponible dans l'environnement de préparation :

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

Gates opérateur pre.005 à exécuter :

[ ] cargo fmt --all
[ ] python3 scripts/audit_rust_workspace_rules.py = clean
[ ] cargo check --workspace
[ ] cargo clippy --workspace --all-targets
[ ] cargo test -p ksp-onchain-transport-lib
[ ] cargo test --workspace

Verdict courant : pre.004 et ses fixes DONE ; pre.005 PREPARED.

14. Gate pre.005 et pre.005-fix.001

Checkpoint opérateur initial pre.005 :

[x] cargo fmt --all
[x] audit Rust général/workspace
[x] cargo check --workspace compile
[!] cargo check — 5 warnings de réexports pub(crate) utilisés uniquement par les tests
[ ] cargo clippy --workspace --all-targets — 4 erreurs E0277 Vec<Value> == Value
[ ] cargo test -p ksp-onchain-transport-lib — mêmes 4 erreurs E0277
[ ] cargo test --workspace — non retenu comme preuve de fermeture tant que Transport ne compile pas en tests

Critères du fix :

[ ] les quatre attentes JSON comparent Vec<Value> à Vec<Value>
[ ] les helpers wire utilisés uniquement par le module/tests sont strictement privés
[ ] aucun pub(crate) test-only ni #[allow(dead_code)] compensatoire
[ ] unit_tests utilise super::Helper pour ces items privés
[ ] unit_tests continue d'utiliser crate::Item pour tous les éléments pub/pub(crate)
[ ] l'audit détecte private parent utilisé sans super::
[ ] l'audit détecte visible parent utilisé via super:: ou nom nu
[ ] cargo check sans les cinq warnings pre.005
[ ] clippy Transport/workspace vert
[ ] tests Transport/workspace verts

Verdict après ce checkpoint : pre.005 FIX REQUIRED ; pre.005-fix.001 APPLIED mais gate warningful.

15. Gate pre.005-fix.001 et pre.005-fix.002

Checkpoint opérateur reçu après pre.005-fix.001 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[!] cargo check --workspace — compile, mais 9 warnings dead_code dans ws_helius_transactions.rs
[!] cargo clippy --workspace --all-targets — compile, mêmes 9 warnings
[x] cargo test -p ksp-onchain-transport-lib — 322 unit + 39 public + 27 completeness + 4 doctests
[ ] cargo test --workspace — non utilisé comme preuve de fermeture tant que le build reste warningful

Les neuf warnings portent exclusivement sur des helpers privés de préparation wire non encore consommés par un chemin de production : to_json_value (filtre/options), params/method/result subscribe/unsubscribe et insert_account_list.

Critères pre.005-fix.002 :

[ ] helpers wire test-only restent strictement privés
[ ] helpers wire test-only sont sous #[cfg(test)]
[ ] aucun #[allow(dead_code)] compensatoire
[ ] aucun pub(crate) test-only
[ ] tests privés continuent via super::Item
[ ] API publique continue via crate::Item
[ ] cargo check sans warning pre.005
[ ] cargo clippy sans warning pre.005
[ ] tests Transport/workspace verts

Verdict après checkpoint final : pre.005 DONE ; pre.005-fix.001 DONE ; pre.005-fix.002 DONE.

16. Gate pre.005-fix.002 fermé et préparation pre.006

Checkpoint opérateur final pre.005 reçu le 2026-08-23 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[x] cargo check --workspace = sans warning
[x] cargo clippy --workspace --all-targets = sans warning
[x] cargo test -p ksp-onchain-transport-lib = 322 unit + 39 public API + 27 completeness + 4 doctests
[x] cargo test --workspace = vert

Verdict : pre.005 et ses deux fixes sont fermés.

Critères préparés pour pre.006 :

[ ] WsSubscriptionKind::HeliusTransaction mappe exactement subscribe/unsubscribe/notification
[ ] HeliusLaserStreamWsSession::transaction_subscribe retourne WsSubscription<HeliusTransactionNotification>
[ ] notification Full conserve transaction/signature/slot/transactionIndex
[ ] notification Signature conserve signature/slot/transactionIndex et états optionnels
[ ] forme inconnue reste HeliusTransactionNotification::Unknown sans casser le handle
[ ] l'identité locale du handle reste stable après reconnect/resubscribe
[ ] le remote ID est remappé et jamais exposé publiquement
[ ] notification Helius en vol après transactionUnsubscribe est ignorée après retrait du mapping
[ ] overflow du handle transaction est terminal seulement pour ce handle
[ ] cleanup overflow envoie transactionUnsubscribe avec le remote ID courant
[ ] une souscription Helius root saine reste active pendant l'overflow transaction
[ ] quatre compile-fail Helius block/slotsUpdates/vote/escape-hatch restent verts
[ ] aucun heartbeat avant pre.007
[ ] aucun second actor/socket/registry/queue
[ ] aucun nouvel accès non canonique private/pub/pub(crate) dans unit_tests

Gate opérateur pre.006 :

[ ] cargo fmt --all
[ ] python3 scripts/audit_rust_workspace_rules.py = clean
[ ] cargo check --workspace = sans warning
[ ] cargo clippy --workspace --all-targets = sans warning
[ ] cargo test -p ksp-onchain-transport-lib
[ ] cargo test --workspace

Comptages attendus si les nouveaux canaris passent : 325 tests unitaires Transport, 40 public API, 28 release-completeness, 4 doctests compile-fail.

Verdict courant : pre.006 PREPARED.

17. Gate pre.006 fermé et préparation pre.007

Checkpoint opérateur pre.006 :

[x] cargo fmt --all
[x] python3 scripts/audit_rust_workspace_rules.py = clean
[x] cargo check --workspace = sans warning
[x] cargo clippy --workspace --all-targets = sans warning
[x] cargo test -p ksp-onchain-transport-lib = 325 unit + 40 public API + 28 completeness + 4 doctests
[x] cargo test --workspace = vert

Preuves lifecycle désormais acquises :

[x] WsSubscriptionKind::HeliusTransaction possède le triplet exact
[x] HeliusLaserStreamWsSession::transaction_subscribe retourne le handle live typed
[x] notification Full / Signature / Unknown décodées
[x] local WsSubscriptionId stable après reconnect
[x] remote id remappé
[x] late notification après unsubscribe ignorée
[x] overflow transaction isole uniquement le handle lent
[x] cleanup overflow utilise transactionUnsubscribe
[x] une souscription Helius root saine reste active
[x] aucun second actor/socket/registry
[x] quatre compile-fail Helius restent verts

Gate préparé pour pre.007 :

[ ] heartbeat activé uniquement pour WsProtocolKind::HeliusLaserStream
[ ] intervalle provider-owned exactement 60 s
[ ] heartbeat utilise WebSocket Ping control frame, pas un JSON-RPC provider method
[ ] aucun heartbeat provider sur SolanaStandard
[ ] heartbeat n'écrit qu'en état Active
[ ] succès réarme le prochain deadline à now + 60 s
[ ] reconnect réussi réarme le deadline depuis la nouvelle connexion
[ ] write timeout/failure suit le chemin Failed -> reconnect existant
[ ] close avant deadline annule le heartbeat
[ ] shutdown reste prioritaire sur le heartbeat
[ ] aucun champ heartbeat public ajouté à WsSessionSettings
[ ] aucune configuration/env supplémentaire
[ ] aucune régression transactionSubscribe/transactionNotification de pre.006
[ ] cargo fmt --all
[ ] python3 scripts/audit_rust_workspace_rules.py = clean
[ ] cargo check --workspace = sans warning
[ ] cargo clippy --workspace --all-targets = sans warning
[ ] cargo test -p ksp-onchain-transport-lib = 331 unit + 40 public API + 29 completeness + 4 doctests attendus
[ ] cargo test --workspace = vert

Le test-util Tokio ajouté côté dev sert uniquement à avancer l'horloge des canaris déterministes ; la cadence runtime reste 60 s et aucune nouvelle dépendance de production n'est introduite.

Verdict courant : pre.006 DONE ; pre.007 PREPARED.

18. Gate pre.007 et pre.007-fix.001

Résultat opérateur reçu pour 0.2.8-pre.007 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[!] cargo clippy --workspace --all-targets = 1 erreur `implicit_return` dans `yield_runtime_steps`
[!] cargo test -p ksp-onchain-transport-lib = 329 passed / 2 failed sur 331 unit

Tests heartbeat déjà verts dans ce même run :

[x] helius_heartbeat_policy_is_provider_owned_and_fixed_to_sixty_seconds
[x] standard_session_never_emits_helius_provider_heartbeat
[x] helius_heartbeat_write_failure_maps_to_existing_reconnect_failure_outcome
[x] helius_heartbeat_is_rearmed_from_successful_reconnect

Échecs bornés :

[!] helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
    actor non garanti pollé/armé avant la première `advance()` Tokio

[!] helius_explicit_close_cancels_heartbeat_before_deadline
    assertion trop stricte : après fermeture de la fixture, `try_recv()` peut être `Disconnected`

Critères pre.007-fix.001 :

[ ] aucune modification de `src/ws_session.rs`
[ ] aucune modification de la constante heartbeat 60 s
[ ] aucun champ Config/WsSessionSettings ajouté
[ ] helper `yield_runtime_steps` satisfait `clippy::implicit_return`
[ ] actor laissé se stabiliser après `pause()` avant la première avance
[ ] test close prouve aucun Ping à t=30 s avant close
[ ] après close, aucun `Ok(())` Ping n'est accepté ; Empty/Disconnected sont valides
[ ] cargo check sans warning
[ ] cargo clippy sans warning
[ ] Transport = 331 unit + 40 public API + 29 completeness + 4 doctests
[ ] cargo test --workspace = vert

Verdict courant : pre.007 FIX REQUIRED ; pre.007-fix.001 PREPARED ; pre.008 bloqué.

19. Replay pre.007-fix.001 et gate pre.007-fix.002

Résultat opérateur 0.2.8-pre.7.fix.1 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[!] Transport unit = 330 passed / 1 failed sur 331

Canaris heartbeat verts :

[x] policy provider-owned Helius + 60 s
[x] close avant deadline annule le heartbeat
[x] SolanaStandard n'émet aucun heartbeat provider
[x] write failure du Ping suit le chemin reconnect existant
[x] reconnect réussi réarme depuis la connexion de remplacement

Seul échec :

[!] helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
    `try_recv()` peut encore précéder la propagation actor/socket/fixture/channel après `advance(1 s)`.

Critères pre.007-fix.002 :

[ ] aucune modification de `src/ws_session.rs`
[ ] cadence Helius exacte 60 s inchangée
[ ] aucune API/Config/dependency supplémentaire
[ ] attente positive bornée par scheduler steps uniquement
[ ] aucune nouvelle `advance()`, `sleep()` ou `timeout()` pour attendre le Ping
[ ] t=59 s reste strictement sans Ping
[ ] Ping observé à t=60 s après propagation scheduler bornée
[ ] t=119 s reste strictement sans second Ping
[ ] second Ping observé à t=120 s après propagation scheduler bornée
[ ] canal Disconnected avant Ping = échec explicite
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport = 331 unit + 40 public API + 29 completeness + 4 doctests
[ ] cargo test --workspace = vert

Verdict courant : pre.007 FIX REQUIRED ; pre.007-fix.001 CHECKPOINT ; pre.007-fix.002 PREPARED ; pre.008 bloqué.

20. Replay pre.007-fix.002 et gate pre.007-fix.003

Résultat opérateur 0.2.8-pre.7.fix.2 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[!] Transport unit = 330 passed / 1 failed sur 331

Le seul échec reste :

helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
  -> aucun Ping observé après 256 yield_now() bornés

Les autres canaris heartbeat restent verts :

[x] policy Helius-only + intervalle 60 s
[x] SolanaStandard sans heartbeat provider
[x] close avant deadline
[x] write failure -> reconnect existant
[x] réarmement après reconnect avec Ping actor réel

Le fix.002 invalide donc l'hypothèse « quelques yields supplémentaires suffisent ». Sous temps Tokio pausé, la progression scheduler n'implique pas la progression du driver I/O TCP local.

Critères pre.007-fix.003 :

[ ] aucune modification de `src/ws_session.rs`
[ ] cadence Helius 60 s inchangée
[ ] aucune API/Config/dependency supplémentaire
[ ] absence de Ping prouvée avant le premier deadline avec horloge virtuelle pausée
[ ] premier deadline virtuel franchi avant toute fenêtre temps réel
[ ] propagation I/O réelle bornée à <= 1 s et Ping exigé
[ ] horloge repausée immédiatement après observation
[ ] temps réel consommé compensé avant le contrôle pré-second-deadline
[ ] aucun second Ping avant au moins 59 s depuis le réarmement
[ ] second deadline franchi avant la seconde fenêtre I/O bornée
[ ] second Ping exigé
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport = 331 unit + 40 public API + 29 completeness + 4 doctests
[ ] cargo test --workspace = vert

Verdict courant : pre.007 FIX REQUIRED ; fix.001 CHECKPOINT ; fix.002 CHECKPOINT ; fix.003 PREPARED ; pre.008 bloqué.

21. Replay pre.007-fix.003 et gate pre.007-fix.004

Résultat opérateur 0.2.8-pre.7.fix.3 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 331/331
[x] Transport public API = 40/40
[x] release completeness = 29/29
[x] Transport doctests = 4/4
[!] cargo test --workspace = 1 échec dependency-firewall dans ksp-core-lib

Échec exact :

transport_manifest_preserves_ksp_dependency_firewall
assertion attend encore :
  tokio = { workspace = true, features = ["net", "rt"] }

manifest Transport depuis pre.007 :
  tokio = { workspace = true, features = ["io-util", "net", "rt", "test-util"] }

Le manifest courant est intentionnel : test-util permet les canaris d'horloge Tokio et io-util sert les fixtures I/O de test. Il n'y a ni nouvelle dépendance de production ni rupture du firewall KSP. Le défaut est donc le canari textuel non synchronisé lors de pre.007.

Critères pre.007-fix.004 :

[ ] version workspace = 0.2.8-pre.7.fix.4
[ ] crates/ksp-onchain-transport-lib/Cargo.toml inchangé
[ ] src/ws_session.rs inchangé
[ ] unit_tests/ws_session.rs inchangé
[ ] canari dependency-firewall attend exactement io-util/net/rt/test-util
[ ] liste des noms de dev-dependencies reste exactement [tokio]
[ ] aucune nouvelle dépendance ou feature
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport = 331 unit + 40 public API + 29 completeness + 4 doctests
[ ] cargo test --workspace = vert

Verdict courant : pre.007 FIX REQUIRED ; fix.001 CHECKPOINT ; fix.002 CHECKPOINT ; fix.003 CHECKPOINT Transport vert ; fix.004 PREPARED ; pre.008 bloqué.

22. Fermeture pre.007-fix.004 et gate pre.008

Résultat opérateur final 0.2.8-pre.7.fix.4 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 331/331
[x] Transport public API = 40/40
[x] release completeness = 29/29
[x] Transport doctests = 4/4
[x] cargo test --workspace = vert

Verdict : pre.007 DONE avec fix.001..004 DONE. pre.008 peut être ouvert.

Ré-audit provider courant : Helius documente toujours transactionSubscribe sur les endpoints WSS unifiés mainnet/devnet, les trois listes d'adresses à 50 000 max et l'absence de support de blockSubscribe, slotsUpdatesSubscribe et voteSubscribe.

Critères pre.008 préparés :

[ ] workspace.package.version = 0.2.8-pre.8
[ ] aucune nouvelle dépendance
[ ] aucun second actor/socket/provider registry
[ ] SolanaStandard ne peut pas appeler transactionSubscribe (compile-fail)
[ ] Helius ne peut toujours pas appeler block/slotsUpdates/vote (compile-fail)
[ ] provider RPC application error ne tue pas la session physique
[ ] provider message/data arbitraires ne sont pas copiés dans KspError
[ ] mismatch notification method échoue seulement la logical transaction subscription
[ ] cleanup du mismatch utilise transactionUnsubscribe
[ ] autre subscription saine survit au mismatch
[ ] oversized inbound provider payload déclenche le reconnect borné avant JSON decode métier
[ ] session Helius de remplacement reste utilisable après oversized payload
[ ] queue overflow transaction reste isolée (preuve pre.006 conservée)
[ ] Debug Full notification omet transaction et signature brutes
[ ] Debug Signature notification omet signature/memo/error values
[ ] Debug Unknown notification omet le serde_json::Value brut
[ ] endpoint api-key/filter values restent absents session/request/snapshot diagnostics
[ ] remote subscription id reste absent des snapshots publics
[ ] standard WebSocket 18/18 inchangé
[ ] HTTP 52 current + 14 historical inchangé
[ ] Config V1/V2 et helius_laserstream inchangés
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport = 335 unit + 40 API + 30 completeness + 5 doctests
[ ] cargo test --workspace = vert

La correction Debug ne retire aucune donnée de l'API fonctionnelle : transaction(), signature(), les accessors wire et la variante Unknown(Value) restent disponibles explicitement. Elle empêche seulement les diagnostics génériques de rendre un payload provider arbitraire ou massif.

Verdict courant : pre.008 PREPARED ; pre.009 bloqué jusqu'au gate opérateur.

23. Fermeture pre.008 et gate pre.009

Résultat opérateur 0.2.8-pre.8 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 335/335
[x] Transport public API = 40/40
[x] release completeness = 30/30
[x] Transport doctests = 5/5
[x] cargo test --workspace = vert

Verdict : pre.008 DONE.

23.1 Réaudit Helius final avant compliance

Le réaudit du 2026-08-23 révèle une évolution de la documentation Helius par rapport au checkpoint pre.001 :

overview LaserStream WebSocket
  -> annonce le support du jeu complet des méthodes standard
  -> énumère account/block/logs/program/root/signature/slot/slotsUpdates/vote + unsubscribe

page blockSubscribe
  -> garde explicitement "Helius does not support"

page voteSubscribe
  -> garde explicitement "Helius does not support"

page slotsUpdatesSubscribe
  -> unstable
  -> endpoints Helius mainnet/devnet
  -> request/notification/result documentés
  -> aucune mention de non-support Helius

page slotsUpdatesUnsubscribe
  -> subscriptionId entier
  -> result bool

Arbitrage : la page spécifique de méthode prévaut sur la formulation générale lorsqu'elles divergent. Le support Helius final retenu devient :

standard Helius : account/logs/program/root/signature/slot/slotsUpdates
provider Helius : transaction
absent Helius   : block/vote

Le point accountSubscribe « advanced filters » reste non matérialisé : l'overview le mentionne, mais la page API spécifique ne publie aucun wire provider-specific supplémentaire au-delà du contrat standard et de notifyOn deprecated/no-op. Aucun champ n'est inventé.

23.2 Critères pre.009

[ ] workspace.package.version = 0.2.8-pre.9
[ ] HeliusLaserStreamWsSession expose slots_updates_subscribe
[ ] Helius slotsUpdates réutilise SolanaSlotUpdate et WsSubscriptionKind::SlotsUpdates
[ ] wire exact slotsUpdatesSubscribe / slotsUpdatesUnsubscribe inchangé
[ ] warning unstable standard conservé
[ ] compile-fail Helius slotsUpdates retiré
[ ] compile-fail Helius block conservé
[ ] compile-fail Helius vote conservé
[ ] compile-fail Helius into_inner conservé
[ ] compile-fail SolanaStandard transactionSubscribe conservé
[ ] HTTP = 52 current + 14 historical
[ ] Standard WebSocket = 9 familles / 18 méthodes
[ ] Helius = 7 familles standard + transaction
[ ] Config -> Transport reste la seule direction
[ ] KSP_SECRET_HELIUS_API_KEY reste inventorié
[ ] Transport n'ajoute aucune dépendance Config/Store/Program/tracing direct
[ ] aucune nouvelle dépendance
[ ] aucun second actor/socket/registry
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport unit = 335
[ ] Transport public API = 41
[ ] release completeness = 33
[ ] Transport doctests = 4
[ ] cargo test --workspace = vert

Le passage de 5 à 4 doctests est attendu : le canari compile-fail Helius -X-> slotsUpdatesSubscribe est supprimé parce que la méthode devient volontairement publique. Les quatre canaris négatifs restants sont Helius -X-> block, Helius -X-> vote, Helius -X-> into_inner et SolanaStandard -X-> transactionSubscribe.

Verdict courant : pre.009 PREPARED ; pre.010 bloqué jusqu'au gate opérateur.

24. Fermeture pre.009 et gate pre.010

Résultat opérateur 0.2.8-pre.9 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 335/335
[x] Transport public API = 41/41
[x] release completeness = 33/33
[x] Transport doctests = 4/4
[x] cargo test --workspace = vert

Verdict : pre.009 DONE.

24.1 Stratégie live Helius retenue

Les pages Helius courantes confirment :

endpoints WSS unifiés mainnet/devnet avec api-key
slotSubscribe disponible sur endpoint Helius
transactionSubscribe = extension Helius
Ping chaque minute recommandé contre linactivité

La sécurité du credential nest pas le seul critère. Lownership KSP impose aussi :

[x] Transport ne lit pas KSP_SECRET_HELIUS_API_KEY
[x] Transport ne dépend pas de Config
[x] Config reste propriétaire de lenvironnement et du secret
[x] le smoke Config -> Transport existant reste une exception transitoire
[x] aucun nouveau smoke cross-crates Helius nest ajouté à Config

Le smoke live Helius est donc différé vers la future surface dintégration/orchestration. Le scénario minimal recommandé utilisera le profil helius_devnet puis slotSubscribe; un scénario transactionSubscribe restera optionnel et provider-entitlement-dependent. Cette absence de test live committé naffaiblit pas les gates déterministes de 0.2.8, déjà couverts par fixtures locales, capability guards, reconnect, heartbeat, backpressure et compliance.

24.2 Critères pre.010

[ ] workspace.package.version = 0.2.8-pre.10
[ ] README décrit Helius = 7 familles standard + transaction
[ ] README rappelle block/vote absents et slotsUpdates unstable
[ ] README/USAGE documentent heartbeat Helius 60 s
[ ] USAGE documente Config helius_devnet -> HeliusLaserStreamWsSession
[ ] KSP_SECRET_HELIUS_API_KEY reste Config-owned
[ ] aucun nouveau smoke Helius live dans Transport avec lecture env/secret
[ ] aucun nouveau smoke Helius cross-crates ajouté à Config
[ ] aucun Transport -> Config
[ ] aucune nouvelle dépendance
[ ] cargo tree -p ksp-onchain-transport-lib inspecté
[ ] cargo tree -p ksp-onchain-transport-lib --duplicates inspecté
[ ] cargo tree --duplicates inspecté
[ ] cargo fmt --all
[ ] audit Rust = clean
[ ] cargo check = sans warning
[ ] cargo clippy = sans warning
[ ] Transport unit = 335
[ ] Transport public API = 41
[ ] release completeness = 34
[ ] Transport doctests = 4
[ ] cargo test --workspace = vert

Verdict courant : pre.010 PREPARED ; pre.011 bloqué jusquau gate opérateur et au cargo tree final.

25. Gate pre.010 fermé et candidate pre.011

25.1 Preuves opérateur pre.010

[x] cargo fmt --all
[x] audit Rust = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 335/335
[x] Transport public API = 41/41
[x] release completeness = 34/34
[x] Transport doctests = 4/4
[x] cargo test --workspace = vert
[x] cargo tree Transport direct = exécuté
[x] cargo tree Transport duplicates = exécuté
[x] cargo tree workspace duplicates = exécuté

Audit graphe :

Transport direct : aucune dépendance nouvelle Helius/gRPC/Config
Transport duplicates ciblés : syn 2/3 + webpki-roots 0.26/1.0, transitifs
workspace duplicates : transitifs historiques Tauri/GTK/JSON Schema/crypto, non introduits par pre.010

Verdict : pre.010 DONE.

25.2 Candidate pre.011

La clôture candidate doit prouver :

[x] version Cargo pre.11
[x] zéro changement runtime provider
[x] matrice Helius finale cohérente : 7 standard + transaction ; block/vote absents
[x] Standard WS 18/18 et HTTP 52+14 conservés
[x] stratégie smoke live différée vers intégration/orchestration conservée
[x] dependency graph final enregistré comme non bloquant
[x] prompts/014-V0_2_9_START_PROMPT.md présent
[x] prompt 0.2.9 conforme PROMPT_STRUCTURE et autonome
[x] prompt 0.2.9 contient un forecast souple détaillé
[x] prompt 0.2.9 impose le gate audit/sizing avant client gRPC lourd
[x] prompt 0.2.9 impose audit licence/MSRV/features/transitifs
[x] prompt distingue standard Yellowstone, provider adapters et deshred/pré-exécution
[x] index docs/plans/validation/prompts synchronisés
[x] workspace complet vert

État fonctionnel candidat 0.2.8 :

HTTP                         52 current + 14 historical
Solana Standard WebSocket    9 familles / 18 opérations
Helius common                account/logs/program/root/signature/slot/slotsUpdates
Helius extension             transactionSubscribe/unsubscribe
Helius unsupported           block/vote
heartbeat                    Ping control frame / 60 s / Helius only
Config                       V2 helius_laserstream + secret provenance/redaction
actor                        WsSession physique unique partagé
smoke provider live          reporté vers future intégration/orchestration

Le prompt suivant vise 0.2.9 — Yellowstone gRPC standard/provider-neutral. La release stable n'est pas encore publiée à pre.011; ROADMAP.md et CHANGELOG.md restent donc à finaliser dans rel.001.

26. Validation finale candidate et publication stable

Checkpoint opérateur 0.2.8-pre.11 :

[x] cargo fmt --all
[x] audit Rust workspace = clean / 0 candidate
[x] cargo check --workspace = vert, sans warning
[x] cargo clippy --workspace --all-targets = vert, sans warning
[x] Transport unit = 335/335
[x] Transport public API = 41/41
[x] release completeness = 34/34
[x] Transport doctests = 4/4
[x] cargo test --workspace = vert

Les graphes Cargo de pre.010 restent autoritaires pour la candidate, car pre.011 na changé ni manifest de dépendances ni source runtime : Transport conserve seulement les duplications transitives ciblées syn 2/3 et webpki-roots 0.26/1.0, sans SDK Helius/gRPC ni dépendance inverse Config.

Verdict final avant publication : candidate 0.2.8 conforme.

rel.001 ne change que le signal Cargo stable et la documentation de publication. Après son application, le gate de publication doit confirmer les mêmes compteurs :

Transport unit             335
Transport public API        41
release completeness        34
Transport doctests           4
workspace                   vert
warnings                    0

Après validation de rel.001, le tag unique de la release est v0.2.8 et prompts/014-V0_2_9_START_PROMPT.md devient le contrat actif pour 0.2.9-pre.001.