v0.2.9-pre.001

This commit is contained in:
2026-08-24 08:37:36 +02:00
parent d70c3a1672
commit bdcab1e1a7
8 changed files with 1849 additions and 12 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/000-README.md -->
<!-- version: 59 -->
<!-- version: 60 -->
# Plans KSP
@@ -24,6 +24,7 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou
- [`013-V0_2_6_WALLET_DESK_PLAN.md`](013-V0_2_6_WALLET_DESK_PLAN.md) — plan historique clôturé de la release stable `0.2.6 — Wallet Desk`, ouvert par `pre.001`, étendu en `pre.015``pre.017` au wire binaire `.kspwallet` V2, aux APIs multi-version et à la migration V1 -> V2, puis fermé par `pre.018`/`fix.001` avec le runtime Tauri packagé et le build final vert avant publication `rel.001`.
- [`014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) — plan historique clôturé de la release stable `0.2.7 — WebSocket Solana standard`, ouvert par `pre.001`, exécuté jusquà `pre.014`, corrigé documentairement par `pre.014-fix.001` puis publié par `rel.001`; il conserve linventaire officiel 18 méthodes, le modèle session/subscription, le threat model, les preuves de compliance/smoke/dépendances et la préparation de `0.2.8`.
- [`015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) — plan historique clôturé de la release stable `0.2.8 — Helius LaserStream WebSocket`, ouvert par `pre.001`, fermé techniquement/documentairement par `pre.011` puis publié par `rel.001`; il conserve la surface finale Helius `7 standard + transaction`, heartbeat/Config/secrets, lhistorique des fixes heartbeat, la stratégie live architecture-safe, les graphes Cargo finaux et la préparation du prompt `0.2.9`.
- [`016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) — plan actif de `0.2.9 — Yellowstone gRPC standard/provider-neutral`, ouvert par `pre.001`; il fixe la stratégie `yellowstone-grpc-proto + Tonic KSP`, la surface `Subscribe + 7 unary`, lexclusion de `SubscribeDeshred`, Config V3, les règles replay/backpressure et les smokes gratuits PublicNode puis OrbitFlare.
Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md -->
<!-- version: 85 -->
<!-- version: 86 -->
# Séquence des releases fonctionnelles KSP
@@ -473,11 +473,13 @@ Le réaudit final Helius du 23 août 2026 retient `helius_laserstream` comme pro
### `0.2.9` — Yellowstone gRPC standard
Mission : introduire un backend Yellowstone standard/provider-neutral.
Mission active : introduire un backend Yellowstone standard/provider-neutral dans `ksp-onchain-transport-lib`, distinct de HTTP et WebSocket. Le gate `pre.001` est conservé dans [`016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et sa matrice dans [`../validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](../validation/012-V0_2_9_YELLOWSTONE_GRPC.md).
Le `pre.001` est un gate de sizing : inventorier toute la surface normative cible et scinder la release avant implémentation si sa clôture dans une session paraît incertaine.
Le réaudit du 23 août 2026 corrige le snapshot du prompt : la release GitHub courante observée est `v15.1.2+solana.4.2.0`, tandis que les crates publiées restent `yellowstone-grpc-client 13.3.0` et `yellowstone-grpc-proto 12.6.0`. `0.2.9` retient la stratégie `yellowstone-grpc-proto` Apache-2.0 + client/lifecycle KSP autour de Tonic, et couvre `Subscribe`, les sept RPC unary standard retenus, les filtres Cuckoo/token actuels et les neuf variantes `SubscribeUpdate`. `SubscribeDeshred` reste hors scope comme extension Triton/pré-exécution.
Les profiles/adapters Helius/Triton/ERPC/Chainstack/Shyft sont reportés après les priorités fondatrices.
La Config cible une V3 séparant `grpc_endpoints` de HTTP/WS tout en conservant V1/V2 backward-readable. PublicNode/Allnodes-backed entre dans la release comme premier environnement live standard gratuit Mainnet/Testnet ; OrbitFlare suit comme smoke Devnet gratuit authentifié. Aucun adapter public provider-specific n'est créé pour eux. Tatum reste un fallback opérateur Mainnet à quota lifetime ; les offres gRPC payantes Helius/Shyft/Alchemy/NodeFlare ne deviennent pas des dépendances de validation.
Forecast recalibré : `pre.002` deps/settings, `pre.003` TLS/metadata+unary, `pre.004` Subscribe commun, `pre.005` accounts/slots, `pre.006` transactions, `pre.007` blocks/meta/entry, `pre.008` lifecycle/backpressure, `pre.009` reconnect/replay, `pre.010` Config V3, `pre.011` live/compliance, `pre.012` clôture candidate/prompt suivant. Chaque tranche reste nominalement 1520 minutes et peut être scindée si le wire transaction/block, le replay ou le graphe de dépendances l'exige.
### `0.2.10` / `0.2.11` — Off-chain price + app

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/000-README.md -->
<!-- version: 23 -->
<!-- version: 24 -->
# Validations KSP
@@ -20,3 +20,4 @@ Documents :
- [`009-V0_2_6_WALLET_DESK_COMPLIANCE.md`](009-V0_2_6_WALLET_DESK_COMPLIANCE.md) — matrice finale validée de la release stable `0.2.6`, couvrant Wallet Desk, les wires V1/V2, la migration explicite, le runtime Tauri packagé, les frontières sécurité/ownership et le gate opérateur `pre.018-fix.001` avec build final Linux vert.
- [`010-V0_2_7_ONCHAIN_WEBSOCKET.md`](010-V0_2_7_ONCHAIN_WEBSOCKET.md) — matrice finale validée de la release stable `0.2.7`, ouverte par `pre.001`, fermée techniquement par `pre.014` puis publiée par `rel.001` : inventaire 9 subscribe + 9 unsubscribe, lifecycle borné, statuts unstable, compliance 18/18, non-régression HTTP 52+14, composition Config V2, smoke WebSocket Devnet et audit de dépendances.
- [`011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) — matrice finale validée de la release stable `0.2.8`, ouverte par `pre.001`, consolidée jusquà `pre.011` puis publiée par `rel.001` : Helius `account/logs/program/root/signature/slot/slotsUpdates + transaction`, `block/vote` absents, heartbeat provider, sécurité/redaction, lifecycle adversarial, non-régressions HTTP/WS, stratégie smoke live et graphes Cargo finaux.
- [`012-V0_2_9_YELLOWSTONE_GRPC.md`](012-V0_2_9_YELLOWSTONE_GRPC.md) — matrice active ouverte par `0.2.9-pre.001` : service Geyser courant, `Subscribe` standard, 7 unary, filtres/updates, dépendances/licence, replay/backpressure, Config V3 et interopérabilité PublicNode/OrbitFlare.

View File

@@ -0,0 +1,446 @@
<!-- file: docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md -->
<!-- version: 1 -->
# Validation `0.2.9` — Yellowstone gRPC standard/provider-neutral
> **Statut : matrice ouverte par `0.2.9-pre.001`. Les colonnes `DONE` ne seront cochées qu'après preuves réellement exécutées. Le gate d'ouverture a audité le proto/service, les licences, les dépendances et les fournisseurs live gratuits ; il n'a pas ajouté de client gRPC de production.**
## 1. Autorités du gate
Base interne :
```text
v0.2.8 / archive Gitea stable fournie
workspace.package.version initial = 0.2.8
deltas/0.2.8/rel.001.md
prompts/014-V0_2_9_START_PROMPT.md
```
Sources upstream auditées le `2026-08-23` :
```text
https://github.com/rpcpool/yellowstone-grpc/releases
https://github.com/rpcpool/yellowstone-grpc/blob/master/CHANGELOG.md
https://github.com/rpcpool/yellowstone-grpc/blob/master/LICENSING.md
https://github.com/rpcpool/yellowstone-grpc/blob/master/yellowstone-grpc-proto/proto/geyser.proto
https://github.com/rpcpool/yellowstone-grpc/blob/master/yellowstone-grpc-proto/proto/solana-storage.proto
https://docs.rs/crate/yellowstone-grpc-client/latest
https://docs.rs/crate/yellowstone-grpc-proto/latest
```
Divergence enregistrée :
```text
snapshot du prompt : GitHub release v14.2.2+solana.4.1.0
réaudit courant : GitHub release v15.1.2+solana.4.2.0 (2026-08-18)
crate client : 13.3.0
crate proto : 12.6.0
```
## 2. Baseline stable
| Gate | Preuve | État |
| --- | --- | --- |
| `cargo fmt --all` | log opérateur `v0.2.8` | DONE |
| audit Rust workspace | clean | DONE |
| `cargo check --workspace` | log opérateur | DONE |
| `cargo clippy --workspace --all-targets` | log opérateur | DONE |
| `cargo test --workspace` | log opérateur | DONE |
| Transport unit | 335 passed | DONE |
| Transport public API | 41 passed | DONE |
| Transport release completeness | 34 passed | DONE |
| Transport doctests | 4 passed | DONE |
| `cargo tree -p ksp-onchain-transport-lib` | log opérateur | DONE |
| `cargo tree --duplicates` | log opérateur | DONE |
## 3. Matrice service `Geyser`
| RPC | Forme | Classification | Scope | Preuve cible | État |
| --- | --- | --- | --- | --- | --- |
| `Subscribe` | bidi | standard | IN | fixture locale + live | TODO |
| `SubscribeDeshred` | bidi | Triton extension/pré-exécution malgré présence proto | OUT | canari d'absence/API | TODO |
| `SubscribeReplayInfo` | unary | standard | IN | fixture unary | TODO |
| `Ping` | unary | standard | IN | fixture unary | TODO |
| `GetLatestBlockhash` | unary | standard | IN | fixture unary | TODO |
| `GetBlockHeight` | unary | standard | IN | fixture unary | TODO |
| `GetSlot` | unary | standard | IN | fixture unary | TODO |
| `IsBlockhashValid` | unary | standard | IN | fixture unary | TODO |
| `GetVersion` | unary | standard | IN | fixture unary | TODO |
## 4. `SubscribeRequest` — coverage normative
### 4.1 Top-level
| Champ | Sémantique | Scope | Preuve |
| --- | --- | --- | --- |
| `accounts` | map filter-name -> account filter | IN | exact wire + bounds |
| `slots` | map -> slot filter | IN | exact wire |
| `transactions` | map -> transaction filter | IN | exact wire + bounds |
| `transactions_status` | map -> transaction filter | IN | exact wire + bounds |
| `blocks` | map -> block filter | IN | exact wire + bounds |
| `blocks_meta` | map -> empty filter | IN | presence/empty semantics |
| `entry` | map -> empty filter | IN | presence/empty semantics |
| `commitment` | optional Processed/Confirmed/Finalized | IN | omitted/value exact |
| `accounts_data_slice` | repeated offset/length | IN | order + bounds |
| `ping` | optional id | IN | Ping/Pong lifecycle |
| `from_slot` | optional u64 | IN | reconnect/replay tests |
### 4.2 Accounts
| Capacité | Scope | Preuve |
| --- | --- | --- |
| `account[]` | IN | order/cardinality/address validation |
| `owner[]` | IN | order/cardinality/address validation |
| `filters[]` | IN | AND semantics preserved structurally |
| `nonempty_txn_signature?` | IN | omitted/false/true |
| `cuckoo_accounts_filter?` | IN | exact wire + dimension/data bounds |
| memcmp bytes | IN | exact bytes + bounds |
| memcmp base58 | IN | exact string + validation |
| memcmp base64 | IN | exact string + validation |
| `datasize` | IN | exact u64 |
| `token_account_state` | IN | bool |
| lamports `eq/ne/lt/gt` | IN | oneof exact |
### 4.3 Slots
| Capacité | Scope | Preuve |
| --- | --- | --- |
| `filter_by_commitment?` | IN | optional semantics |
| `interslot_updates?` | IN | optional semantics |
| processed/confirmed/finalized | IN | enum decode |
| first_shred_received/completed/created_bank/dead | IN | enum decode + dead_error |
### 4.4 Transactions / transaction_status
| Capacité | Scope | Preuve |
| --- | --- | --- |
| `vote?` | IN | optional semantics |
| `failed?` | IN | optional semantics |
| `signature?` | IN | exact/validated |
| `account_include[]` | IN | order/bounds |
| `account_exclude[]` | IN | order/bounds |
| `account_required[]` | IN | order/bounds |
| `cuckoo_account_include?` | IN | exact wire + bounds |
| `token_accounts? = ALL` | IN | optional enum |
| `token_accounts? = BALANCE_CHANGED` | IN | optional enum |
### 4.5 Blocks
| Capacité | Scope | Preuve |
| --- | --- | --- |
| `account_include[]` | IN | order/bounds |
| `include_transactions?` | IN | optional semantics |
| `include_accounts?` | IN | optional semantics |
| `include_entries?` | IN | optional semantics |
| `cuckoo_account_include?` | IN | exact wire + bounds |
## 5. `SubscribeUpdate` — coverage normative
| Variante | Champs structurants | Scope | Preuve |
| --- | --- | --- | --- |
| `account` | account info, slot, is_startup | IN | exact decode |
| `slot` | slot, parent?, status, dead_error? | IN | exact decode |
| `transaction` | signature, vote, transaction, meta, index, slot | IN | exact decode |
| `transaction_status` | slot, signature, vote, index, err | IN | exact decode |
| `block` | hash/rewards/time/height/parents/counts + tx/accounts/entries | IN | exact decode + bounds |
| `ping` | marker | IN | lifecycle |
| `pong` | id | IN | lifecycle |
| `block_meta` | metadata/counts | IN | exact decode |
| `entry` | slot/index/hash/counts | IN | exact decode |
Top-level à préserver :
```text
filters[]
created_at
oneof absent/inconnu -> comportement explicitement testé
```
## 6. `solana-storage.proto` — nested wire utile
Le backend doit préserver les champs nécessaires des structures imbriquées actuelles, sans exposer les types upstream comme contrat public :
```text
ConfirmedBlock
ConfirmedTransaction
Transaction
Message
MessageHeader
MessageAddressTableLookup
TransactionStatusMeta
TransactionError
InnerInstructions / InnerInstruction
CompiledInstruction
TokenBalance / UiTokenAmount
ReturnData
Reward / Rewards
UnixTimestamp
BlockHeight
NumPartitions
```
États optionnels/legacy particulièrement sensibles :
```text
compute_units_consumed?
cost_units?
inner_instructions_none
log_messages_none
return_data_none
loaded writable/readonly addresses
commission / commission_bps
```
Preuve cible : fixtures issues du wire Protobuf + cas old/current + malformed/oversized, sans conversion JSON arbitraire.
## 7. Unary RPC matrix
| RPC | Request exact | Response exact | État |
| --- | --- | --- | --- |
| ReplayInfo | empty | `first_available?` | TODO |
| Ping | `count` | `count` | TODO |
| LatestBlockhash | `commitment?` | slot/hash/last_valid_height | TODO |
| BlockHeight | `commitment?` | block_height | TODO |
| Slot | `commitment?` | slot | TODO |
| IsBlockhashValid | blockhash + `commitment?` | slot + bool | TODO |
| Version | empty | version | TODO |
## 8. Dépendances / licence
| Gate | Décision `pre.001` | Preuve suivante |
| --- | --- | --- |
| repository default | AGPL-3.0-only | `LICENSING.md` |
| client subtree | Apache-2.0 | `LICENSING.md` |
| proto subtree | Apache-2.0 | `LICENSING.md` |
| strategy A client+proto | rejetée comme default | documenté |
| strategy B proto+Tonic KSP | **retenue** | `pre.002` compile/tree |
| strategy C vendored proto | fallback seulement | aucun vendoring pre.001 |
| system protoc | non attendu avec crate publiée | vérifier build réel |
| raw upstream types public | interdit par défaut | public API canary |
| executable Yellowstone deps | interdit | dependency firewall |
Versions observées :
```text
yellowstone-grpc-client 13.3.0
yellowstone-grpc-proto 12.6.0
tonic 0.14.x (0.14.6 latest observé)
prost/prost-types 0.14.x (0.14.4 latest observé)
```
## 9. Architecture / ownership
| Invariant | Preuve cible | État |
| --- | --- | --- |
| backend gRPC distinct HTTP/WS | source/API canary | TODO |
| aucun `WsProtocolKind` gRPC | source scan | TODO |
| Transport owns gRPC | dependency graph | TODO |
| Config -> Transport seulement | ownership test | TODO |
| Transport -X-> Config | ownership test | TODO |
| Transport -X-> std::env KSP_* | ownership test | TODO |
| Logging façade KSP only | logging ownership | TODO |
| no raw Tonic client escape hatch | public API canary | TODO |
| no provider-specific public types | public API/completeness | TODO |
## 10. Settings, bounds et redaction
À fermer par tests :
```text
endpoint schemes TLS/non-TLS explicitement validés
connect timeout > 0
unary timeout > 0
close timeout > 0
max inbound/outbound > 0 et plafonnés
request/update queue capacities > 0 et plafonnées
reconnect attempt/backoff bornés
filter-group count
filter-name length/uniqueness
metadata key/value count/size
account/owner/include/exclude/required counts
memcmp/data slice bounds
Cuckoo dimensions/data bounds
```
Security canaries :
```text
endpoint URL Debug redacted
secret metadata Debug/Display absent
Status message/details distants non recopiés aveuglément en context
TLS/connect error sans credential/URI sensible
request/update Debug sans payload arbitraire sensible
snapshot sans endpoint secret ni remote internals inutiles
```
## 11. Lifecycle / backpressure / replay
| Cas | Attendu | État |
| --- | --- | --- |
| stream open | session bornée | TODO |
| request mutation | ordre déterministe | TODO |
| server Ping -> client request ping -> Pong | explicite | TODO |
| server half-close | terminal/reconnect selon policy | TODO |
| client close | cleanup borné | TODO |
| receiver drop | cleanup capacité | TODO |
| slow subscription | pas de queue infinie | TODO |
| inbound oversized | rejet avant allocation excessive | TODO |
| outbound oversized | rejet avant write | TODO |
| reconnect budget | borné | TODO |
| resubscribe order | déterministe | TODO |
| `from_slot` | utilisé sans promesse lossless | TODO |
| ReplayInfo | informatif | TODO |
| duplicates | observables | TODO |
| gaps | observables | TODO |
| divergent node history | couverture documentée | TODO |
| shutdown during reconnect | aucune nouvelle connexion après shutdown | TODO |
Claims interdits sans nouvelle preuve :
```text
exactly-once
lossless
historical replay complet
ordre global sans gap
```
## 12. Config V3
Décision de gate :
```text
V1 HTTP reste lisible
V2 HTTP+WS reste lisible
V3 ajoute gRPC explicitement
```
Shape conceptuelle à matérialiser :
```text
globals.grpc_defaults
profiles[].grpc_endpoints[]
endpoint.metadata[] # public/non-secret
endpoint.secret_metadata[] # Config-owned secret provenance
```
Canaries :
| Gate | État |
| --- | --- |
| V1 backward readable | TODO |
| V2 backward readable | TODO |
| V3 schema strict | TODO |
| gRPC endpoint mapping | TODO |
| secret provenance enforced | TODO |
| safe projection redacted | TODO |
| no Transport -> Config | TODO |
| `.env.example` inventory if new env vars | TODO |
## 13. Fournisseurs live gratuits / durables
| Provider | Cluster gRPC gratuit confirmé | Nature | Priorité `0.2.9` | Verdict |
| --- | --- | --- | --- | --- |
| **PublicNode / Allnodes-backed** | Mainnet + Testnet | endpoint public, pas de plan payant requis observé | 1 | **IN smoke** |
| **OrbitFlare** | Devnet | Free $0, 10 RPS/1 TPS, unlimited credits | 2 | **IN smoke secondaire** |
| Tatum | Mainnet | Free durable mais 100K lifetime credits, 5 subscriptions | 3 | opérateur optionnel |
| Helius | aucun sur Free | Devnet Developer, Mainnet Business | — | OUT free |
| Shyft | aucun sur Free | Free indique No gRPC Access | — | OUT free |
| Alchemy | aucun sur Free | PAYG/Enterprise requis | — | OUT free |
| QuickNode | aucun sur Free | Scale/Business ou add-on payant | — | OUT free |
| Chainstack | aucun sur Free | add-on Yellowstone payant, Growth+ | — | OUT free |
| ERPC | aucun durable | plan Geyser payant, trial 1 jour | — | OUT free |
| NodeFlare | endpoint gRPC présent | plan Yellowstone mensuel payant | — | OUT free |
| Bitquery | pas Yellowstone standard | CoreCast custom, stream gratuit non garanti | — | OUT 0.2.9 |
| Solinfra | **non confirmé** | free tier + Yellowstone annoncés, entitlement gRPC free non explicite | recheck | CANDIDAT |
Sources provider :
```text
https://publicnode.com/
https://solana-yellowstone-grpc.publicnode.com/
https://orbitflare.com/pricing
https://docs.tatum.io/reference/solana-grpc
https://tatum.io/pricing
https://www.helius.dev/pricing
https://shyft.to/solana-rpc-grpc-pricing
https://www.alchemy.com/docs/reference/yellowstone-grpc-quickstart
https://www.quicknode.com/docs/solana/solana-grpc/overview
https://chainstack.com/pricing/
https://erpc.global/en/grpc/
https://nodeflare.app/solana
https://docs.bitquery.io/docs/grpc/solana/introduction/
https://solinfra.dev/
```
### Smoke PublicNode
Cible principale officiellement affichée :
```text
solana-yellowstone-grpc.publicnode.com:443
```
Testnet GRPC est officiellement listé. L'endpoint exact doit être confirmé avant commit d'un profil durable.
### Smoke OrbitFlare
Credential : jamais versionné. La clé/header gRPC exacte doit être confirmée depuis la documentation/live au moment du smoke ; le contrat Transport reste generic secret metadata.
## 14. Non-régressions obligatoires
| Surface héritée | Attendu final | État |
| --- | --- | --- |
| HTTP current | 52 typed | TODO final |
| HTTP historical | 14 Deprecated/Removed | TODO final |
| Standard WS | 18 opérations / 9 familles | TODO final |
| Helius WS | 7 standard + transaction | TODO final |
| Helius heartbeat | Ping 60 s | TODO final |
| Config V1/V2 | backward read | TODO final |
| Wallet/Wallet Desk | aucune dépendance protocolaire Yellowstone directe | TODO final |
## 15. Forecast / preuve par tranche
```text
pre.001 DONE audit + matrices + dependencies/license + providers + sizing
pre.002 TODO deps/settings/errors/facade + cargo tree
pre.003 TODO TLS/metadata + local fixture + 7 unary
pre.004 TODO Subscribe common + Cuckoo/token/from_slot/bounds
pre.005 TODO accounts + slots
pre.006 TODO transactions + transaction_status
pre.007 TODO blocks + block_meta + entry
pre.008 TODO bidi lifecycle/backpressure/half-close/shutdown
pre.009 TODO reconnect/replay/gap/duplicate/equivocation
pre.010 TODO Config V3
pre.011 TODO live PublicNode/OrbitFlare + compliance + final cargo graphs
pre.012 TODO docs/workspace final/prompt 0.2.10
rel.001 TODO stable
```
## 16. Gate `pre.001`
| Critère du prompt | Verdict |
| --- | --- |
| base stable `v0.2.8` confirmée | PASS |
| baseline opérateur enregistrée | PASS |
| upstream courant relu | PASS |
| divergence snapshot/latest enregistrée | PASS |
| service/proto exhaustif inventorié | PASS |
| standard vs provider extension classifié | PASS |
| `SubscribeDeshred` classifié | PASS / OUT |
| unary RPCs classifiés | PASS / 7 IN |
| replay/from_slot audités | PASS |
| strategy dependency choisie | PASS / B |
| licence auditée avant ajout | PASS |
| features/MSRV/transitifs audit initial | PASS / materialisation pre.002 |
| architecture distincte WS | PASS |
| metadata/auth neutral | PASS |
| Config shape décidée | PASS / V3 |
| resource/backpressure policy décidée | PASS |
| smoke ownership décidé | PASS |
| providers gratuits audités | PASS |
| release dimensionnée | PASS |
| forecast recalibré | PASS |
| split criteria écrits | PASS |
| aucune implémentation lourde prématurée | PASS |
**Verdict `pre.001` : gate positif ; `pre.002` peut matérialiser la stratégie B sous validation Cargo.**