0.3.16-pre.010

This commit is contained in:
2026-09-22 09:11:03 +02:00
parent 40add02ac2
commit ff88b0451a
5 changed files with 812 additions and 8 deletions

View File

@@ -1,8 +1,18 @@
<!-- file: CHANGELOG.md --> <!-- file: CHANGELOG.md -->
<!-- version: 35 --> <!-- version: 36 -->
# Changelog KSP # Changelog KSP
## 0.3.16 — fondations multi-variantes RAW, promotion canonique et quarantaine durable — 2026-09-22
`0.3.16` stabilise la fondation Store nécessaire à la convergence de plusieurs représentations `RawTransaction` pour une même identité `(network, signature)`. `ksp-store-api` porte désormais le comparateur backend-neutral `Exact / CompatibleLessComplete / CompatibleMoreComplete / Conflict / Incomparable` et les outcomes de variante associés. La dominance reste volontairement fail-closed : seule la troncature `logMessages` explicitement prouvée établit aujourd'hui une relation plus/moins complète ; les autres divergences ne sont jamais fusionnées ou départagées par provider. La migration PostgreSQL V003 est additive et conserve l'historique V000/V001/V002 inchangé ; elle introduit les variantes, le sélecteur canonique, le lien observation-variante et les conflict cases minimaux.
Le backend PostgreSQL sérialise la décision sous le verrou de l'identité V001. Une représentation `CompatibleMoreComplete` est promue atomiquement tout en conservant l'ancienne variante et en gardant la projection V001 cohérente avec le sélecteur canonique. Une divergence `Conflict` ou `Incomparable` conserve la variante entrante, ouvre ou réouvre un conflict case durable et enregistre l'observation sans muter le canonique. Le Worker ne possède plus d'arbitrage run-local plus fort que le Store : chaque acquisition atteint le Store, `QuarantinedConflict` est un succès non terminal, le Worker reste `Running` avec health `Degraded`, et le Job Backfill projette ce même résultat vers son état `Conflict` tout en conservant l'idempotence de l'observation.
Le hardening final couvre concurrence, rollback transactionnel, non-régression Store/Backfill/Worker et invariants de sélecteur/projection. La preuve live `postgres_raw_transaction_live` a été exécutée avec succès sur PostgreSQL 17, y compris les scénarios concurrents et récupérables. Les gates opérateur de `pre.008-fix.001` puis de la réconciliation documentaire `pre.009` passent audits Rust/Markdown, `cargo check --workspace`, Clippy workspace/all-targets/all-features avec `-D warnings` et les suites ciblées Store API, Store façade, PostgreSQL, Backfill et Worker sans échec.
La release se ferme volontairement avant la résolution opérateur complète, la rétention/pinning des variantes, le retry Store/backpressure `Blocked`, la reconnexion Transport configurable et l'UI de résolution Store Desk. `prompts/036-V0_3_17_START_PROMPT.md` ouvre `0.3.17` depuis le futur tag stable `v0.3.16` pour ces responsabilités backend/runtime et le cycle de vie complet des conflits/variantes ; `0.3.18` est réservé à l'inspection/résolution dans `ksp-app-store-desk`, puis le Backfill multi-route/multi-stratégie et son adaptation Desk sont repoussés respectivement à `0.3.19` et `0.3.20`.
## 0.3.15 — Raw Transaction Ingest Desk multi-route et fermeture live Mainnet — 2026-09-19 ## 0.3.15 — Raw Transaction Ingest Desk multi-route et fermeture live Mainnet — 2026-09-19
`0.3.15` livre `ksp-app-raw-transaction-ingest-desk` comme Desk Tauri KSP de composition et supervision des routes live `RawTransaction`. La Desk raisonne en routes complètes plutôt quen endpoints : une route nest composable que lorsque toutes ses capabilities Config/Transport requises existent sur le même réseau, puis le Start reconstruit les ressources backend et lance une instance `ksp-worker-raw-transaction-ingest-lib` indépendante par route sélectionnée. Plusieurs routes peuvent partager le même Store sans partager implicitement lifecycle, gaps, `TargetCoverage` ou réparation. Lapplication expose inventaire, Start/Stop ciblé, lifecycle, health, activité, backpressure, reconnect/replay, gaps/repair et compteurs sûrs sans déplacer Transport, Store ou logique dingestion dans le frontend. `0.3.15` livre `ksp-app-raw-transaction-ingest-desk` comme Desk Tauri KSP de composition et supervision des routes live `RawTransaction`. La Desk raisonne en routes complètes plutôt quen endpoints : une route nest composable que lorsque toutes ses capabilities Config/Transport requises existent sur le même réseau, puis le Start reconstruit les ressources backend et lance une instance `ksp-worker-raw-transaction-ingest-lib` indépendante par route sélectionnée. Plusieurs routes peuvent partager le même Store sans partager implicitement lifecycle, gaps, `TargetCoverage` ou réparation. Lapplication expose inventaire, Start/Stop ciblé, lifecycle, health, activité, backpressure, reconnect/replay, gaps/repair et compteurs sûrs sans déplacer Transport, Store ou logique dingestion dans le frontend.

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 649 # version: 650
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"] members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"]
[workspace.package] [workspace.package]
version = "0.3.16-pre.9" version = "0.3.16-pre.10"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: ROADMAP.md --> <!-- file: ROADMAP.md -->
<!-- version: 114 --> <!-- version: 115 -->
# Roadmap KSP # Roadmap KSP
@@ -108,9 +108,11 @@ RAW -> STRUCTURAL -> DECODED -> DOMAIN
- [X] `0.3.13` — Convergence live multi-source du Worker RAW livrée : composition caller-owned `1..32` sources dun même réseau, cinq familles Yellowstone / Standard Logs / Standard Block / Helius Transaction / HTTP Block Polling, hydration globale des trois voies reference-bearing, RAW-direct Legacy/V0/V1 pour les deux voies blocs, observations multiples, content conflict explicite, coalescence cross-source, fairness/backpressure/health source-neutral et shutdown hardening sans second actor Transport. Gate workspace complet vert (`1 850` PASS / `0` échec / `15` ignored) et smokes keyless HTTP + WebSocket Devnet verts ; les preuves provider/resource-gated non exécutées restent explicitement non revendiquées. - [X] `0.3.13` — Convergence live multi-source du Worker RAW livrée : composition caller-owned `1..32` sources dun même réseau, cinq familles Yellowstone / Standard Logs / Standard Block / Helius Transaction / HTTP Block Polling, hydration globale des trois voies reference-bearing, RAW-direct Legacy/V0/V1 pour les deux voies blocs, observations multiples, content conflict explicite, coalescence cross-source, fairness/backpressure/health source-neutral et shutdown hardening sans second actor Transport. Gate workspace complet vert (`1 850` PASS / `0` échec / `15` ignored) et smokes keyless HTTP + WebSocket Devnet verts ; les preuves provider/resource-gated non exécutées restent explicitement non revendiquées.
- [X] `0.3.14` — Gap repair/hardening multi-source du Worker RAW livré : gaps run-local bornés, distinction reconnect/replay/delivery/coverage, TargetCoverage conservative, coverage redondante prouvée, discovery HTTP bornée, known-reference hydration, réconciliation source-loss, health gap-aware, fairness nominal/repair, snapshots publics source-neutral et shutdown/drain renforcé. Le pipeline Common RAW/Store reste unique, Worker/Backfill restent indépendants, EARLY nest pas ajouté. Gate workspace complet vert (`1 931` PASS / `0` échec / `15` ignored) et smokes keyless HTTP + WebSocket Devnet verts ; preuves provider/resource-gated non provisionnées explicitement non revendiquées. - [X] `0.3.14` — Gap repair/hardening multi-source du Worker RAW livré : gaps run-local bornés, distinction reconnect/replay/delivery/coverage, TargetCoverage conservative, coverage redondante prouvée, discovery HTTP bornée, known-reference hydration, réconciliation source-loss, health gap-aware, fairness nominal/repair, snapshots publics source-neutral et shutdown/drain renforcé. Le pipeline Common RAW/Store reste unique, Worker/Backfill restent indépendants, EARLY nest pas ajouté. Gate workspace complet vert (`1 931` PASS / `0` échec / `15` ignored) et smokes keyless HTTP + WebSocket Devnet verts ; preuves provider/resource-gated non provisionnées explicitement non revendiquées.
- [X] `0.3.15``ksp-app-raw-transaction-ingest-desk` livrée comme Desk Tauri KSP multi-route : composition capability-driven par réseau, une instance Worker indépendante par route sélectionnée, Store partagé, Start/Stop ciblé et supervision lifecycle/health/backpressure/reconnect/replay/gaps/repair sans réimplémenter Transport ni persistence. Les cinq familles live sont projetées selon les capacités réellement configurées ; Yellowstone Mainnet utilise le trigger gRPC Block + HTTP `getBlock` et applique une backpressure bornée sans overflow local prolongé. Le Stop Yellowstone post-half-close est coopératif, et Store accepte le cas strict `canonique complet + incoming logMessages explicitement tronqué compatible` sans remplacer le canonique ni arrêter le Worker. Gate workspace/Clippy/tests/graphes/bundles Linux vert et live Mainnet Yellowstone + HTTP polling denviron 19 minutes fermé `Stopped/Healthy`. La généralisation variantes/conflits/promotions/retry/reconnect reste explicitement `0.3.16`. - [X] `0.3.15``ksp-app-raw-transaction-ingest-desk` livrée comme Desk Tauri KSP multi-route : composition capability-driven par réseau, une instance Worker indépendante par route sélectionnée, Store partagé, Start/Stop ciblé et supervision lifecycle/health/backpressure/reconnect/replay/gaps/repair sans réimplémenter Transport ni persistence. Les cinq familles live sont projetées selon les capacités réellement configurées ; Yellowstone Mainnet utilise le trigger gRPC Block + HTTP `getBlock` et applique une backpressure bornée sans overflow local prolongé. Le Stop Yellowstone post-half-close est coopératif, et Store accepte le cas strict `canonique complet + incoming logMessages explicitement tronqué compatible` sans remplacer le canonique ni arrêter le Worker. Gate workspace/Clippy/tests/graphes/bundles Linux vert et live Mainnet Yellowstone + HTTP polling denviron 19 minutes fermé `Stopped/Healthy`. La généralisation variantes/conflits/promotions/retry/reconnect reste explicitement `0.3.16`.
- [ ] `0.3.16`**RAW resilience / conflict management** : faire converger Store API/façade/PostgreSQL, Worker live et Store Desk autour de variantes RAW durables, résolution automatique `Exact / CompatibleLessComplete / CompatibleMoreComplete / Conflict`, quarantaine des conflits non résolus sans arrêt du Worker, historique réversible des promotions/résolutions, retry Store sans perte silencieuse et reconnexion Transport configurable/bornée. Une provenance provider n'est jamais une priorité canonique en soi ; la représentation prouvée la plus complète gagne. - [X] `0.3.16`**Fondations RAW multi-variantes et conflits durables** livrées : V003 additive avec variantes/sélecteur/mappings/conflict cases, comparateur backend-neutral fail-closed `Exact / CompatibleLessComplete / CompatibleMoreComplete / Conflict / Incomparable`, promotion canonique atomique de la représentation strictement prouvée plus complète, conservation de l'ancien canonique et quarantaine durable des divergences. Le Worker transmet toute acquisition au Store et traite `QuarantinedConflict` comme succès non terminal `Running/Degraded`; le Backfill conserve une projection `Conflict`. Hardening concurrence/rollback vert et preuve PostgreSQL 17 réelle passée. Résolution complète, rétention/pins, retry Store, reconnect configurable et UI sont explicitement reportés.
- [ ] `0.3.17`Étendre `ksp-job-backfill-lib` au **backfill multi-route/multi-stratégie** à partir de la matrice d'acquisition auditée en `0.3.9` et de la convergence Store `0.3.16`. Conserver `getSignaturesForAddress + getTransaction` comme première voie valide puis ajouter les stratégies historiques/catch-up réellement pertinentes sans edge Job ↔ Worker. - [ ] `0.3.17`**Résilience opérationnelle et cycle de vie des variantes** : contrats Store API backend-neutral d'inspection/résolution et classification `Transient/Terminal`, conflict cases complets avec participants/historique/reopen/races, rétention/pins/purge guards, façade Store d'inspection/actions, retry Store borné avec état `Blocked`, puis reconnexion WebSocket/Yellowstone configurable sans inventer de preuve de coverage.
- [ ] `0.3.18`Adapter `ksp-app-backfill-desk` au Job multi-route `0.3.17` : inventaire/composition de routes, sélection/supervision et progression sur le modèle structurel de `ksp-app-raw-transaction-ingest-desk`, sans réimplémenter la logique du Job. - [ ] `0.3.18`**Store Desk conflits/variantes** : exposer via `ksp-store-lib` uniquement les listes, détails, historique et actions opérateur `promote/keep/restore/reopen` avec revision attendue, pagination bornée, stale-action explicite, redaction et preuves Tauri/end-to-end pertinentes.
- [ ] `0.3.19` — Étendre `ksp-job-backfill-lib` au **backfill multi-route/multi-stratégie** à partir de la matrice d'acquisition auditée en `0.3.9` et des contrats Store stabilisés en `0.3.16``0.3.18`, sans edge Job ↔ Worker.
- [ ] `0.3.20` — Adapter `ksp-app-backfill-desk` au Job multi-route `0.3.19` : inventaire/composition de routes, sélection/supervision et progression sur le modèle structurel de `ksp-app-raw-transaction-ingest-desk`, sans réimplémenter la logique du Job.
### TODO/IDEAS — applications spécialisées et control plane ### TODO/IDEAS — applications spécialisées et control plane
@@ -120,7 +122,7 @@ RAW -> STRUCTURAL -> DECODED -> DOMAIN
### TODO/IDEAS — taxonomie D1, processing et rétention ### TODO/IDEAS — taxonomie D1, processing et rétention
- [ ] **TODO** — maintenir la matrice dadmission HTTP/WS/gRPC/provider lors de toute nouvelle famille D1 : plusieurs sources ne convergent vers un même struct que si elles satisfont la même sémantique sans perte. - [ ] **TODO** — maintenir la matrice dadmission HTTP/WS/gRPC/provider lors de toute nouvelle famille D1 : plusieurs sources ne convergent vers un même struct que si elles satisfont la même sémantique sans perte.
- [X] **TODO `0.3.9`** — matrice RAW Transaction unique produite et consolidée dans `docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md`, avec séparation possibilités/support/preuve, capabilities orthogonales aux producteurs, provenance/déduplication/continuité et handoffs désormais scindés `0.3.11``0.3.14` Worker live / `0.3.16` résilience RAW / `0.3.17``0.3.18` Backfill multi-route. - [X] **TODO `0.3.9`** — matrice RAW Transaction unique produite et consolidée dans `docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md`, avec séparation possibilités/support/preuve, capabilities orthogonales aux producteurs, provenance/déduplication/continuité et handoffs désormais scindés `0.3.11``0.3.14` Worker live / `0.3.16` fondations de résilience RAW / `0.3.17` résilience opérationnelle + cycle de vie des variantes / `0.3.18` Store Desk conflits / `0.3.19``0.3.20` Backfill multi-route et Desk.
- [X] **TODO Helius `0.3.13`** — la voie Worker Helius `transactionSubscribe` réutilise la surface Transport et les profils Config Helius déjà existants avec `KSP_SECRET_HELIUS_API_KEY`; aucun nouveau profil, secret, SDK provider, tier codé ou second client parallèle na été nécessaire. Le payload riche reste Transport-owned et la voie Worker hydrate via `getTransaction observed` tant que le RAW complet nest pas prouvé directement. - [X] **TODO Helius `0.3.13`** — la voie Worker Helius `transactionSubscribe` réutilise la surface Transport et les profils Config Helius déjà existants avec `KSP_SECRET_HELIUS_API_KEY`; aucun nouveau profil, secret, SDK provider, tier codé ou second client parallèle na été nécessaire. Le payload riche reste Transport-owned et la voie Worker hydrate via `getTransaction observed` tant que le RAW complet nest pas prouvé directement.
- [X] **TODO réseau** — identité KSP canonique fixée à `mainnet` dans Config/Store/Transport/tests ; `mainnet-beta` reste uniquement un alias legacy/externe lorsque la frontière provider l'exige. Les données D1 RAW antérieures restent non autoritaires pendant cette phase et aucune compatibilité de base de test n'impose l'ancien libellé. - [X] **TODO réseau** — identité KSP canonique fixée à `mainnet` dans Config/Store/Transport/tests ; `mainnet-beta` reste uniquement un alias legacy/externe lorsque la frontière provider l'exige. Les données D1 RAW antérieures restent non autoritaires pendant cette phase et aucune compatibilité de base de test n'impose l'ancien libellé.
- [X] `RawAccountState` + observation — contrat commun stabilisé en `0.3.1` avec bytes complets + slot, provenance séparée et enrichissements source-specific optionnels ; la persistence PostgreSQL physique est complétée en `0.3.4` avec les quatre capabilities account et la conformance RAW 10/10. - [X] `RawAccountState` + observation — contrat commun stabilisé en `0.3.1` avec bytes complets + slot, provenance séparée et enrichissements source-specific optionnels ; la persistence PostgreSQL physique est complétée en `0.3.4` avec les quatre capabilities account et la conformance RAW 10/10.

