0.3.16-pre.010
This commit is contained in:
12
CHANGELOG.md
12
CHANGELOG.md
@@ -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 qu’en endpoints : une route n’est 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. L’application expose inventaire, Start/Stop ciblé, lifecycle, health, activité, backpressure, reconnect/replay, gaps/repair et compteurs sûrs sans déplacer Transport, Store ou logique d’ingestion 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 qu’en endpoints : une route n’est 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. L’application expose inventaire, Start/Stop ciblé, lifecycle, health, activité, backpressure, reconnect/replay, gaps/repair et compteurs sûrs sans déplacer Transport, Store ou logique d’ingestion dans le frontend.
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
12
ROADMAP.md
12
ROADMAP.md
@@ -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 d’un 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 d’un 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 n’est 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 n’est 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 d’environ 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 d’environ 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 d’admission 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 d’admission 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 n’a été nécessaire. Le payload riche reste Transport-owned et la voie Worker hydrate via `getTransaction observed` tant que le RAW complet n’est 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 n’a été nécessaire. Le payload riche reste Transport-owned et la voie Worker hydrate via `getTransaction observed` tant que le RAW complet n’est 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
100
deltas/0.3.16/pre.010.md
Normal 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
|
||||||
|
```
|
||||||
692
prompts/036-V0_3_17_START_PROMPT.md
Normal file
692
prompts/036-V0_3_17_START_PROMPT.md
Normal 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user