v0.3.5-pre.001-fix.001
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md -->
|
||||
<!-- version: 1 -->
|
||||
<!-- version: 2 -->
|
||||
|
||||
# Plan `0.3.5` — Interface passive acquisition events
|
||||
|
||||
@@ -21,7 +21,7 @@ label = 0.3.5-pre.001
|
||||
|
||||
`0.3.5-pre.001` est un gate de lecture, inventaire, convergence sémantique, threat model, sizing et planification. Il ne modifie aucun contrat public Rust, aucun DTO Transport, aucun modèle Store, aucun runtime et aucune persistence.
|
||||
|
||||
Le résultat du gate est volontairement étroit : **une seule famille satisfait actuellement les critères d'admission Interface**, le lifecycle de slot sur une intersection minimale de statuts réellement commune entre les surfaces Solana WebSocket et Yellowstone. Toutes les autres familles restent Transport, Store ou reportées.
|
||||
Le résultat du gate reste volontairement étroit, mais `pre.001-fix.001` corrige deux conclusions trop conservatrices : le lifecycle de slot possède une intersection de **sept** stages communs après normalisation sémantique explicite, et `TransactionExecutionEvent` est rouvert comme candidat actif de `0.3.5` sans être encore admis. Les payloads riches, les logs complets, les snapshots/commitments de signature et les DTOs provider/protocol restent Transport ou Store selon leur ownership.
|
||||
|
||||
## 2. Mission
|
||||
|
||||
@@ -224,7 +224,7 @@ Une égalité de noms ne suffit pas. Une proximité de commitment ne suffit pas.
|
||||
## 6. Inventaire producer -> nature de fait
|
||||
|
||||
| Producer / surface | Nature du fait | Champs structurants obligatoires | Optionalité utile | Ordre / lifecycle | Timestamp semantics | Error semantics | Metadata session/provider | Volume potentiel | Persistent/replayable ? |
|
||||
|----------------------------------------|-------------------------------------|-------------------------------------------------------|-----------------------------------|---------------------------------------------------|-------------------------------------------|----------------------------------------|----------------------------------------|-----------------------|-----------------------------------------|
|
||||
| -------------------------------------- | ----------------------------------- | ----------------------------------------------------- | --------------------------------- | ------------------------------------------------- | ----------------------------------------- | -------------------------------------- | -------------------------------------- | --------------------- | --------------------------------------- |
|
||||
| Solana WS `slotSubscribe` | progression de slot | slot, parent, root | aucune | event répété à chaque slot traité | aucun | aucune | subscription id hors DTO métier | minime | non |
|
||||
| Solana WS `rootSubscribe` | progression de root | root slot | aucune | event répété lors du changement de root | aucun | aucune | subscription id | minime | non |
|
||||
| Solana WS `slotsUpdatesSubscribe` | lifecycle interne slot | slot, type, timestamp | parent/stats/error selon variante | multi-event par slot ; méthode instable | Unix update timestamp en ms | texte seulement pour `dead` | subscription id | faible à modéré | non |
|
||||
@@ -248,7 +248,7 @@ Une égalité de noms ne suffit pas. Une proximité de commitment ne suffit pas.
|
||||
### 6.1 Consumers actuels et imminents
|
||||
|
||||
| Consumer | Besoin actuel / prévu | Dépendance à Interface event | Décision `pre.001` |
|
||||
|-------------------------------------------|-----------------------------------------------------------|------------------------------|---------------------------------------------------------------------------|
|
||||
| ----------------------------------------- | --------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------- |
|
||||
| `ksp-program-api` | ProgramInstruction / ProgramAccountMeta | non | préserver la surface Program existante ; aucun re-export acquisition |
|
||||
| `0.3.6` premier backfill RAW | range historique -> Transport -> RAW ingestion -> Store | non | ne pas forcer SlotLifecycle dans le backfill |
|
||||
| futur worker RAW live | subscriptions/fetch live multi-transport -> RAW ingestion | oui, candidat concret | consumer proche justifiant une projection slot lifecycle provider-neutral |
|
||||
@@ -257,54 +257,90 @@ Une égalité de noms ne suffit pas. Une proximité de commitment ne suffit pas.
|
||||
|
||||
## 7. Matrice de convergence sémantique
|
||||
|
||||
| Nature candidate | Sources comparées | Intersection exacte retenue | Différences non représentables sans perte | Projection commune lossless pour le fait ciblé ? | Consumer concret | Owner | Décision |
|
||||
|-----------------------------|---------------------------------------------------------------------------|-------------------------------------------------------------------|------------------------------------------------------------------------------------|--------------------------------------------------|-----------------------------------|-----------------|-----------------|
|
||||
| lifecycle slot | slotSubscribe + slotsUpdates + Yellowstone Slot | Processed, FirstShredReceived, Completed, CreatedBank, Dead | parent/root/timestamps/diagnostics ; Frozen/Optimistic/Root vs Confirmed/Finalized | oui, pour l'occurrence `slot + stage` | futur worker RAW live | Interface | ADMIS |
|
||||
| root/finality | rootSubscribe + slotsUpdates Root + Yellowstone Finalized | aucune | root et finalized ne sont pas déclarés équivalents par une norme commune | non | aucun besoin exact démontré | Transport | REPORTÉ |
|
||||
| logs realtime | logsSubscribe + transaction meta logs + Yellowstone tx | signature/logs seulement au prix de perdre la nature de la source | event logs vs matière d'une transaction complète | non pour un fait unique | hydratation possible, non requise | Transport | REPORTÉ |
|
||||
| transaction status | getSignatureStatuses + signatureSubscribe + Yellowstone TransactionStatus | aucune | snapshot vs transition commitment vs execution update | non | aucun contrat unique démontré | Transport | REPORTÉ |
|
||||
| vote | voteSubscribe + Yellowstone transaction `is_vote` | qualificatif « vote » seulement | gossip pré-consensus vs transaction exécutée | non | aucun besoin commun démontré | Transport | REPORTÉ |
|
||||
| account/program | WS account/program + Yellowstone Account | état account complet possible | persistance/replay déjà possédés par RawAccountState/Observation | non comme event distinct | RAW ingestion | Store/Transport | REJET Interface |
|
||||
| transaction complète | HTTP/WS/Helius/Yellowstone transaction | transaction complète selon source | format/commitment/provider metadata ; RawTransaction déjà canonique Store | non comme second type | RAW ingestion | Store/Transport | REJET Interface |
|
||||
| block | getBlock/blockSubscribe/Yellowstone Block | slot + block container | payloads/options/reconstruction ; pas de consumer passif minimal prouvé | non | extraction RAW transaction | Transport | REJET Interface |
|
||||
| Yellowstone Entry | Yellowstone uniquement | aucune multi-source | mono-producer et protocole-specific | non | aucun | Transport | REJET Interface |
|
||||
| persisted-data available | Store after commit | référence durable compacte conceptuelle | event réseau sans relation ; owner déjà normé par KSP-NOTIFY | oui mais hors owner Interface | processors futurs | Store API | REJET Interface |
|
||||
| Helius Enhanced transaction | Helius uniquement | aucune multi-source indépendante | filtres/options/provider behavior | non | Transport consumer | Transport | REJET Interface |
|
||||
| Nature candidate | Sources comparées | Intersection exacte retenue | Différences non représentables sans perte | Projection commune lossless pour le fait ciblé ? | Consumer concret | Owner | Décision |
|
||||
| ----------------------------- | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------ | ----------------------------- | ------------------------------ | ------------------- |
|
||||
| lifecycle slot | slotSubscribe + slotsUpdates + rootSubscribe + Yellowstone Slot | Processed, FirstShredReceived, Completed, CreatedBank, Dead, OptimisticallyConfirmed, Rooted | Frozen ; parent/timestamps/diagnostics ; noms wire Confirmed/Finalized côté Yellowstone | oui, pour l'occurrence `slot + stage` | futur worker RAW live | Interface | ADMIS |
|
||||
| transaction execution | logsSubscribe + Yellowstone TransactionStatus + Helius transactionSubscribe | candidat `slot + signature + outcome` | signature primitive KSP à définir ; metadata/provider/detail modes ; delivery semantics | à confirmer par gate dédié avant création du type | futur worker RAW live | Interface si gate passe | CANDIDAT ACTIF |
|
||||
| logs realtime | logsSubscribe + transaction/meta Yellowstone/Helius | logs associés à une transaction | volume/bornes, richesse de source, disponibilité selon détail | non admis dans cette release sans consumer/bornes | hydratation possible | Interface si futur gate | IDÉE DIFFÉRÉE |
|
||||
| signature commitment/snapshot | getSignatureStatuses + signatureSubscribe | identité de signature seulement | snapshot HTTP vs transition one-shot commitment | non comme event d'exécution | aucun contrat unique démontré | Transport | REPORTÉ |
|
||||
| vote | voteSubscribe + Yellowstone transaction `is_vote` | qualificatif « vote » seulement | gossip pré-consensus vs transaction exécutée | non | aucun besoin commun démontré | Transport | REPORTÉ |
|
||||
| account/program | WS account/program + Yellowstone Account | état account complet possible | persistance/replay déjà possédés par RawAccountState/Observation | non comme event distinct | RAW ingestion | Store/Transport | REJET Interface |
|
||||
| transaction complète | HTTP/WS/Helius/Yellowstone transaction | transaction complète selon source | format/commitment/provider metadata ; RawTransaction déjà canonique Store | non comme second type | RAW ingestion | Store/Transport | REJET Interface |
|
||||
| block | getBlock/blockSubscribe/Yellowstone Block | slot + block container | payloads/options/reconstruction ; pas de consumer passif minimal prouvé | non | extraction RAW transaction | Transport | REJET Interface |
|
||||
| Yellowstone Entry | Yellowstone aujourd'hui | aucune multi-source démontrée | mono-producer et protocole-specific aujourd'hui | non aujourd'hui ; futur fait transversal -> Interface | aucun actuel | Transport DTO | REPORTÉ |
|
||||
| persisted-data available | Store after commit | référence durable compacte conceptuelle | event réseau sans relation ; owner déjà normé par KSP-NOTIFY | oui mais hors owner Interface | processors futurs | Store API | REJET Interface |
|
||||
| Helius Enhanced transaction | Helius transactionSubscribe | peut contribuer au candidat TransactionExecutionEvent | filtres/options/provider behavior et DTO riche | DTO non ; projection sémantique possible via converter | futur worker RAW live | Transport DTO / Interface fact | PRODUCTEUR CANDIDAT |
|
||||
|
||||
### 7.1 Lifecycle de slot — ADMIS sous intersection stricte
|
||||
|
||||
| Fait commun | Solana standard | Yellowstone | Décision Interface | Metadata volontairement non commune |
|
||||
|--------------------------|-----------------------------------------|----------------------|--------------------|--------------------------------------------------------------------------------|
|
||||
| slot traité | `slotSubscribe` | `Processed` | ADMIS | parent/root courant côté WS ; filters/created_at/parent côté Yellowstone |
|
||||
| premier shred reçu | `FirstShredReceived` | `FirstShredReceived` | ADMIS | timestamp WS ; created_at/filters côté Yellowstone |
|
||||
| ingestion slot complétée | `Completed` | `Completed` | ADMIS | timestamp WS ; created_at/filters côté Yellowstone |
|
||||
| bank créé | `CreatedBank` | `CreatedBank` | ADMIS | parent requis WS, optionnel Yellowstone ; il reste dans le DTO Transport riche |
|
||||
| slot mort | `Dead` | `Dead` | ADMIS | diagnostics source-specific et horodatages restent Transport |
|
||||
| frozen | `Frozen` | aucun statut exact | REJETÉ | pas d'intersection |
|
||||
| optimistic confirmation | `OptimisticConfirmation` | `Confirmed` | REJETÉ | aucune équivalence normative exacte retenue |
|
||||
| root | `rootSubscribe` / `slotsUpdates` `Root` | `Finalized` | REJETÉ | aucune équivalence normative exacte retenue |
|
||||
| confirmed | aucun événement exact retenu | `Confirmed` | REJETÉ | pas de producer standard exact |
|
||||
| finalized | aucun événement exact retenu | `Finalized` | REJETÉ | root n'est pas promu artificiellement en finalized |
|
||||
| Fait commun | Solana standard | Yellowstone | Stage KSP | Décision Interface | Metadata volontairement non commune |
|
||||
| ------------------------ | --------------------------------------- | -------------------- | ------------------------- | ------------------ | ------------------------------------------------------------------------------ |
|
||||
| slot traité | `slotSubscribe` | `Processed` | `Processed` | ADMIS | parent/root courant côté WS ; filters/created_at/parent côté Yellowstone |
|
||||
| premier shred reçu | `FirstShredReceived` | `FirstShredReceived` | `FirstShredReceived` | ADMIS | timestamp WS ; created_at/filters côté Yellowstone |
|
||||
| ingestion slot complétée | `Completed` | `Completed` | `Completed` | ADMIS | timestamp WS ; created_at/filters côté Yellowstone |
|
||||
| bank créé | `CreatedBank` | `CreatedBank` | `CreatedBank` | ADMIS | parent requis WS, optionnel Yellowstone ; il reste dans le DTO Transport riche |
|
||||
| slot mort | `Dead` | `Dead` | `Dead` | ADMIS | diagnostics source-specific et horodatages restent Transport |
|
||||
| confirmation optimiste | `OptimisticConfirmation` | `Confirmed` | `OptimisticallyConfirmed` | ADMIS | le nom KSP conserve la sémantique Solana ; delivery reste Transport |
|
||||
| root atteint | `rootSubscribe` / `slotsUpdates` `Root` | `Finalized` | `Rooted` | ADMIS | le nom KSP évite de généraliser `Finalized` au-delà du mapping audité |
|
||||
| frozen | `Frozen` | aucun statut exact | — | REJETÉ | pas d'intersection |
|
||||
|
||||
Le fait commun est volontairement plus petit que chaque DTO producteur. La conversion **n'efface pas** le DTO Transport : elle ajoute une projection passive `slot + stage` pour les consumers qui n'ont besoin que de l'occurrence de l'étape commune.
|
||||
|
||||
Le timestamp n'entre pas dans le contrat commun : `slotsUpdatesSubscribe.timestamp` décrit l'horodatage Unix de l'update côté validator alors que `YellowstoneUpdateTimestamp` est une metadata de création serveur. Les réunir sous un seul champ produirait une fausse équivalence.
|
||||
|
||||
Le `parent`, le root courant et `dead_error` restent également source-owned ; un consumer qui en a besoin doit conserver le DTO Transport ou définir un contrat supérieur spécifique.
|
||||
Le `parent`, le root courant exposé comme metadata de certaines notifications, `dead_error` et les détails de delivery restent source-owned ; un consumer qui en a besoin doit conserver le DTO Transport ou définir un contrat supérieur spécifique. Les mappings `OptimisticConfirmation -> OptimisticallyConfirmed <- Yellowstone Confirmed` et `Root -> Rooted <- Yellowstone Finalized` sont des normalisations sémantiques documentées, pas des renommages universels des commitments Solana.
|
||||
|
||||
### 7.2 Logs realtime — REPORTÉ
|
||||
### 7.2 Transaction execution — CANDIDAT ACTIF
|
||||
|
||||
Le payload standard `logsSubscribe` est compact et event-only, mais le gate ne démontre pas une deuxième surface sémantiquement indépendante qui produise exactement le même fait :
|
||||
`pre.001-fix.001` sépare désormais l'**exécution observée d'une transaction** des snapshots/commitments de signature. Trois producers peuvent exposer le même fait minimal :
|
||||
|
||||
- Helius standard réutilise le wire standard Solana et n'ajoute donc pas un nouveau contrat ;
|
||||
- Yellowstone expose des logs dans la transaction/meta complète, pas une notification `logsSubscribe` équivalente ;
|
||||
- la signature + logs peut déclencher une hydratation, mais ce besoin pourra être porté directement par le DTO Transport tant qu'un consumer multi-transport concret n'exige pas une projection commune.
|
||||
```text
|
||||
Solana logsSubscribe
|
||||
-> context slot + signature + err
|
||||
|
||||
Aucun `RawLog`, `TransactionLogEvent` ou équivalent public n'est donc créé en `0.3.5` sauf réouverture explicite du gate avec un nouveau producer/consumer.
|
||||
Yellowstone TransactionStatus
|
||||
-> slot + signature + err + metadata Yellowstone
|
||||
|
||||
### 7.3 Transaction status — REPORTÉ
|
||||
Helius transactionSubscribe
|
||||
-> slot + signature/transaction + résultat d'exécution selon le detail mode
|
||||
```
|
||||
|
||||
Les trois familles restent distinctes :
|
||||
Le contrat candidat est conceptuellement :
|
||||
|
||||
```text
|
||||
TransactionExecutionEvent {
|
||||
slot,
|
||||
signature,
|
||||
outcome = Succeeded | Failed,
|
||||
}
|
||||
```
|
||||
|
||||
Il n'est **pas encore admis** dans `pre.001-fix.001`. Un gate dédié doit encore démontrer :
|
||||
|
||||
- une représentation KSP-owned de la signature compatible avec le dependency firewall actuel ;
|
||||
- que le mapping Helius retenu reste valide pour les detail modes réellement supportés sans dépendre d'un payload complet ;
|
||||
- que `err == null` / `err != null` suffit bien à définir le fait `Succeeded` / `Failed` sans copier l'erreur source ;
|
||||
- que le consumer proche justifie cette projection sans concurrencer `RawTransaction`/`RawTransactionObservation`.
|
||||
|
||||
Les DTOs `logsSubscribe`, Yellowstone `TransactionStatus` et Helius `transactionSubscribe` restent intégralement Transport-owned. Seule une éventuelle projection passive commune appartiendrait à Interface.
|
||||
|
||||
### 7.3 Logs realtime et signature commitment — DIFFÉRENCIÉS
|
||||
|
||||
Les logs ne sont plus utilisés comme argument pour rejeter l'exécution commune : `logsSubscribe` peut produire un `TransactionExecutionEvent` sans que les lignes de logs entrent dans le contrat partagé.
|
||||
|
||||
Une éventuelle famille distincte reste une **idée différée** :
|
||||
|
||||
```text
|
||||
TransactionLogEvent {
|
||||
slot,
|
||||
signature,
|
||||
logs,
|
||||
}
|
||||
```
|
||||
|
||||
Elle n'est pas admise en `0.3.5` tant que les bornes, la disponibilité multi-producer et un consumer concret ne sont pas démontrés. Aucun `RawLog` n'est créé.
|
||||
|
||||
Les surfaces de commitment/snapshot restent séparées de l'exécution :
|
||||
|
||||
```text
|
||||
HTTP getSignatureStatuses
|
||||
@@ -312,12 +348,9 @@ HTTP getSignatureStatuses
|
||||
|
||||
WS signatureSubscribe
|
||||
= transition one-shot vers le commitment demandé, éventuellement précédée de ReceivedSignature
|
||||
|
||||
Yellowstone transaction_status
|
||||
= update execution/status avec signature, slot, is_vote, index et error
|
||||
```
|
||||
|
||||
Une struct avec de nombreux `Option` perdrait les distinctions entre snapshot, observation de réception, transition de commitment et update d'exécution. La décision de `0.3.1` est donc confirmée.
|
||||
Aucun `TransactionCommitmentEvent` n'est admis. Une future famille de commitment devra être auditée indépendamment et ne pourra pas être fusionnée avec `TransactionExecutionEvent` par une struct à nombreux `Option`.
|
||||
|
||||
### 7.4 Vote — REPORTÉ
|
||||
|
||||
@@ -346,9 +379,9 @@ La conversion Transport -> Store API reste à la composition.
|
||||
|
||||
`RawTransaction` et `RawTransactionObservation` sont déjà Store-owned. Les blocs servent de conteneurs d'acquisition ou de payloads Transport riches. Aucun `RawBlock`, `TransactionEvent` ou `BlockEvent` transversal n'est ajouté.
|
||||
|
||||
### 7.7 Yellowstone Entry — REJET Interface
|
||||
### 7.7 Yellowstone Entry — Transport aujourd'hui, ownership sémantique réservé
|
||||
|
||||
`Entry` n'a qu'un producer/protocole démontré et ne possède aucun consumer transversal proche. Il reste strictement Transport.
|
||||
`SubscribeUpdateEntry` reste un DTO Yellowstone strictement Transport-owned : un seul producer/protocole est démontré aujourd'hui et aucun consumer transversal proche ne justifie un type partagé. Cette décision ne réserve toutefois pas le **fait** à Transport : si une future seconde source permet de reconstruire un même `LedgerEntryEvent` provider-neutral, ce nouveau fait passif devra être audité pour ownership Interface, sans déplacer le DTO Yellowstone lui-même.
|
||||
|
||||
### 7.8 Notification after commit — REJET Interface
|
||||
|
||||
@@ -366,6 +399,8 @@ pub enum SlotLifecycleStage {
|
||||
Completed,
|
||||
CreatedBank,
|
||||
Dead,
|
||||
OptimisticallyConfirmed,
|
||||
Rooted,
|
||||
}
|
||||
|
||||
pub struct SlotLifecycleEvent {
|
||||
@@ -405,7 +440,7 @@ Contraintes :
|
||||
- aucune conversion `From<TransportType>` dans Interface, car cela créerait une dépendance interdite ;
|
||||
- les converters appartiennent au futur consumer/composition ou, si un usage concret le justifie plus tard, à une crate de composition dédiée.
|
||||
|
||||
Le nom final peut être ajusté pendant `pre.002` seulement si les canaris montrent une ambiguïté réelle. Le sens `slot + stage commun` ne doit pas être élargi.
|
||||
Le nom final peut être ajusté pendant `pre.002` seulement si les canaris montrent une ambiguïté réelle. Le sens `slot + stage commun` ne doit pas être élargi. `OptimisticallyConfirmed` et `Rooted` sont volontairement préférés à `Confirmed` et `Finalized` afin de conserver la sémantique KSP du fait normalisé sans transformer les labels Yellowstone en terminologie universelle.
|
||||
|
||||
## 9. Consumer proche et usage concret
|
||||
|
||||
@@ -425,7 +460,7 @@ Cette API ne devient pas un prérequis de `0.3.6` : le premier backfill historiq
|
||||
## 10. Anti-duplication Store
|
||||
|
||||
| Contrat Store comparé | Chevauchement avec `SlotLifecycleEvent` | Pourquoi il n'y a pas de seconde vérité |
|
||||
|-----------------------------|-----------------------------------------|-----------------------------------------------------------------------------------------------|
|
||||
| --------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------- |
|
||||
| `RawTransaction` | slot possible seulement | aucun payload/signature/format/hash ; l'event ne peut reconstruire une transaction |
|
||||
| `RawTransactionObservation` | slot indirect possible | aucune provenance acquisition, observation key ou timestamp durable |
|
||||
| `RawAccountState` | slot possible seulement | aucune pubkey/state hash/lamports/owner/data ; aucun état account |
|
||||
@@ -476,22 +511,22 @@ future acquisition composition / RAW live worker
|
||||
|
||||
## 12. Threat model
|
||||
|
||||
| Risque | Menace | Garde planifiée |
|
||||
|--------------------------------|------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
|
||||
| mega enum | Interface devient catalogue de tous les transports | une seule famille étroite ; aucun `Event` générique |
|
||||
| Option soup | sémantiques différentes fusionnées par champs optionnels | `slot + stage` seulement ; status/log/vote non convergents reportés |
|
||||
| persistence creep | event-only devient second Store | aucun RAW/payload/cursor/retention ; `KSP-NOTIFY-*` reste Store API |
|
||||
| transport wrapper | copie des DTOs WS/gRPC/provider | aucune metadata protocol/provider dans le type Interface |
|
||||
| faux timestamp commun | horodatages WS et Yellowstone confondus | aucun timestamp partagé |
|
||||
| root/finality confusion | `root` normalisé artificiellement en `Finalized` | aucun stage Root/Finalized tant qu'une équivalence normative exacte n'est pas démontrée |
|
||||
| optimistic/confirmed confusion | `OptimisticConfirmation` fusionné à `Confirmed` | deux états exclus de l'intersection |
|
||||
| dead diagnostic leak | texte provider/validator traverse une API partagée durable | stage `Dead` sans diagnostic ; détail reste Transport |
|
||||
| cross-network confusion | event sans réseau mélangé entre sessions | conversion autorisée seulement dans une composition déjà liée à un contexte réseau ; pas de network id dupliqué |
|
||||
| unbounded payload | logs/JSON/bytes entrent dans Interface | aucun payload variable dans la famille admise |
|
||||
| public enum breakage | ajout futur casse les matches externes | `SlotLifecycleStage` non-exhaustive |
|
||||
| logging/runtime creep | crate passive acquiert tracing/Tokio/channel | aucune dependency/runtime/logging ajoutée |
|
||||
| Helius semantic promotion | extension provider devient norme KSP | Enhanced `transactionSubscribe` reste Transport |
|
||||
| Yellowstone protocol promotion | `Entry`/filters/created_at deviennent Interface | types Yellowstone restent Transport |
|
||||
| Risque | Menace | Garde planifiée |
|
||||
| ------------------------------ | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
||||
| mega enum | Interface devient catalogue de tous les transports | familles admises séparées et étroites ; aucun `Event` générique |
|
||||
| Option soup | sémantiques différentes fusionnées par champs optionnels | familles séparées : SlotLifecycle ; candidat TransactionExecution ; logs/commitment restent distincts |
|
||||
| persistence creep | event-only devient second Store | aucun RAW/payload/cursor/retention ; `KSP-NOTIFY-*` reste Store API |
|
||||
| transport wrapper | copie des DTOs WS/gRPC/provider | aucune metadata protocol/provider dans le type Interface |
|
||||
| faux timestamp commun | horodatages WS et Yellowstone confondus | aucun timestamp partagé |
|
||||
| root/finality confusion | label Yellowstone `Finalized` promu comme vérité universelle | stage KSP `Rooted` ; mapping source explicite `Root <-> Yellowstone Finalized` sans renommer le fait KSP |
|
||||
| optimistic/confirmed confusion | label Yellowstone `Confirmed` promu comme commitment générique | stage KSP `OptimisticallyConfirmed` ; mapping source explicite avec l'optimistic confirmation Solana |
|
||||
| dead diagnostic leak | texte provider/validator traverse une API partagée durable | stage `Dead` sans diagnostic ; détail reste Transport |
|
||||
| cross-network confusion | event sans réseau mélangé entre sessions | conversion autorisée seulement dans une composition déjà liée à un contexte réseau ; pas de network id dupliqué |
|
||||
| unbounded payload | logs/JSON/bytes entrent dans Interface | aucun payload variable dans la famille admise |
|
||||
| public enum breakage | ajout futur casse les matches externes | `SlotLifecycleStage` non-exhaustive |
|
||||
| logging/runtime creep | crate passive acquiert tracing/Tokio/channel | aucune dependency/runtime/logging ajoutée |
|
||||
| Helius semantic promotion | DTO/provider extension devient norme KSP | `transactionSubscribe` reste Transport ; seule une projection sémantique commune peut devenir Interface |
|
||||
| Yellowstone protocol promotion | DTO `Entry`/filters/created_at deviennent Interface | types Yellowstone restent Transport ; un futur fait transversal est réaudité séparément |
|
||||
|
||||
## 13. Stratégie de tests
|
||||
|
||||
@@ -523,14 +558,22 @@ SolanaSlotUpdate::FirstShredReceived -> FirstShredReceived
|
||||
SolanaSlotUpdate::Completed -> Completed
|
||||
SolanaSlotUpdate::CreatedBank -> CreatedBank
|
||||
SolanaSlotUpdate::Dead -> Dead
|
||||
YellowstoneSlotStatus équivalents -> mêmes stages
|
||||
SolanaSlotUpdate::OptimisticConfirmation -> OptimisticallyConfirmed
|
||||
SolanaRoot / SolanaSlotUpdate::Root -> Rooted
|
||||
YellowstoneSlotStatus::Confirmed -> OptimisticallyConfirmed
|
||||
YellowstoneSlotStatus::Finalized -> Rooted
|
||||
YellowstoneSlotStatus autres équivalents -> mêmes stages
|
||||
```
|
||||
|
||||
Et devra explicitement refuser de convertir les variantes hors intersection en un faux stage commun.
|
||||
Et devra explicitement refuser `Frozen` ou toute variante future sans mapping audité au lieu d'inventer un faux stage commun.
|
||||
|
||||
## 13.3 Traçabilité des candidats différés
|
||||
|
||||
`TransactionExecutionEvent` reste un candidat actif de cette release et est donc suivi dans le présent plan/validation plutôt que déplacé dans un TODO durable avant son gate. `TransactionLogEvent` est explicitement une idée différée. Si cette idée reste hors scope à la réconciliation documentaire finale, elle doit être reportée dans la surface TODO/IDEAS durable appropriée au lieu d'être perdue avec le plan de release.
|
||||
|
||||
## 14. Prévision souple des prereleases
|
||||
|
||||
La release est dimensionnée pour rester dans une seule session et ne possède qu'une famille fonctionnelle retenue.
|
||||
La release reste dimensionnée pour une seule session. `SlotLifecycleEvent` est la seule famille admise immédiatement ; `TransactionExecutionEvent` devient un second candidat actif qui doit passer un gate dédié avant toute implémentation.
|
||||
|
||||
### `0.3.5-pre.001` — audit + plan
|
||||
|
||||
@@ -549,16 +592,22 @@ La release est dimensionnée pour rester dans une seule session et ne possède q
|
||||
- tests unitaires et public API ciblés ;
|
||||
- préserver le graphe Core-only.
|
||||
|
||||
### `0.3.5-pre.003` — canaris externes + complétude API
|
||||
### `0.3.5-pre.003` — gate `TransactionExecutionEvent`
|
||||
|
||||
- external consumer ;
|
||||
- auditer la représentation de signature compatible avec les règles de dépendances ;
|
||||
- prouver les mappings exacts Solana `logsSubscribe` / Yellowstone `TransactionStatus` / Helius `transactionSubscribe` ;
|
||||
- vérifier anti-duplication Store et consumer concret ;
|
||||
- si et seulement si le gate est complet, implémenter la famille minimale `slot + signature + outcome` ;
|
||||
- sinon enregistrer explicitement le rejet/report sans type partiel.
|
||||
|
||||
### `0.3.5-pre.004` — canaris externes + complétude API
|
||||
|
||||
- external consumer pour toutes les familles effectivement admises ;
|
||||
- inventaire exact des modules/exports ;
|
||||
- canaris négatifs contre Transport/Store/runtime/serde/logging ;
|
||||
- non-exhaustive et stabilité de la surface.
|
||||
|
||||
Cette tranche ne crée aucune deuxième famille d'event sauf réouverture documentée du gate avec preuve nouvelle. Le défaut est de conserver logs/status/vote/root reportés.
|
||||
|
||||
### `0.3.5-pre.004` — hardening final
|
||||
### `0.3.5-pre.005` — hardening final
|
||||
|
||||
- adversarial/API hardening ;
|
||||
- absence de payload/source metadata ;
|
||||
@@ -566,20 +615,20 @@ Cette tranche ne crée aucune deuxième famille d'event sauf réouverture docume
|
||||
- validation du graphe et des dépendances ;
|
||||
- aucun élargissement fonctionnel opportuniste.
|
||||
|
||||
### `0.3.5-pre.005` — gate technique final
|
||||
### `0.3.5-pre.006` — gate technique final
|
||||
|
||||
- gates Rust/workspace complets ;
|
||||
- `cargo tree` Interface normal/features/duplicates ;
|
||||
- aucun smoke live requis : le contrat est passif et ne possède aucun réseau.
|
||||
- aucun smoke live requis : les contrats Interface restent passifs et ne possèdent aucun réseau.
|
||||
|
||||
### `0.3.5-pre.006` — réconciliation documentaire finale
|
||||
### `0.3.5-pre.007` — réconciliation documentaire finale
|
||||
|
||||
- plan + validation ;
|
||||
- README/USAGE Interface durables et version-neutral ;
|
||||
- architecture durable uniquement si le rôle Interface doit être explicité ;
|
||||
- aucun CHANGELOG/ROADMAP/prompt suivant dans cette tranche.
|
||||
|
||||
### `0.3.5-pre.007` — préparation de publication
|
||||
### `0.3.5-pre.008` — préparation de publication
|
||||
|
||||
Lane minimale :
|
||||
|
||||
@@ -588,7 +637,7 @@ Cargo.toml
|
||||
CHANGELOG.md
|
||||
ROADMAP.md
|
||||
prompts/025-V0_3_6_START_PROMPT.md
|
||||
deltas/0.3.5/pre.007.md
|
||||
deltas/0.3.5/pre.008.md
|
||||
```
|
||||
|
||||
Aucun code, README/USAGE, plan ou validation ne doit être rouvert ici.
|
||||
@@ -642,11 +691,13 @@ persistence ou migration Store
|
||||
nouvelle capability Store
|
||||
RawLog / RawBlock
|
||||
TransactionStatusObservation fusionné
|
||||
TransactionCommitmentEvent fusionné avec execution
|
||||
TransactionLogEvent sans nouveau gate de bornes/consumer
|
||||
VoteEvent partagé
|
||||
Root == Finalized
|
||||
OptimisticConfirmation == Confirmed
|
||||
label KSP `Finalized` utilisé comme alias universel de root
|
||||
label KSP `Confirmed` utilisé comme alias universel d'optimistic confirmation
|
||||
Helius Enhanced DTO dans Interface
|
||||
Yellowstone Entry dans Interface
|
||||
Yellowstone Entry DTO dans Interface
|
||||
serde/wincode/borsh ajouté sans protocole réel
|
||||
logging/runtime dans Interface
|
||||
conversion Transport -> Interface possédée par Interface
|
||||
@@ -658,8 +709,9 @@ La release peut fermer si et seulement si :
|
||||
|
||||
```text
|
||||
une famille minimale SlotLifecycle est publique et bornée
|
||||
intersection = Processed + FirstShredReceived + Completed + CreatedBank + Dead
|
||||
aucune variante hors intersection n'est normalisée artificiellement
|
||||
intersection = Processed + FirstShredReceived + Completed + CreatedBank + Dead + OptimisticallyConfirmed + Rooted
|
||||
Frozen et toute variante future sans mapping audité ne sont pas normalisées artificiellement
|
||||
TransactionExecutionEvent est soit admis après son gate dédié, soit explicitement reporté sans type partiel
|
||||
aucun payload/diagnostic/timestamp/provider metadata n'entre dans Interface
|
||||
Interface reste Core-only
|
||||
Store RAW 10/10 reste inchangé
|
||||
|
||||
Reference in New Issue
Block a user