100
deltas/0.3.16/pre.010.md Normal file
View File

@@ -0,0 +1,100 @@
<!-- file: deltas/0.3.16/pre.010.md -->
<!-- version: 1 -->
# Delta `0.3.16-pre.010`
## Base
```text
0.3.16-pre.009
```
Le gate opérateur de `pre.009` est entièrement vert : audits Rust/Markdown, `cargo check --workspace`, Clippy workspace/all-targets/all-features en `-D warnings`, suites Store API, Store façade, PostgreSQL, Job Backfill et Worker jusqu'à `release_completeness`.
## Objectif
Dernière prerelease de `0.3.16`, limitée strictement à la préparation de publication conformément à `VER-LIFECYCLE-003` :
```text
Cargo.toml
CHANGELOG.md
ROADMAP.md
prompt de démarrage 0.3.17
delta pre.010
```
Aucun code, test fonctionnel, README/USAGE, plan, validation, architecture, règle, schema, config ou migration n'est modifié.
## Changements
### Version workspace
La version devient :
```text
0.3.16-pre.10
```
### `CHANGELOG.md`
Ajout de l'entrée stable `0.3.16`, limitée au périmètre réellement livré :
- fondations RAW multi-variantes ;
- V003 additive ;
- comparateur fail-closed partagé ;
- sélecteur canonique et promotion atomique strictement prouvée ;
- conflit durable minimal et quarantaine non terminale ;
- continuité Worker `Running/Degraded` ;
- compatibilité Backfill ;
- hardening concurrence/rollback ;
- preuve PostgreSQL 17 réellement exécutée ;
- reports explicites vers `0.3.17`/`0.3.18`.
### `ROADMAP.md`
- `0.3.16` passe à `[X]` avec son périmètre réel ;
- `0.3.17` devient la résilience opérationnelle et le cycle de vie complet des variantes ;
- `0.3.18` devient la Store Desk d'inspection/résolution ;
- le Backfill multi-route et sa Desk sont repoussés à `0.3.19` et `0.3.20` ;
- le rappel de trajectoire issu de l'audit `0.3.9` est réaligné sur ce découpage.
### Prompt `0.3.17`
Création de :
```text
prompts/036-V0_3_17_START_PROMPT.md
```
Le prompt impose une ouverture depuis le futur tag stable `v0.3.16` et réserve `pre.001` à l'audit/sizing des contrats d'inspection/résolution, du cycle de vie des conflict cases, des revisions/races, de la rétention/pinning, de la classification Store `Transient/Terminal`, du retry Worker et de la reconnexion Transport configurable avant toute implémentation lourde.
## Fichiers livrés
```text
Cargo.toml
CHANGELOG.md
ROADMAP.md
prompts/036-V0_3_17_START_PROMPT.md
deltas/0.3.16/pre.010.md
```
## Validations de génération
Exécutées sur la livraison assemblée :
```bash
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
```
Le gate Cargo final reste à exécuter par l'opérateur après application du delta.
## Décisions de fermeture
`pre.010` ne rouvre aucun document durable réconcilié en `pre.009` et ne corrige aucun comportement. Toute anomalie fonctionnelle ou documentaire durable découverte après cette tranche doit repasser par un couloir de prerelease approprié avant `rel.001`, conformément à `VER-LIFECYCLE-010/012`.
Après gate propre de `pre.010`, la livraison suivante attendue est :
```text
0.3.16-rel.001
```

View File

@@ -0,0 +1,692 @@
<!-- file: prompts/036-V0_3_17_START_PROMPT.md -->
<!-- version: 1 -->
# Prompt de démarrage `0.3.17` — résilience opérationnelle et cycle de vie des variantes RAW
## 1. Identité de la release et base exacte requise
Ouvrir **uniquement** `0.3.17` depuis la release stable/taggée :
```text
v0.3.16
```
Ne pas démarrer depuis `0.3.16-pre.*`, depuis une archive intermédiaire ou depuis un état de travail non taggé.
La première livraison attendue est :
```text
0.3.17-pre.001
```
`pre.001` est obligatoirement un gate de **lecture + audit Store API/Store/PostgreSQL/Worker/Transport/Config + audit du cycle de vie durable des variantes/conflits + audit des erreurs transient/terminal + brainstorming + sizing + planification**.
Il est interdit de commencer directement par une UI Store Desk, un moteur de retry générique, une migration opportuniste ou une boucle de reconnexion parallèle avant fermeture de ce gate.
## 2. Mission et résultat attendu
`0.3.16` a livré les fondations multi-variantes : comparaison fail-closed, sélecteur canonique, promotion strictement prouvée, conservation des variantes et quarantaine durable minimale sans arrêt du Worker.
`0.3.17` doit transformer cette fondation en mécanisme opérable et résilient côté backend/runtime, sans ouvrir encore l'UI Store Desk.
Le résultat cible est :
```text
plusieurs représentations RAW durables
-> inspection backend-neutral
-> conflict case complet et revisionné
-> participants/historique durable
-> résolution explicite et concurrent-safe
-> restore/reopen possibles selon contrat
-> rétention/pins empêchant la perte d'une variante encore nécessaire
Store temporairement indisponible
-> classification Transient / Terminal
-> retry borné avec backpressure explicite
-> aucun drop silencieux
-> health/activity cohérentes
-> cancellation/drain pendant backoff
Transport live temporairement indisponible
-> mécanisme de reconnexion propriétaire réutilisé
-> configuration bornée
-> aucune confusion entre reconnexion, replay delivery et preuve de coverage
```
La release doit fournir les contrats nécessaires à `0.3.18`, où `ksp-app-store-desk` exposera ensuite l'inspection et les actions opérateur.
## 3. Principes directeurs acquis
Les principes suivants sont déjà décidés et ne doivent pas être redébattus sans preuve nouvelle :
```text
une divergence de données != une panne d'acquisition
Store est l'autorité de convergence durable
une provenance/provider n'est jamais une priorité canonique en soi
content_hash seul n'est jamais une preuve d'égalité lorsque les bytes sont disponibles
la dominance reste fail-closed
seule une complétude explicitement prouvée autorise une promotion automatique
un conflit non résolu conserve toutes les variantes nécessaires
reconnexion != coverage
retry != duplication silencieuse
```
Le Worker ne doit pas réintroduire un arbitre run-local plus fort que le Store.
## 4. Sources de vérité internes obligatoires — ordre de lecture
### 4.1 Gouvernance générale
Lire intégralement, dans cet ordre :
```text
RULES.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/rules/RULES_GENERAL.md
docs/rules/RULES_KSP.md
docs/rules/RULES_RUST.md
docs/rules/RULES_DEPENDENCIES.md
docs/rules/RULES_DOCUMENTATION.md
docs/rules/FILE_CONTRACTS.md
docs/rules/VERSION_WORKFLOW.md
docs/rules/PROMPT_STRUCTURE.md
```
Le présent prompt complète ces règles ; il ne les remplace pas.
Rappels bloquants :
```text
Rust 2024
unsafe interdit
unwrap / expect / panic interdits selon les règles KSP
retours explicites ; clippy::implicit_return deny
#![warn(missing_docs)]
#![deny(unreachable_pub)]
#![forbid(unsafe_code)]
pas de pub mod
pub/pub(crate) partagés reexportés via crate root
accès partagés via crate::Item, y compris intra-crate
unit tests sous unit_tests/
integration tests sous tests/
```
### 4.2 Handoff stable `0.3.16`
Lire intégralement :
```text
prompts/035-V0_3_16_START_PROMPT.md
docs/plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md
docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md
docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md
deltas/0.3.16/pre.001.md
...
deltas/0.3.16/pre.010.md
deltas/0.3.16/rel.001.md
```
Les `pre.*-fix.*` réellement présents doivent également être lus lorsqu'ils corrigent une tranche citée.
Lorsque `rel.001.md` n'est pas encore présent dans l'archive fournie à l'ouverture de la session, **ne pas l'inventer** : vérifier d'abord que la base est bien le tag stable `v0.3.16` et utiliser le commit/tag comme autorité.
### 4.3 Store API et façade
Lire et auditer réellement :
```text
crates/ksp-store-api/README.md
crates/ksp-store-api/USAGE.md
crates/ksp-store-api/src/
crates/ksp-store-api/tests/
crates/ksp-store-lib/README.md
crates/ksp-store-lib/USAGE.md
crates/ksp-store-lib/src/
crates/ksp-store-lib/tests/
```
Auditer en particulier :
```text
RawTransactionVariant*
RawTransactionVariantComparison
RawTransactionVariantWriteOutcome
RawAcquisitionWriteOutcome
capabilities RawTransaction existantes
surface d'inspection actuelle
codes d'erreur Store et backend-neutralité
object safety et stabilité des traits publics
rétention RawTransaction existante
```
`0.3.17-pre.001` doit décider les DTOs/capabilities backend-neutral nécessaires pour :
```text
lister/inspecter variantes
lister/inspecter conflict cases
lire l'historique de résolution
résoudre/promouvoir/conserver/restaurer/réouvrir avec revision attendue
classifier les erreurs Store Transient / Terminal sans exposer le backend physique
```
Aucune API publique ne doit exposer `tokio-postgres`, SQL, row handles ou détails provider.
### 4.4 Backend PostgreSQL et migration V003
Lire :
```text
crates/ksp-store-postgres-lib/README.md
crates/ksp-store-postgres-lib/USAGE.md
crates/ksp-store-postgres-lib/src/
crates/ksp-store-postgres-lib/tests/
crates/ksp-store-postgres-lib/unit_tests/
crates/ksp-store-postgres-lib/resources/
```
État acquis à préserver :
```text
V000/V001/V002 figés
V003 additive
ksp_raw_transaction_variants
ksp_raw_transaction_canonical_selectors
ksp_raw_transaction_observation_variants
ksp_raw_transaction_conflicts
```
Le sélecteur canonique et la projection V001 doivent rester atomiquement cohérents.
Toute extension physique de `0.3.17` doit être additive, migrationnée et justifiée par un contrat métier réel. Ne pas modifier rétroactivement les ressources/checksums stables.
Auditer avant conception :
```text
FOR UPDATE / ordre des locks
revision compare-and-set
participants d'un conflict case
historique append-only
reopen après résolution
races ingestion <-> résolution
races résolution <-> rétention
rollback transactionnel
idempotence des actions opérateur
```
### 4.5 Common RAW et règles de comparaison
Lire :
```text
crates/ksp-raw-transaction-lib/README.md
crates/ksp-raw-transaction-lib/USAGE.md
crates/ksp-raw-transaction-lib/src/
crates/ksp-raw-transaction-lib/tests/
```
Le comparateur `0.3.16` reste l'autorité de classification automatique. Ne pas élargir la dominance pour faciliter l'UI ou réduire artificiellement le nombre de conflits.
État acquis :
```text
Exact
CompatibleLessComplete
CompatibleMoreComplete
Conflict
Incomparable
```
La seule dominance actuellement prouvée concerne les formes strictes de troncature `logMessages` documentées. Les autres différences restent fail-closed tant qu'une preuve spécifique n'existe pas.
### 4.6 Worker live
Lire :
```text
crates/ksp-worker-api/
crates/ksp-worker-raw-transaction-ingest-lib/README.md
crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md
crates/ksp-worker-raw-transaction-ingest-lib/src/
crates/ksp-worker-raw-transaction-ingest-lib/tests/
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/
```
État acquis :
```text
chaque acquisition atteint le Store
convergence run-local = sérialisation seulement
QuarantinedConflict = succès durable non terminal
Worker reste Running
health devient Degraded
legacy ERROR_CODE_RAW_CONFLICT reste terminal uniquement comme compatibilité backend ancien
```
`0.3.17` doit ajouter le comportement Store transient sans perdre cet invariant.
La politique de retry doit expliciter :
```text
quels codes/classes sont Transient
quels codes/classes sont Terminal
borne de tentatives ou budget temporel
backoff borné
jitter éventuel et ownership
backpressure amont
état Blocked/Degraded/Unhealthy attendu
cancellation pendant sleep/backoff
shutdown/drain avec tentative en vol
absence de double persistence après résultat durable
```
### 4.7 Transport et Config
Lire :
```text
crates/ksp-onchain-transport-lib/README.md
crates/ksp-onchain-transport-lib/USAGE.md
crates/ksp-onchain-transport-lib/src/
crates/ksp-onchain-transport-lib/tests/
crates/ksp-config-lib/README.md
crates/ksp-config-lib/USAGE.md
crates/ksp-config-lib/src/
crates/ksp-config-lib/tests/
```
Réutiliser les mécanismes propriétaires actuels HTTP/WebSocket/Yellowstone. Ne pas créer une seconde pile réseau dans le Worker.
La reconnexion configurable doit conserver la séparation :
```text
reconnect attempt
session resume / from_slot / ReplayInfo lorsque disponible
replay delivery
coverage proof
```
Aucun de ces éléments ne vaut automatiquement un autre.
### 4.8 Job Backfill existant
Lire au minimum :
```text
crates/ksp-job-backfill-lib/README.md
crates/ksp-job-backfill-lib/USAGE.md
crates/ksp-job-backfill-lib/src/persistence.rs
crates/ksp-job-backfill-lib/unit_tests/persistence.rs
```
Le Job Backfill reste un producteur indépendant et doit continuer de fonctionner avec les évolutions Store. `0.3.17` n'est pas la release du Backfill multi-route/multi-stratégie.
### 4.9 Architecture et références durables
Lire :
```text
docs/architecture/004-COMPONENT_INVENTORY.md
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md
docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md
```
Ces documents décrivent l'état réconcilié à la fermeture de `0.3.16` et doivent servir de baseline, pas les anciens objectifs devenus obsolètes du prompt `035`.
## 5. Sources externes normatives à réauditer en `pre.001`
Réauditer uniquement les sources officielles ou upstream réellement nécessaires :
```text
PostgreSQL : transactions, row locking, deadlocks, serialization failures et SQLSTATE
Tokio PostgreSQL : erreurs de connexion/IO/DB et possibilités de classification sûres
Solana JSON-RPC/WebSocket : comportement de session/subscription/reconnect applicable
Yellowstone gRPC upstream : lifecycle de stream, fermeture, reprise/from_slot/ReplayInfo applicable
Tokio/Tonic/Tungstenite utilisés par les crates actuelles : cancellation/reconnect lorsque pertinent
```
La réaudition doit distinguer :
```text
fait documenté upstream
comportement observé par KSP
politique KSP choisie
```
Ne jamais transformer un message d'erreur provider arbitraire en contrat public KSP.
## 6. État validé de `0.3.16` à préserver
À l'ouverture de `0.3.17`, considérer comme acquis uniquement ce qui est présent dans le tag `v0.3.16` et confirmé par ses deltas/validation.
La baseline attendue comprend :
```text
Store API comparator backend-neutral
V003 additive et historique V000/V001/V002 intact
variants durables
canonical selector revisionné
observation -> variant mapping
conflict case minimal durable
promotion CompatibleMoreComplete atomique
ancien canonique conservé comme variante
Conflict/Incomparable quarantinés sans mutation canonique
Worker Running/Degraded après QuarantinedConflict
Backfill projection Conflict compatible
PostgreSQL live proof exécutée sur PostgreSQL 17
```
Le gate final de `0.3.16` doit être lu dans `docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md` et dans les deltas de fermeture ; ne pas inventer un résultat non enregistré.
## 7. Cycle de vie complet des conflict cases
Le modèle minimal `0.3.16` ne suffit pas à une résolution opérateur complète.
`pre.001` doit cadrer précisément :
```text
identité stable du conflict case
participants/variantes concernées
status Open / Resolved et éventuels états supplémentaires réellement nécessaires
reason/relation conservées
revision monotone
resolved canonical variant
actor/reason opérateur si un contrat KSP sûr le justifie
journal append-only de transitions
reopen quand une nouvelle divergence survient
idempotence d'une résolution répétée
stale revision explicite
```
Une résolution ne doit jamais détruire immédiatement la variante perdante si elle reste nécessaire à l'historique, au rollback ou à un conflict case ouvert.
## 8. Actions et concurrence
Les actions opérateur futures de `0.3.18` doivent être rendues sûres par les contrats backend de `0.3.17`.
Auditer et définir au minimum :
```text
promote candidate
keep current canonical
restore previous variant
resolve conflict
reopen conflict
```
Chaque action mutable doit avoir une sémantique de revision attendue ou équivalent compare-and-set. Une action stale doit échouer explicitement sans écraser une décision concurrente.
Les races à couvrir incluent :
```text
ingestion -> nouvelle variante pendant résolution
promotion automatique -> résolution manuelle concurrente
résolution A -> résolution B concurrente
réouverture -> résolution précédente
rétention/purge -> variante encore référencée
force rehydrate -> identité existante avec bytes exacts/différents
```
## 9. Rétention, pins et rollback
La rétention doit être définie avant tout purge de variante.
Principe :
```text
une variante nécessaire à un selector, conflict case ouvert, historique de résolution ou rollback autorisé ne peut pas disparaître silencieusement
```
`pre.001` doit décider :
```text
quels objets pin une variante
quand un pin peut être relâché
archive vs purge
interaction avec RawRetentionState V001
interaction avec ForceRehydrate
restore depuis variante locale conservée
comportement si une ancienne variante est déjà physiquement absente
```
Le réseau n'est pas un mécanisme normal de rollback d'une variante précédemment connue.
## 10. Classification Store `Transient / Terminal`
La classification doit être backend-neutral à la frontière publique tout en restant suffisamment précise pour le runtime.
Ne pas classifier par texte libre d'erreur.
`pre.001` doit produire une matrice au moins pour :
```text
connexion indisponible / reset
pool temporairement indisponible
timeout/cancellation locale
deadlock/serialization retryable si applicable
constraint/data-invalid
migration/schema mismatch
network mismatch KSP
stale revision
retention conflict
secret/config invalid
```
La classe publique doit être stable et sûre ; le backend conserve les détails physiques privés.
## 11. Retry Store, backpressure et état `Blocked`
Le retry appartient au Worker/runtime consumer, pas au backend PostgreSQL sous forme de boucle cachée illimitée.
Le Store backend peut classifier et retourner ; le Worker décide une politique bornée selon les contrats KSP.
Le design doit éviter :
```text
queue mémoire non bornée
retry storm
sleep non cancellable
perte silencieuse après exhaustion
health Healthy pendant une impossibilité persistante de commit
double écriture après succès ambigu sans idempotence
```
La relation avec les limites actuelles `in_flight`/admission doit être explicitement testée.
## 12. Reconnexion Transport configurable
`0.3.17` étend les mécanismes existants ; il ne crée pas une abstraction universelle inventée au-dessus de toutes les routes.
La configuration doit être bornée et cohérente avec les contrats Config existants :
```text
attempt/backoff limits
connect/session deadlines
stop preemption
source supervision
replay/from_slot lorsque réellement supporté
```
Une reconnexion réussie ne ferme aucun gap à elle seule. Les contrats `0.3.14` de coverage/gap repair restent autoritaires.
## 13. Frontières de crates et hors UI
Frontières cibles :
```text
ksp-store-api
DTOs/capabilities backend-neutral
ksp-store-postgres-lib
SQL, locks, transactions, migrations, classification physique
ksp-store-lib
façade et dispatch backend-neutral
ksp-worker-raw-transaction-ingest-lib
politique retry/backpressure/health/cancellation
ksp-onchain-transport-lib
sessions/reconnect/replay transport-owned
ksp-config-lib
configuration bornée des mécanismes existants
```
`ksp-app-store-desk` n'est pas à développer dans `0.3.17`. Seuls les contrats nécessaires à sa future utilisation doivent être stabilisés.
## 14. Sécurité et redaction
Ne jamais exposer dans erreurs/logs/snapshots publics :
```text
URI PostgreSQL
password/token/API key
endpoint complet lorsque sa publication n'est pas nécessaire
payload RAW
signature brute si les règles de surface l'interdisent
server error arbitraire
SQL complet
row/backend handle
```
Les diagnostics de conflits existants restent bornés et structurels.
Toute nouvelle action de résolution doit journaliser seulement les identifiants/codes sûrs nécessaires à l'audit.
## 15. Première mission `pre.001` — audit, brainstorming et sizing
Avant toute implémentation lourde :
1. vérifier que la base est exactement `v0.3.16` ;
2. lire toutes les sources internes de la section 4 ;
3. réauditer les sources externes pertinentes de la section 5 ;
4. inventorier les contrats publics actuels Store/Worker/Transport/Config ;
5. produire le modèle conceptuel complet conflict case / participants / history / resolution / reopen ;
6. produire la stratégie de revision/CAS et la matrice des races ;
7. produire la politique de rétention/pins/rollback/ForceRehydrate ;
8. produire la classification `Transient / Terminal` et son ownership ;
9. produire la politique Worker de retry/backpressure/Blocked/cancellation ;
10. produire la politique Transport reconnect/config sans confondre coverage ;
11. auditer la compatibilité du Job Backfill existant ;
12. dimensionner les migrations/tests/live proofs ;
13. créer ou réviser le plan `0.3.17` avec prereleases bornées ;
14. publier seulement ensuite `0.3.17-pre.001`.
Critères de sortie `pre.001` :
```text
contrats Store API proposés et bornés
modèle conflict lifecycle validé
revision/race semantics validées
rétention/pins validés
classification Transient/Terminal validée
retry ownership et bornes validés
reconnect ownership et bornes validés
compatibilité Backfill explicitée
migration strategy validée
preuves live nécessaires identifiées
prévision souple des prereleases publiée
hors-périmètre explicite
```
## 16. Prévision souple initiale des prereleases
Cette trajectoire provient du plan réconcilié `0.3.16`. Elle doit être réauditée en `pre.001` et peut être subdivisée si le sizing l'exige.
```text
pre.001 audit + contrats Store API inspection/résolution + classification Transient/Terminal + plan
pre.002 conflict cases complets : participants, résolution, reopen, historique append-only, races
pre.003 rétention des variantes : archive, pins, purge guards, rollback local, ForceRehydrate
pre.004 ksp-store-lib : inspection/historique/actions backend-neutral + compatibilité Backfill
pre.005 Worker : Store retry/backpressure/Blocked, exhaustion, cancellation et drain pendant backoff
pre.006 Transport/Config : reconnect WebSocket/Yellowstone configurable sur mécanismes existants
pre.007 hardening cross-layer + preuves live ciblées Store outage/recovery, retry, reconnect, concurrence
pre.008 réconciliation documentaire finale
pre.009 préparation de publication : CHANGELOG + ROADMAP + prompt 0.3.18
rel.001 publication stable mécanique
```
Ne jamais fusionner artificiellement les couloirs de fermeture. Les règles `VER-LIFECYCLE-*` restent autoritaires si le nombre de tranches évolue.
## 17. Hors périmètre de `0.3.17`
Ne pas inclure :
```text
frontend/backend Tauri Store Desk de résolution -> 0.3.18
backfill multi-route/multi-stratégie -> 0.3.19
adaptation Backfill Desk -> 0.3.20
RAW -> STRUCTURAL
persistence STRUCTURAL
DECODED / DOMAIN
majority voting provider
priorité provider
fusion heuristique de JSON arbitraire
retry illimité caché dans le backend Store
nouvelle pile réseau Worker parallèle à Transport
nouvelle dépendance Worker <-> Backfill
```
## 18. Versionnement, deltas, validation et instruction d'ouverture
Respecter strictement `docs/rules/VERSION_WORKFLOW.md`.
Les deltas de `0.3.17` utilisent :
```text
ksp-general-0.3.17-pre.NNN.zip
ksp-general-0.3.17-pre.NNN-fix.NNN.zip
```
Après toute modification Rust :
```bash
cargo fmt --all
cargo fmt --all -- --check
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
```
Pour tout Markdown touché :
```bash
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
```
Les tests ciblés sont préférés pendant le développement ; les gates complets et live proofs sont réservés aux tranches prévues et ne sont déclarés PASS que lorsqu'ils ont réellement été exécutés.
Les tests PostgreSQL live qui lisent une URI dédiée sur `stdin` doivent continuer à ne jamais l'échoer ni la conserver dans les logs/deltas.
Pour les applications Desk, ne pas utiliser `npm run build` comme gate manuel. `0.3.17` ne développe normalement pas la Store Desk ; si un smoke Tauri devenait nécessaire pour une compatibilité mécanique, utiliser le workflow Tauri/Vite KSP prévu par les règles.
### Instruction d'ouverture de la prochaine session
Commencer par :
```text
1. vérifier que la base est exactement le tag stable v0.3.16 ;
2. lire toutes les sources internes de la section 4 dans l'ordre ;
3. réauditer les sources externes pertinentes de la section 5 ;
4. exécuter la mission pre.001 de la section 15 ;
5. produire le plan/sizing avant toute migration ou développement lourd.
```
Ne pas commencer par l'UI Store Desk, par une boucle de retry ou par une migration avant d'avoir fermé le gate `pre.001`.
La trajectoire suivante est :
```text
0.3.17 résilience opérationnelle + cycle de vie des variantes
0.3.18 Store Desk inspection/résolution des variantes et conflits
0.3.19 Backfill multi-route/multi-stratégie
0.3.20 Backfill Desk correspondant
```