0.3.16-pre.009
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 648
|
# version: 649
|
||||||
|
|
||||||
[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.8.fix.1"
|
version = "0.3.16-pre.9"
|
||||||
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"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-job-backfill-lib/README.md -->
|
<!-- file: crates/ksp-job-backfill-lib/README.md -->
|
||||||
<!-- version: 2 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# ksp-job-backfill-lib
|
# ksp-job-backfill-lib
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ ksp-job-backfill-lib
|
|||||||
-X-> backend imposé par le job
|
-X-> backend imposé par le job
|
||||||
```
|
```
|
||||||
|
|
||||||
Le chemin d'écriture est l'acquisition atomique `RawTransaction + RawTransactionObservation` en mode normal. La crate distingue insertion, déjà présent, tombstone purgé, observation nouvelle/existante, missing et conflit. Un conflit de contenu n'est jamais converti en succès idempotent.
|
Le chemin d'écriture est l'acquisition atomique `RawTransaction + RawTransactionObservation` en mode normal. La crate distingue insertion, déjà présent, tombstone purgé, observation nouvelle/existante, missing et conflit. Depuis `0.3.16`, un outcome Store `QuarantinedConflict` est projeté en `BackfillEntityPersistence::Conflict` tout en conservant l'outcome réel de l'observation (`Inserted` ou `AlreadyPresent`) ; il n'est jamais aplati en simple succès idempotent. Le code d'erreur legacy `ERROR_CODE_RAW_CONFLICT` reste pris en charge pour compatibilité.
|
||||||
|
|
||||||
## Concurrence et checkpoint
|
## Concurrence et checkpoint
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ La crate ne possède pas :
|
|||||||
- Worker API / worker live ;
|
- Worker API / worker live ;
|
||||||
- retry, pacing ou sélection d'endpoint Transport ;
|
- retry, pacing ou sélection d'endpoint Transport ;
|
||||||
- backend Store concret ;
|
- backend Store concret ;
|
||||||
- decoding Program ou matérialisation CORE/DECODE/SPECIALIZED ;
|
- decoding Program ou matérialisation STRUCTURAL/DECODED/DOMAIN ;
|
||||||
- table dédiée de checkpoint ;
|
- table dédiée de checkpoint ;
|
||||||
- control plane Job générique.
|
- control plane Job générique.
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-job-backfill-lib/USAGE.md -->
|
<!-- file: crates/ksp-job-backfill-lib/USAGE.md -->
|
||||||
<!-- version: 2 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# Utilisation de ksp-job-backfill-lib
|
# Utilisation de ksp-job-backfill-lib
|
||||||
|
|
||||||
@@ -191,7 +191,7 @@ entity: Inserted | AlreadyPresent | SkippedPurged | Conflict
|
|||||||
observation: Inserted | AlreadyPresent | NotRecorded | NotApplicable
|
observation: Inserted | AlreadyPresent | NotRecorded | NotApplicable
|
||||||
```
|
```
|
||||||
|
|
||||||
`Missing` ne provoque aucune écriture Store. Un conflit de contenu reste observable comme conflit et ne doit pas être traité comme une relance idempotente réussie.
|
`Missing` ne provoque aucune écriture Store. Un `QuarantinedConflict` durable reste observable comme `Conflict`, mais l'outcome de l'observation Store est conservé : une réobservation peut donc produire `Conflict + AlreadyPresent`. Ce cas ne doit jamais être aplati en simple relance idempotente réussie. Un backend legacy qui renvoie encore le code Store de conflit est également projeté comme conflit de compatibilité.
|
||||||
|
|
||||||
## Frontières à respecter
|
## Frontières à respecter
|
||||||
|
|
||||||
@@ -203,4 +203,4 @@ Le caller ne doit pas :
|
|||||||
- utiliser provider/endpoint comme identité transactionnelle ;
|
- utiliser provider/endpoint comme identité transactionnelle ;
|
||||||
- inventer une provenance pour `getTransaction = null` ;
|
- inventer une provenance pour `getTransaction = null` ;
|
||||||
- interpréter un checkpoint caller-owned comme une garantie de persistence crash-safe automatique ;
|
- interpréter un checkpoint caller-owned comme une garantie de persistence crash-safe automatique ;
|
||||||
- utiliser le job RAW comme decoder Program ou processor CORE.
|
- utiliser le job RAW comme decoder Program ou processor STRUCTURAL.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-store-lib/README.md -->
|
<!-- file: crates/ksp-store-lib/README.md -->
|
||||||
<!-- version: 5 -->
|
<!-- version: 6 -->
|
||||||
|
|
||||||
# ksp-store-lib
|
# ksp-store-lib
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ Elle expose aux consumers une surface backend-neutral, réexporte les contrats R
|
|||||||
- `Store::health().await` pour la readiness portable et bornée ;
|
- `Store::health().await` pour la readiness portable et bornée ;
|
||||||
- `Store::close(self).await` pour la fermeture explicite bornée ;
|
- `Store::close(self).await` pour la fermeture explicite bornée ;
|
||||||
- le mapping des erreurs backend vers des codes Store stables sans exposer les erreurs physiques ;
|
- le mapping des erreurs backend vers des codes Store stables sans exposer les erreurs physiques ;
|
||||||
- les dix capabilities RAW de `ksp-store-api` dispatchées vers le backend compilé : six `RawTransaction*` et quatre `RawAccount*` ;
|
- les quatorze capabilities RAW de `ksp-store-api` dispatchées vers le backend compilé, dont les quatre capabilities d'inspection entity/observation ;
|
||||||
- une validation réseau backend-neutral avant dispatch pour toutes les opérations qui portent explicitement un réseau ;
|
- une validation réseau backend-neutral avant dispatch pour toutes les opérations qui portent explicitement un réseau ;
|
||||||
- les réexports crate-root de `ksp-store-api` nécessaires aux consumers ordinaires.
|
- les réexports crate-root de `ksp-store-api` nécessaires aux consumers ordinaires.
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ Store ne lit ni `.env`, ni variables `KSP_*` / `KSPB_*`, ni variables/fichiers i
|
|||||||
|
|
||||||
## Surface RAW
|
## Surface RAW
|
||||||
|
|
||||||
`Store` implémente exactement dix capabilities RAW backend-neutral :
|
`Store` implémente exactement quatorze capabilities RAW backend-neutral :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
RawTransactionRead
|
RawTransactionRead
|
||||||
@@ -74,13 +74,17 @@ RawTransactionObservationRead
|
|||||||
RawTransactionObservationWrite
|
RawTransactionObservationWrite
|
||||||
RawTransactionRetentionRead
|
RawTransactionRetentionRead
|
||||||
RawTransactionRetentionWrite
|
RawTransactionRetentionWrite
|
||||||
|
RawTransactionInspectionRead
|
||||||
|
RawTransactionObservationInspectionRead
|
||||||
RawAccountStateRead
|
RawAccountStateRead
|
||||||
RawAccountStateWrite
|
RawAccountStateWrite
|
||||||
RawAccountObservationRead
|
RawAccountObservationRead
|
||||||
RawAccountObservationWrite
|
RawAccountObservationWrite
|
||||||
|
RawAccountStateInspectionRead
|
||||||
|
RawAccountObservationInspectionRead
|
||||||
```
|
```
|
||||||
|
|
||||||
Pour `RawTransaction`, la façade fournit la lecture canonique et des observations, l'acquisition atomique transaction+observation, l'ajout idempotent d'observations, la pagination keyset et les transitions de rétention demandées par le caller.
|
Pour `RawTransaction`, la façade fournit la lecture canonique et des observations, l'acquisition atomique transaction+observation, l'ajout idempotent d'observations, les inspections random-access, la pagination keyset et les transitions de rétention demandées par le caller. Depuis `0.3.16`, l'outcome d'acquisition peut aussi exposer la classification de variante (`InsertedCanonical`, `ObservedExact`, `ObservedCompatibleLessComplete`, `PromotedCompatibleMoreComplete`, `QuarantinedConflict`, `Rehydrated`, `SkippedPurged`). `QuarantinedConflict` est un succès durable : la façade ne le transforme pas en erreur terminale.
|
||||||
|
|
||||||
Pour `RawAccountState`, elle fournit :
|
Pour `RawAccountState`, elle fournit :
|
||||||
|
|
||||||
@@ -112,4 +116,6 @@ Sont volontairement hors de cette surface :
|
|||||||
- [`../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) — plan `RawTransaction` ;
|
- [`../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) — plan `RawTransaction` ;
|
||||||
- [`../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) — validation `RawTransaction` ;
|
- [`../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) — validation `RawTransaction` ;
|
||||||
- [`../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) — design `RawAccountState` et complétude RAW ;
|
- [`../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) — design `RawAccountState` et complétude RAW ;
|
||||||
- [`../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) — validation `RawAccountState` et conformance 10/10.
|
- [`../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) — validation `RawAccountState` ;
|
||||||
|
- [`../../docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md`](../../docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md) — variantes, sélecteur canonique et conflit durable ;
|
||||||
|
- [`../../docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md`](../../docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md) — validation `0.3.16` et preuve PostgreSQL live.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-store-lib/USAGE.md -->
|
<!-- file: crates/ksp-store-lib/USAGE.md -->
|
||||||
<!-- version: 5 -->
|
<!-- version: 6 -->
|
||||||
|
|
||||||
# Utilisation de ksp-store-lib
|
# Utilisation de ksp-store-lib
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ async fn persist_acquisition(
|
|||||||
|
|
||||||
Le mode `Normal` respecte un tombstone `Purged`. `ForceRehydrate` doit être choisi explicitement lorsqu'un caller veut restaurer un payload purgé et que l'identité retenue est compatible.
|
Le mode `Normal` respecte un tombstone `Purged`. `ForceRehydrate` doit être choisi explicitement lorsqu'un caller veut restaurer un payload purgé et que l'identité retenue est compatible.
|
||||||
|
|
||||||
Un contenu divergent sous la même identité produit `ERROR_CODE_RAW_CONFLICT`; Store ne remplace jamais silencieusement le contenu gagnant.
|
Depuis `0.3.16`, le caller doit inspecter `RawAcquisitionWriteOutcome::transaction_variant()` pour une acquisition `RawTransaction`. Un contenu divergent conservable ne produit plus une erreur terminale : il retourne `QuarantinedConflict`, la variante reçue est durable et le canonique reste inchangé. `ObservedCompatibleLessComplete` conserve le canonique courant ; `PromotedCompatibleMoreComplete` signale une promotion atomique. `ERROR_CODE_RAW_CONFLICT` reste pertinent pour des chemins legacy/directs qui ne disposent pas de cette quarantaine durable.
|
||||||
|
|
||||||
## 8. Lire et ajouter une observation
|
## 8. Lire et ajouter une observation
|
||||||
|
|
||||||
@@ -379,6 +379,6 @@ Les conflits et queries invalides utilisent les codes backend-neutral `store_api
|
|||||||
|
|
||||||
## 15. Limites de la façade
|
## 15. Limites de la façade
|
||||||
|
|
||||||
La façade ne fournit pas d'accès public au SQL, au pool, aux clients ou transactions PostgreSQL. Elle dispatch les dix capabilities RAW de l'API commune, mais ne fournit aucune capability de rétention, archivage, purge, delete ou compaction account.
|
La façade ne fournit pas d'accès public au SQL, au pool, aux clients ou transactions PostgreSQL. Elle dispatch les quatorze capabilities RAW de l'API commune, dont quatre capabilities d'inspection, mais ne fournit aucune capability de rétention, archivage, purge, delete ou compaction account.
|
||||||
|
|
||||||
La taille de page est une primitive de navigation. Les décisions de batch, priorité, backlog et scheduling appartiennent aux workers/jobs, pas à Store.
|
La taille de page est une primitive de navigation. Les décisions de batch, priorité, backlog et scheduling appartiennent aux workers/jobs, pas à Store.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-store-postgres-lib/README.md -->
|
<!-- file: crates/ksp-store-postgres-lib/README.md -->
|
||||||
<!-- version: 11 -->
|
<!-- version: 12 -->
|
||||||
|
|
||||||
# ksp-store-postgres-lib
|
# ksp-store-postgres-lib
|
||||||
|
|
||||||
@@ -63,7 +63,18 @@ VerifyFull
|
|||||||
|
|
||||||
Le moteur de migrations embarqué vérifie version logique, nom et checksum SHA-256, sérialise les runners par advisory transaction lock et refuse une history divergente ou plus récente que le runtime.
|
Le moteur de migrations embarqué vérifie version logique, nom et checksum SHA-256, sérialise les runners par advisory transaction lock et refuse une history divergente ou plus récente que le runtime.
|
||||||
|
|
||||||
Le bootstrap metadata est conservé comme migration V000. La migration logique V001 matérialise le schéma `RawTransaction` et V002 le schéma `RawAccountState`, chacune en ressources séparées `tables/`, `constraints/` et `indexes/` afin que le backend puisse vérifier leur compatibilité effective sans transformer les fichiers SQL en parser généraliste.
|
Le bootstrap metadata est conservé comme migration V000. La migration logique V001 matérialise le schéma `RawTransaction`, V002 le schéma `RawAccountState` et V003 ajoute le sidecar multi-variantes `RawTransaction`. V000/V001/V002 restent byte/checksum-identiques. Les migrations sont découpées en ressources `tables/`, `constraints/` et `indexes/` afin que le backend puisse vérifier leur compatibilité effective sans transformer les fichiers SQL en parser généraliste.
|
||||||
|
|
||||||
|
V003 ajoute exactement les quatre tables métier suivantes :
|
||||||
|
|
||||||
|
```text
|
||||||
|
ksp_raw_transaction_variants
|
||||||
|
ksp_raw_transaction_canonical_selectors
|
||||||
|
ksp_raw_transaction_observation_variants
|
||||||
|
ksp_raw_transaction_conflicts
|
||||||
|
```
|
||||||
|
|
||||||
|
Le conflict case V003 de `0.3.16` est volontairement minimal (`Open`/réouverture idempotente, relation/reason/revision). Le lifecycle complet de résolution/historique est reporté à `0.3.17`.
|
||||||
|
|
||||||
La base est liée à un seul `RawNetworkId` via `ksp_store_identity`. Une migration enregistrée mais physiquement divergente est un mismatch ; les réparations additives sûres dépendent de `schema_autoupdate`.
|
La base est liée à un seul `RawNetworkId` via `ksp_store_identity`. Une migration enregistrée mais physiquement divergente est un mismatch ; les réparations additives sûres dépendent de `schema_autoupdate`.
|
||||||
|
|
||||||
@@ -108,9 +119,9 @@ persist_raw_transaction_acquisition
|
|||||||
record_raw_transaction_observation
|
record_raw_transaction_observation
|
||||||
```
|
```
|
||||||
|
|
||||||
L'acquisition canonique et son observation initiale sont commises dans une seule transaction PostgreSQL. Les clés uniques physiques fournissent l'admission idempotente ; après un conflit unique, le backend verrouille la ligne gagnante et compare le contenu réel avant de conclure `AlreadyPresent` ou `Conflict`.
|
L'acquisition et son observation sont commises dans une seule transaction PostgreSQL. Après collision d'identité, le backend verrouille la ligne V001 avec `FOR UPDATE`, compare le contenu via le comparateur partagé puis persiste/réutilise la variante reçue. `Exact` et `CompatibleLessComplete` conservent le canonique, `CompatibleMoreComplete` met à jour atomiquement selector V003 et projection V001, tandis que `Conflict`/`Incomparable` ouvrent ou mettent à jour un conflict case durable sans modifier le canonique. La nouvelle observation est rattachée à la variante réellement reçue avant `COMMIT`.
|
||||||
|
|
||||||
Un tombstone `Purged` compatible produit `SkippedPurged/NotRecorded` en mode normal. `ForceRehydrate` restaure explicitement le payload `Full` et l'observation dans la même transaction.
|
Un tombstone `Purged` compatible produit `SkippedPurged/NotRecorded` en mode normal. `ForceRehydrate` restaure explicitement le payload `Full` et l'observation dans la même transaction. `content_hash` n'est qu'un préfiltre : les bytes disponibles restent l'autorité d'égalité.
|
||||||
|
|
||||||
## Pagination RAW transaction
|
## Pagination RAW transaction
|
||||||
|
|
||||||
@@ -181,4 +192,6 @@ La crate ne contient :
|
|||||||
- [`../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) — design `RawTransaction` ;
|
- [`../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](../../docs/plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) — design `RawTransaction` ;
|
||||||
- [`../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) — validation `RawTransaction` ;
|
- [`../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](../../docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) — validation `RawTransaction` ;
|
||||||
- [`../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) — design `RawAccountState` et complétude RAW ;
|
- [`../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](../../docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) — design `RawAccountState` et complétude RAW ;
|
||||||
- [`../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) — validation `RawAccountState` et conformance RAW.
|
- [`../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](../../docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) — validation `RawAccountState` et conformance RAW ;
|
||||||
|
- [`../../docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md`](../../docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md) — V003, convergence et conflit durable ;
|
||||||
|
- [`../../docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md`](../../docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md) — validation `0.3.16`, concurrence/rollback et live PostgreSQL 17.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-store-postgres-lib/USAGE.md -->
|
<!-- file: crates/ksp-store-postgres-lib/USAGE.md -->
|
||||||
<!-- version: 11 -->
|
<!-- version: 12 -->
|
||||||
|
|
||||||
# Utilisation de ksp-store-postgres-lib
|
# Utilisation de ksp-store-postgres-lib
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ async fn persist_acquisition(
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
L'opération est atomique : le canonique et son observation initiale sont tous deux durables ou aucun ne l'est. Une identité déjà présente avec un contenu identique est idempotente ; un contenu divergent retourne `PostgresBackendErrorKind::Conflict` sans overwrite silencieux.
|
L'opération est atomique : variante reçue, observation, mapping observation->variante, selector/projection éventuels et conflict case sont tous durables ou aucun ne l'est. Une identité déjà présente avec un contenu exact est idempotente. Une divergence conservable retourne un succès `RawAcquisitionWriteOutcome` dont `transaction_variant()` vaut `QuarantinedConflict`; le canonique n'est pas écrasé. Une représentation strictement plus complète selon la seule preuve `logMessages` admise peut retourner `PromotedCompatibleMoreComplete` et promouvoir atomiquement le selector/projection. Les conflits d'observation directe et autres contrats legacy peuvent encore produire `PostgresBackendErrorKind::Conflict`.
|
||||||
|
|
||||||
Pour un tombstone purgé compatible, le mode `Normal` ne restaure pas le payload. `ForceRehydrate` doit être demandé explicitement pour rétablir un payload `Full`.
|
Pour un tombstone purgé compatible, le mode `Normal` ne restaure pas le payload. `ForceRehydrate` doit être demandé explicitement pour rétablir un payload `Full`.
|
||||||
|
|
||||||
@@ -289,4 +289,4 @@ fn classify(error: &ksp_store_postgres_lib::PostgresBackendError) {
|
|||||||
|
|
||||||
Le backend ne lit aucune variable d'environnement et ne possède aucune sélection de target Config. Les applications, jobs et workers doivent normalement passer par `ksp-store-lib`.
|
Le backend ne lit aucune variable d'environnement et ne possède aucune sélection de target Config. Les applications, jobs et workers doivent normalement passer par `ksp-store-lib`.
|
||||||
|
|
||||||
Les dix capabilities RAW communes sont implémentées par ce backend. Les décisions de batch, priorité, backlog, scheduling et policy de rétention restent hors de sa responsabilité ; aucune rétention/archivage/purge account n'est fournie.
|
Les quatorze capabilities RAW communes sont implémentées par ce backend, dont les quatre capabilities d'inspection entity/observation. Les décisions de batch, priorité, backlog, scheduling et policy de rétention restent hors de sa responsabilité ; aucune rétention/archivage/purge account n'est fournie.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/README.md -->
|
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/README.md -->
|
||||||
<!-- version: 18 -->
|
<!-- version: 19 -->
|
||||||
|
|
||||||
# ksp-worker-raw-transaction-ingest-lib
|
# ksp-worker-raw-transaction-ingest-lib
|
||||||
|
|
||||||
@@ -289,7 +289,7 @@ variant quarantined conflict
|
|||||||
store failure
|
store failure
|
||||||
```
|
```
|
||||||
|
|
||||||
En `0.3.16-pre.007`, un conflit de contenu classifié par le Store n'est plus une faute terminale : la variante entrante est conservée, le conflict case durable est ouvert ou mis à jour idempotemment et l'outcome `QuarantinedConflict` maintient le Worker `Running` avec une health `Degraded`. Un ancien backend qui renvoie encore `ERROR_CODE_RAW_CONFLICT` reste traité comme erreur terminale de compatibilité. La résolution explicite du conflict case n'appartient pas à cette tranche.
|
Depuis `0.3.16`, un conflit de contenu classifié par le Store n'est plus une faute terminale : la variante entrante est conservée, le conflict case durable est ouvert ou mis à jour idempotemment et l'outcome `QuarantinedConflict` maintient le Worker `Running` avec une health `Degraded`. Le hardening final prouve qu'une identité suivante continue d'atteindre le Store après cette quarantaine. Un ancien backend qui renvoie encore `ERROR_CODE_RAW_CONFLICT` reste traité comme erreur terminale de compatibilité. La résolution explicite du conflict case et le retry Store complet appartiennent à `0.3.17`.
|
||||||
|
|
||||||
## Snapshots et erreurs
|
## Snapshots et erreurs
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md -->
|
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md -->
|
||||||
<!-- version: 16 -->
|
<!-- version: 17 -->
|
||||||
|
|
||||||
# Utilisation de ksp-worker-raw-transaction-ingest-lib
|
# Utilisation de ksp-worker-raw-transaction-ingest-lib
|
||||||
|
|
||||||
@@ -266,7 +266,7 @@ somme de leurs tâches d'hydration actives <= persistence_concurrency
|
|||||||
|
|
||||||
Ces contraintes garantissent au moins une part à chaque source reference-bearing sans introduire de scheduler pondéré. Si les settings ne permettent pas cette répartition, le démarrage échoue avant spawn avec `runtime_invalid`; le caller doit augmenter la capacité concernée ou réduire le nombre de sources nécessitant une hydration.
|
Ces contraintes garantissent au moins une part à chaque source reference-bearing sans introduire de scheduler pondéré. Si les settings ne permettent pas cette répartition, le démarrage échoue avant spawn avec `runtime_invalid`; le caller doit augmenter la capacité concernée ou réduire le nombre de sources nécessitant une hydration.
|
||||||
|
|
||||||
Pour une même identité `(network, signature)`, le Worker ne choisit ni majorité ni provider préféré et n'écrase pas un contenu divergent ; le Store reste l'autorité durable finale. La cache run-local ne fait que sérialiser cette identité et chaque acquisition atteint le Store. Un entrant prouvé moins complet reste une observation compatible, un entrant prouvé plus complet peut devenir canonique atomiquement, et une divergence conflictuelle/incomparable est conservée comme variante avec un conflict case durable. L'outcome `QuarantinedConflict` n'arrête pas le Worker : il reste `Running` et sa health devient `Degraded`.
|
Pour une même identité `(network, signature)`, le Worker ne choisit ni majorité ni provider préféré et n'écrase pas un contenu divergent ; le Store reste l'autorité durable finale. Le cache run-local ne fait que sérialiser cette identité et chaque acquisition atteint le Store. Un entrant prouvé moins complet reste une observation compatible, un entrant prouvé plus complet peut devenir canonique atomiquement, et une divergence conflictuelle/incomparable est conservée comme variante avec un conflict case durable. L'outcome `QuarantinedConflict` n'arrête pas le Worker : il reste `Running`, sa health devient `Degraded` et les identités suivantes continuent à être persistées. Le retry Store/backoff configurable n'est pas encore fourni par `0.3.16`.
|
||||||
|
|
||||||
## Observer le snapshot concret
|
## Observer le snapshot concret
|
||||||
|
|
||||||
|
|||||||
181
deltas/0.3.16/pre.009.md
Normal file
181
deltas/0.3.16/pre.009.md
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
<!-- file: deltas/0.3.16/pre.009.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# Delta `0.3.16-pre.009` — réconciliation documentaire finale
|
||||||
|
|
||||||
|
## Base requise
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.3.16-pre.008-fix.001 appliqué
|
||||||
|
workspace.package.version = 0.3.16-pre.8.fix.1
|
||||||
|
```
|
||||||
|
|
||||||
|
Le gate opérateur de `pre.008-fix.001` est entièrement propre : format, audits Rust/Markdown, `cargo check --workspace`, Clippy workspace/all-targets/all-features avec `-D warnings`, Store API, Store façade, PostgreSQL, Job Backfill et Worker passent. Le live proof `postgres_raw_transaction_live` a également été exécuté séparément avec succès sur PostgreSQL 17.
|
||||||
|
|
||||||
|
## Objectif
|
||||||
|
|
||||||
|
`pre.009` est exclusivement la lane de réconciliation documentaire finale de `0.3.16`.
|
||||||
|
|
||||||
|
Elle aligne les références durables sur l'état réellement implémenté et validé :
|
||||||
|
|
||||||
|
```text
|
||||||
|
V003 multi-variantes
|
||||||
|
selector canonique + promotion atomique
|
||||||
|
comparateur partagé fail-closed
|
||||||
|
conflict case minimal durable
|
||||||
|
QuarantinedConflict non terminal côté Worker
|
||||||
|
projection Conflict côté Backfill
|
||||||
|
hardening concurrence / rollback / PostgreSQL live
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun code runtime, test fonctionnel, migration, configuration, `CHANGELOG.md`, `ROADMAP.md` ou prompt de démarrage suivant n'est modifié.
|
||||||
|
|
||||||
|
## Version
|
||||||
|
|
||||||
|
```text
|
||||||
|
workspace.package.version = 0.3.16-pre.9
|
||||||
|
```
|
||||||
|
|
||||||
|
## Plan et validation
|
||||||
|
|
||||||
|
Le plan 038 est réconcilié avec les gates réellement observés :
|
||||||
|
|
||||||
|
- `pre.005` à `pre.008-fix.001` sont décrits avec leur état livré/validé ;
|
||||||
|
- `pre.008` enregistre le live PostgreSQL 17 comme PASS ;
|
||||||
|
- `0.3.16` ne revendique ni résolution complète, ni retry Store, ni reconnect configurable, ni Store Desk ;
|
||||||
|
- les lanes de fermeture `0.3.17` et `0.3.18` sont séparées conformément aux règles actuelles entre gate technique, réconciliation documentaire et préparation de publication.
|
||||||
|
|
||||||
|
La validation 033 ajoute la matrice finale `0.3.16`, le gate opérateur complet de `pre.008-fix.001`, la preuve PostgreSQL réelle, les scopes explicitement reportés et l'état de fermeture avant `pre.010`.
|
||||||
|
|
||||||
|
## Références d'architecture
|
||||||
|
|
||||||
|
Les références durables sont réalignées sur le découpage courant :
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.3.16 fondations RAW multi-variantes + conflit durable minimal + Worker non terminal
|
||||||
|
0.3.17 lifecycle/résolution/rétention variantes + résilience Store/Transport
|
||||||
|
0.3.18 Store Desk variantes/conflits/résolutions
|
||||||
|
0.3.19 cible Backfill multi-route/multi-stratégie
|
||||||
|
0.3.20 cible Backfill Desk multi-route
|
||||||
|
```
|
||||||
|
|
||||||
|
Le handoff historique `037` reste inchangé ; il est explicitement présenté comme historique et supersédé pour le sizing par le plan 038.
|
||||||
|
|
||||||
|
## Documentation Store
|
||||||
|
|
||||||
|
`ksp-store-lib` et `ksp-store-postgres-lib` documentent désormais :
|
||||||
|
|
||||||
|
- les 14 capabilities RAW réellement implémentées, dont les quatre inspections ;
|
||||||
|
- V003 et ses quatre tables ;
|
||||||
|
- les outcomes de variantes ;
|
||||||
|
- `QuarantinedConflict` comme succès durable ;
|
||||||
|
- la promotion atomique `CompatibleMoreComplete` ;
|
||||||
|
- le mapping observation -> variante réellement reçue ;
|
||||||
|
- la conservation du canonique sur conflit/incomparable ;
|
||||||
|
- la portée volontairement minimale du conflict case `0.3.16`.
|
||||||
|
|
||||||
|
## Documentation Worker / Backfill
|
||||||
|
|
||||||
|
Le Worker documente comme contrat stable `0.3.16` que la sérialisation run-local ne décide plus du contenu et que toute acquisition atteint le Store ; `QuarantinedConflict` laisse le Worker `Running/Degraded` et n'empêche pas l'identité suivante.
|
||||||
|
|
||||||
|
Le Job Backfill documente la projection `QuarantinedConflict -> Conflict` tout en conservant l'outcome réel de l'observation. Les deux références Backfill utilisent désormais la terminologie `STRUCTURAL` au lieu de l'ancien nom de couche `CORE`.
|
||||||
|
|
||||||
|
## Fichiers modifiés
|
||||||
|
|
||||||
|
```text
|
||||||
|
Cargo.toml
|
||||||
|
docs/000-README.md
|
||||||
|
docs/architecture/004-COMPONENT_INVENTORY.md
|
||||||
|
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
|
||||||
|
docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md
|
||||||
|
docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md
|
||||||
|
docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md
|
||||||
|
crates/ksp-store-lib/README.md
|
||||||
|
crates/ksp-store-lib/USAGE.md
|
||||||
|
crates/ksp-store-postgres-lib/README.md
|
||||||
|
crates/ksp-store-postgres-lib/USAGE.md
|
||||||
|
crates/ksp-worker-raw-transaction-ingest-lib/README.md
|
||||||
|
crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md
|
||||||
|
crates/ksp-job-backfill-lib/README.md
|
||||||
|
crates/ksp-job-backfill-lib/USAGE.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fichier ajouté
|
||||||
|
|
||||||
|
```text
|
||||||
|
deltas/0.3.16/pre.009.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fichiers supprimés
|
||||||
|
|
||||||
|
```text
|
||||||
|
aucun
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation opérateur de la base
|
||||||
|
|
||||||
|
Le gate `pre.008-fix.001` fourni par l'opérateur est entièrement vert. Les résultats détaillés sont désormais consignés dans `docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md`.
|
||||||
|
|
||||||
|
Le live PostgreSQL séparé a produit :
|
||||||
|
|
||||||
|
```text
|
||||||
|
server major 17
|
||||||
|
1 passed; 0 failed
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validations de génération
|
||||||
|
|
||||||
|
Exécutées dans l'environnement de génération :
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
Résultats :
|
||||||
|
|
||||||
|
```text
|
||||||
|
General Rust rule audit: clean
|
||||||
|
Rust export completeness audit: 0 candidate(s)
|
||||||
|
KSP workspace Rust rule audit: clean
|
||||||
|
Markdown table audit: clean (352 table(s), 959 file(s))
|
||||||
|
```
|
||||||
|
|
||||||
|
Le toolchain Rust n'est pas installé dans l'environnement de génération. Le changement de version Cargo impose donc au gate opérateur de rejouer format/check/Clippy/tests, même si cette tranche ne modifie aucun source Rust.
|
||||||
|
|
||||||
|
## Gate opérateur demandé
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
cargo check --workspace
|
||||||
|
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||||
|
|
||||||
|
cargo test -p ksp-store-api --all-targets --all-features
|
||||||
|
cargo test -p ksp-store-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-store-postgres-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-job-backfill-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun live PostgreSQL supplémentaire n'est requis par `pre.009`, car cette tranche ne modifie aucun test/runtime et le live `pre.008` a déjà été exécuté avec succès.
|
||||||
|
|
||||||
|
## Décisions prises
|
||||||
|
|
||||||
|
- la documentation finale de `0.3.16` décrit uniquement les capacités effectivement livrées ;
|
||||||
|
- `0.3.17` et `0.3.18` conservent explicitement les responsabilités non implémentées ;
|
||||||
|
- les extensions Backfill restent reportées par défaut à `0.3.19`/`0.3.20` ;
|
||||||
|
- le handoff historique n'est pas réécrit ;
|
||||||
|
- `CHANGELOG.md`, `ROADMAP.md` et le prompt `0.3.17` restent réservés à `pre.010`.
|
||||||
|
|
||||||
|
## Questions ouvertes
|
||||||
|
|
||||||
|
Aucune question documentaire bloquante pour `0.3.16`.
|
||||||
|
|
||||||
|
## Suite
|
||||||
|
|
||||||
|
Après gate propre : `0.3.16-pre.010`, préparation de publication minimale uniquement (`CHANGELOG.md`, `ROADMAP.md`, prompt de démarrage `0.3.17`, version et delta).
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/000-README.md -->
|
<!-- file: docs/000-README.md -->
|
||||||
<!-- version: 74 -->
|
<!-- version: 75 -->
|
||||||
|
|
||||||
# Documentation KSP
|
# Documentation KSP
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/
|
|||||||
|
|
||||||
La candidate `0.3.9 — Worker API générique + audit RAW Transaction` est réconciliée dans [`plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md`](plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md) avec [`validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md`](validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md). `ksp-worker-api` reste Core-only et runtime-neutral pour les services continus ; l'architecture RAW place Store/`RawTransaction` au centre et sépare strictement le Job Backfill historique paramétré du futur Worker Ingest continu start/stop. [`../crates/ksp-worker-api/README.md`](../crates/ksp-worker-api/README.md), [`../crates/ksp-worker-api/USAGE.md`](../crates/ksp-worker-api/USAGE.md), [`architecture/009-ACQUISITION_WORKERS_AND_JOBS.md`](architecture/009-ACQUISITION_WORKERS_AND_JOBS.md) et [`architecture/011-RAW_TRANSACTION_ACQUISITION.md`](architecture/011-RAW_TRANSACTION_ACQUISITION.md) constituent les références durables avant la lane de publication.
|
La candidate `0.3.9 — Worker API générique + audit RAW Transaction` est réconciliée dans [`plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md`](plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md) avec [`validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md`](validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md). `ksp-worker-api` reste Core-only et runtime-neutral pour les services continus ; l'architecture RAW place Store/`RawTransaction` au centre et sépare strictement le Job Backfill historique paramétré du futur Worker Ingest continu start/stop. [`../crates/ksp-worker-api/README.md`](../crates/ksp-worker-api/README.md), [`../crates/ksp-worker-api/USAGE.md`](../crates/ksp-worker-api/USAGE.md), [`architecture/009-ACQUISITION_WORKERS_AND_JOBS.md`](architecture/009-ACQUISITION_WORKERS_AND_JOBS.md) et [`architecture/011-RAW_TRANSACTION_ACQUISITION.md`](architecture/011-RAW_TRANSACTION_ACQUISITION.md) constituent les références durables avant la lane de publication.
|
||||||
|
|
||||||
Les candidates `0.3.10` à `0.3.15` prolongent cette trajectoire RAW dans [`plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md`](plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md), [`plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md`](plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md), [`plans/033-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY_PLAN.md`](plans/033-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY_PLAN.md), [`plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md`](plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md), [`plans/035-V0_3_14_MULTI_SOURCE_GAP_REPAIR_HARDENING_PLAN.md`](plans/035-V0_3_14_MULTI_SOURCE_GAP_REPAIR_HARDENING_PLAN.md) et [`plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md`](plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md), avec leurs matrices [`validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md`](validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md) à [`validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md`](validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md). Cette séquence matérialise le Common RAW partagé, la fondation Worker, Yellowstone live, cinq familles multi-source, la continuité/gap repair puis le Desk multi-route ; `0.3.15` ferme en plus les anomalies Mainnet observées de convergence `logMessages`, backpressure Yellowstone soutenue et shutdown post-half-close. Le handoff [`plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md`](plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md) réserve explicitement à `0.3.16` les variantes RAW durables, la résolution des conflits, les retries Store/Transport et les vues correspondantes de Store Desk ; `0.3.17` et `0.3.18` portent ensuite le Backfill multi-route et son Desk adapté.
|
Les candidates `0.3.10` à `0.3.15` prolongent cette trajectoire RAW dans [`plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md`](plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md), [`plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md`](plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md), [`plans/033-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY_PLAN.md`](plans/033-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY_PLAN.md), [`plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md`](plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md), [`plans/035-V0_3_14_MULTI_SOURCE_GAP_REPAIR_HARDENING_PLAN.md`](plans/035-V0_3_14_MULTI_SOURCE_GAP_REPAIR_HARDENING_PLAN.md) et [`plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md`](plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md), avec leurs matrices [`validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md`](validation/027-V0_3_10_RAW_TRANSACTION_INGEST.md) à [`validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md`](validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md). Cette séquence matérialise le Common RAW partagé, la fondation Worker, Yellowstone live, cinq familles multi-source, la continuité/gap repair puis le Desk multi-route ; `0.3.15` ferme en plus les anomalies Mainnet observées de convergence `logMessages`, backpressure Yellowstone soutenue et shutdown post-half-close. Le handoff historique [`plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md`](plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md) est supersédé pour le sizing par [`plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md`](plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md) et [`validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md`](validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md) : `0.3.16` ferme les fondations RAW multi-variantes, le sélecteur/promotion canonique, le conflit durable minimal et l'ingestion Worker non terminale ; `0.3.17` porte la résilience opérationnelle et le cycle de vie complet des variantes, `0.3.18` l'inspection/résolution Store Desk, puis les extensions Backfill multi-route et Backfill Desk sont reportées par défaut à `0.3.19` et `0.3.20`.
|
||||||
|
|
||||||
## Spécifications de formats
|
## Spécifications de formats
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/architecture/004-COMPONENT_INVENTORY.md -->
|
<!-- file: docs/architecture/004-COMPONENT_INVENTORY.md -->
|
||||||
<!-- version: 43 -->
|
<!-- version: 44 -->
|
||||||
|
|
||||||
# Inventaire initial des composants KSP
|
# Inventaire initial des composants KSP
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ Ce document maintient l'inventaire synthétique des composants retenus ou presse
|
|||||||
## Inventaire synthétique
|
## Inventaire synthétique
|
||||||
|
|
||||||
| Domaine | Composant | Type | Statut | Première cible actuelle | Mission |
|
| Domaine | Composant | Type | Statut | Première cible actuelle | Mission |
|
||||||
|-------------------------|-----------------------------------------|-------------|--------------|----------------------------------|------------------------------------------------------------------------------------------------------|
|
|-------------------------|-----------------------------------------|-------------|--------------|---------------------------------|-------------------------------------------------------------------------------------------------------|
|
||||||
| Core | `ksp-core-lib` | lib | Stable | `0.1.1` | Error/Result, Program IDs et primitives fondamentales |
|
| Core | `ksp-core-lib` | lib | Stable | `0.1.1` | Error/Result, Program IDs et primitives fondamentales |
|
||||||
| Logging | `ksp-logging-lib` | lib | Stable | `0.1.2` | façade unique tracing KSP |
|
| Logging | `ksp-logging-lib` | lib | Stable | `0.1.2` | façade unique tracing KSP |
|
||||||
| Config | `ksp-config-lib` | lib | Stable | `0.1.3` | documents, profils, env et persistence Config |
|
| Config | `ksp-config-lib` | lib | Stable | `0.1.3` | documents, profils, env et persistence Config |
|
||||||
@@ -37,16 +37,16 @@ Ce document maintient l'inventaire synthétique des composants retenus ou presse
|
|||||||
| Program API | `ksp-program-api` | API | Stable | `0.2.14` | contrats extensibles Program |
|
| Program API | `ksp-program-api` | API | Stable | `0.2.14` | contrats extensibles Program |
|
||||||
| Program impl. | `ksp-program-lib` | lib | Retenu | vertical slices ultérieurs | implementations Program officielles |
|
| Program impl. | `ksp-program-lib` | lib | Retenu | vertical slices ultérieurs | implementations Program officielles |
|
||||||
| Program extension | `ksp-program-<name>-lib` | lib externe | À la demande | dès besoin | implementation externe de `ksp-program-api` |
|
| Program extension | `ksp-program-<name>-lib` | lib externe | À la demande | dès besoin | implementation externe de `ksp-program-api` |
|
||||||
| Store API | `ksp-store-api` | API | Stable | `0.3.1`, extension `0.3.16` | RAW transaction/account, observations ; variantes/conflits/résolutions ajoutés sans backend leak |
|
| Store API | `ksp-store-api` | API | Stable | `0.3.1`, ext. `0.3.16`/`0.3.17` | RAW transaction/account, observations ; variantes/comparateur en `0.3.16`, résolution en `0.3.17` |
|
||||||
| Store runtime | `ksp-store-lib` | lib | Stable | `0.3.2`–`0.3.4`, `0.3.16` | façade backend-neutral ; convergence, retry et résolution RAW partagés entre producteurs |
|
| Store runtime | `ksp-store-lib` | lib | Stable | `0.3.2`–`0.3.4`, ext. `0.3.16` | façade backend-neutral ; outcomes variantes partagés, inspection/résolution étendues en `0.3.17` |
|
||||||
| Store PostgreSQL | `ksp-store-postgres-lib` | lib | Stable | `0.3.2`–`0.3.4`, `0.3.16` | backend référence ; variantes conflictuelles et historique de résolution atomiques en `0.3.16` |
|
| Store PostgreSQL | `ksp-store-postgres-lib` | lib | Stable | `0.3.2`–`0.3.4`, ext. `0.3.16` | backend référence ; V003 variantes/selector/conflit minimal atomiques, lifecycle complet en `0.3.17` |
|
||||||
| Job lifecycle | `ksp-job-api` | API | Implémenté | `0.3.6` | identité/lifecycle/annulation/notifications latest-value runtime-neutral |
|
| Job lifecycle | `ksp-job-api` | API | Implémenté | `0.3.6` | identité/lifecycle/annulation/notifications latest-value runtime-neutral |
|
||||||
| Backfill | `ksp-job-backfill-lib` | lib | Implémenté | `0.3.6`, extension `0.3.17` | première verticale HTTP puis extension multi-route/historique sur convergence Store partagée |
|
| Backfill | `ksp-job-backfill-lib` | lib | Implémenté | `0.3.6`, cible ext. `0.3.19` | première verticale HTTP ; compatibilité variantes `0.3.16`, extension multi-route/historique reportée |
|
||||||
| Backfill Desk | `ksp-app-backfill-desk` | app | Implémenté | `0.3.7`, extension `0.3.18` | contrôle du backfill RAW ; sélection/supervision multi-route adaptée au Job `0.3.17` |
|
| Backfill Desk | `ksp-app-backfill-desk` | app | Implémenté | `0.3.7`, cible ext. `0.3.20` | contrôle du backfill RAW ; adaptation multi-route reportée après le programme résilience/Store Desk |
|
||||||
| Store Desk | `ksp-app-store-desk` | app | Implémenté | `0.3.8`, extension `0.3.16` | inspection RAW + vues conflits/variantes/historique et résolution manuelle réversible |
|
| Store Desk | `ksp-app-store-desk` | app | Implémenté | `0.3.8`, extension `0.3.18` | inspection RAW actuelle ; variantes/conflits/résolutions opérateur ajoutés après contrats `0.3.17` |
|
||||||
| RAW transaction common | `ksp-raw-transaction-lib` | lib | Implémenté | `0.3.10` | canonicalisation/wire RAW Transaction v1 source-neutral partagé entre producteurs |
|
| RAW transaction common | `ksp-raw-transaction-lib` | lib | Implémenté | `0.3.10` | canonicalisation/wire RAW Transaction v1 source-neutral partagé entre producteurs |
|
||||||
| Worker lifecycle | `ksp-worker-api` | API | Implémenté | `0.3.9` | lifecycle/health/progression génériques des services continus |
|
| Worker lifecycle | `ksp-worker-api` | API | Implémenté | `0.3.9` | lifecycle/health/progression génériques des services continus |
|
||||||
| RAW transaction worker | `ksp-worker-raw-transaction-ingest-lib` | worker/lib | Implémenté | `0.3.11`–`0.3.15`, ext. `0.3.16` | live cinq familles, continuité/repair et backpressure bornée ; conflits durables étendus en `0.3.16` |
|
| RAW transaction worker | `ksp-worker-raw-transaction-ingest-lib` | worker/lib | Implémenté | `0.3.11`–`0.3.16` | live multi-source borné ; Store arbitre les variantes, conflit durable non terminal en `0.3.16` |
|
||||||
| RAW ingest Desk | `ksp-app-raw-transaction-ingest-desk` | app | Implémenté | `0.3.15` | composition réseau-centrique et supervision simultanée de plusieurs routes live |
|
| RAW ingest Desk | `ksp-app-raw-transaction-ingest-desk` | app | Implémenté | `0.3.15` | composition réseau-centrique et supervision simultanée de plusieurs routes live |
|
||||||
| STRUCTURAL job | nom à fixer | job/lib | Retenu | couche STRUCTURAL | normalisation Solana générique RAW -> STRUCTURAL bornée/rejouable |
|
| STRUCTURAL job | nom à fixer | job/lib | Retenu | couche STRUCTURAL | normalisation Solana générique RAW -> STRUCTURAL bornée/rejouable |
|
||||||
| STRUCTURAL worker | nom à fixer | worker/lib | Retenu | fin couche STRUCTURAL | backlog RAW -> STRUCTURAL continu |
|
| STRUCTURAL worker | nom à fixer | worker/lib | Retenu | fin couche STRUCTURAL | backlog RAW -> STRUCTURAL continu |
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md -->
|
<!-- file: docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md -->
|
||||||
<!-- version: 22 -->
|
<!-- version: 23 -->
|
||||||
|
|
||||||
# Acquisition, workers, jobs et pipelines spécialisés
|
# Acquisition, workers, jobs et pipelines spécialisés
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ Le job :
|
|||||||
|
|
||||||
Le caller desktop spécialisé actuel est `ksp-app-backfill-desk`. Il compose Config, le pool HTTP et Store, puis remet ces ressources au runtime Backfill. Il peut retenir le checkpoint terminal uniquement en mémoire Rust pour un Resume in-session ; cette rétention applicative ne transforme pas le checkpoint en garantie de reprise durable après redémarrage.
|
Le caller desktop spécialisé actuel est `ksp-app-backfill-desk`. Il compose Config, le pool HTTP et Store, puis remet ces ressources au runtime Backfill. Il peut retenir le checkpoint terminal uniquement en mémoire Rust pour un Resume in-session ; cette rétention applicative ne transforme pas le checkpoint en garantie de reprise durable après redémarrage.
|
||||||
|
|
||||||
Cette verticale `0.3.6`/`0.3.7` est **la première stratégie de backfill**, pas la définition générale du backfill KSP. Son discovery `getSignaturesForAddress` + hydration `getTransaction` est HTTP parce que cette méthode a été choisie pour le premier vertical slice. Après stabilisation du worker live et de sa Desk, `0.3.16` ferme d'abord la résilience RAW partagée : divergences compatibles, variantes conflictuelles durables, résolution/restauration canonique, retry Store et reconnexion Transport. `0.3.17` réaudite ensuite `ksp-job-backfill-lib` pour intégrer les autres stratégies historiques/catch-up pertinentes identifiées par l'audit RAW Transaction de `0.3.9`, puis `0.3.18` adapte `ksp-app-backfill-desk` au Job multi-route.
|
Cette verticale `0.3.6`/`0.3.7` est **la première stratégie de backfill**, pas la définition générale du backfill KSP. Son discovery `getSignaturesForAddress` + hydration `getTransaction` est HTTP parce que cette méthode a été choisie pour le premier vertical slice. Après stabilisation du worker live et de sa Desk, `0.3.16` ferme les fondations RAW multi-variantes et le conflit durable non terminal ; `0.3.17` complète le cycle de vie/résolution des variantes ainsi que la résilience Store/Transport, puis `0.3.18` expose ces contrats dans Store Desk. L'extension multi-route/multi-stratégie de `ksp-job-backfill-lib` est reportée par défaut à `0.3.19`, et l'adaptation correspondante de `ksp-app-backfill-desk` à `0.3.20`.
|
||||||
|
|
||||||
### Worker RAW Transaction live
|
### Worker RAW Transaction live
|
||||||
|
|
||||||
@@ -465,7 +465,7 @@ ksp-job-backfill-lib
|
|||||||
-> serde_json/sha2 # discovery/checkpoint/observation propres au Job
|
-> serde_json/sha2 # discovery/checkpoint/observation propres au Job
|
||||||
```
|
```
|
||||||
|
|
||||||
Le Job conserve seul ses scopes, campagnes, checkpoints et lifecycle. La canonicalisation transactionnelle partagée appartient désormais à `ksp-raw-transaction-lib`; `0.3.17` étendra les stratégies historiques sans déplacer ce rôle.
|
Le Job conserve seul ses scopes, campagnes, checkpoints et lifecycle. La canonicalisation transactionnelle partagée appartient désormais à `ksp-raw-transaction-lib`; l'extension multi-route/historique planifiée à partir de `0.3.19` ne déplacera pas ce rôle.
|
||||||
|
|
||||||
### RAW worker
|
### RAW worker
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md -->
|
<!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md -->
|
||||||
<!-- version: 18 -->
|
<!-- version: 19 -->
|
||||||
|
|
||||||
# Acquisition et alimentation `RawTransaction`
|
# Acquisition et alimentation `RawTransaction`
|
||||||
|
|
||||||
@@ -840,16 +840,18 @@ Stop Yellowstone post-half-close : status distant tardif classé Closed, status
|
|||||||
compatibilité étroite : canonique complet + incoming logMessages avec marqueur exact Log truncated
|
compatibilité étroite : canonique complet + incoming logMessages avec marqueur exact Log truncated
|
||||||
```
|
```
|
||||||
|
|
||||||
Reste hors de cette verticale et nécessite une tranche dédiée :
|
Après fermeture technique de `0.3.16`, restent hors de cette verticale et nécessitent des versions dédiées :
|
||||||
|
|
||||||
```text
|
```text
|
||||||
sources EARLY / pre-execution
|
sources EARLY / pre-execution
|
||||||
campagne historique multi-source ou caller-paramétrable
|
campagne historique multi-source ou caller-paramétrable
|
||||||
variantes RAW durables et résolution générale des conflits
|
cycle de vie complet des conflits : résolution/reopen/historique/rétention des variantes
|
||||||
promotion canonique d'une représentation moins complète vers une plus complète
|
retry Store et reconnexion Transport configurables
|
||||||
retry Store et reconnexion Transport configurables au niveau prévu par 0.3.16
|
Store Desk conflits/variantes/résolutions opérateur
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Les variantes RAW durables, la promotion canonique strictement prouvée et le conflit durable minimal non terminal sont, eux, acquis par `0.3.16`.
|
||||||
|
|
||||||
### 14.3 Gaps Transport Worker
|
### 14.3 Gaps Transport Worker
|
||||||
|
|
||||||
| ID | Adaptation | Motif |
|
| ID | Adaptation | Motif |
|
||||||
@@ -882,9 +884,9 @@ La règle générale reste fail-closed : une divergence canonique non reconnue p
|
|||||||
|
|
||||||
Le sens inverse reste volontairement non résolu en `0.3.15` : un canonique tronqué suivi d'une représentation complète n'est pas promu automatiquement. Deux contenus complets divergents, un préfixe incompatible, une différence hors `logMessages` ou toute relation de troncature non prouvée restent des conflits. Cette asymétrie est précisément le point d'entrée du modèle de variantes/promotion/résolution de `0.3.16`.
|
Le sens inverse reste volontairement non résolu en `0.3.15` : un canonique tronqué suivi d'une représentation complète n'est pas promu automatiquement. Deux contenus complets divergents, un préfixe incompatible, une différence hors `logMessages` ou toute relation de troncature non prouvée restent des conflits. Cette asymétrie est précisément le point d'entrée du modèle de variantes/promotion/résolution de `0.3.16`.
|
||||||
|
|
||||||
## 14.5 Handoff `0.3.16` : résilience RAW et conflits durables
|
## 14.5 Résultat `0.3.16` : fondations multi-variantes et conflits durables
|
||||||
|
|
||||||
`0.3.16` doit déplacer la résolution des divergences RAW dans le contrat Store partagé, afin que Worker live et futurs Jobs historiques convergent avec la même politique. Une divergence de contenu n'est plus assimilée automatiquement à une panne d'acquisition.
|
`0.3.16` déplace l'arbitrage durable des divergences RAW dans le contrat Store partagé, afin que Worker live et Jobs historiques utilisent la même politique de convergence. Une divergence conservable n'est plus assimilée automatiquement à une panne d'acquisition.
|
||||||
|
|
||||||
Modèle cible :
|
Modèle cible :
|
||||||
|
|
||||||
@@ -897,17 +899,17 @@ RawTransaction identity (network, signature)
|
|||||||
-> historique immutable des promotions/résolutions
|
-> historique immutable des promotions/résolutions
|
||||||
```
|
```
|
||||||
|
|
||||||
Classification minimale : `Exact`, `CompatibleLessComplete`, `CompatibleMoreComplete`, `Conflict`. Une représentation prouvée moins complète ne remplace jamais le canonique ; une représentation prouvée plus complète peut le promouvoir atomiquement ; un vrai conflit conserve toutes les variantes sans arrêter l'acquisition. La provenance d'un provider n'établit jamais à elle seule une priorité canonique.
|
Classification livrée : `Exact`, `CompatibleLessComplete`, `CompatibleMoreComplete`, `Conflict`, `Incomparable`. Une représentation prouvée moins complète ne remplace jamais le canonique ; une représentation prouvée plus complète le promeut atomiquement ; `Conflict` et `Incomparable` conservent la variante entrante et ouvrent/mettent à jour un conflict case minimal sans arrêter l'acquisition. La provenance d'un provider n'établit jamais à elle seule une priorité canonique.
|
||||||
|
|
||||||
Le Worker doit distinguer les problèmes locaux durablement gérables des pannes externes. Un conflit RAW quarantiné laisse la route active et rend la santé au plus `Degraded`. Une indisponibilité Store impose backpressure/pause et retry sans perte silencieuse. Une indisponibilité Transport déclenche une politique de reconnexion bornée/configurable (`initial_delay`, `max_delay`, backoff, `max_attempts`, reset après stabilité). Un terminal `Faulted` reste réservé aux erreurs irréconciliables ou à l'épuisement explicite d'une politique de retry/reconnect.
|
Le Worker distingue désormais le conflit durable d'une panne externe : `QuarantinedConflict` laisse la route `Running` et projette `Degraded`, tandis qu'un ancien backend qui renvoie encore `ERROR_CODE_RAW_CONFLICT` reste traité comme erreur terminale de compatibilité. Les politiques complètes de retry Store/backpressure `Blocked` et de reconnexion Transport configurable sont reportées à `0.3.17` ; elles ne sont pas implicitement revendiquées par `0.3.16`.
|
||||||
|
|
||||||
`ksp-app-store-desk` doit ajouter des vues de conflits/variantes et d'historique. Une résolution manuelle peut promouvoir une variante, conserver le canonique, ou produire une variante de fusion assistée. Toute ancienne valeur canonique reste une variante durable et peut être restaurée ultérieurement ; aucun `UPDATE` destructif ne doit rendre une décision manuelle irréversible.
|
`ksp-app-store-desk` reste inchangé en `0.3.16`. Les contrats d'inspection/résolution complets sont préparés en `0.3.17`, puis les vues/actions opérateur de variantes, conflits et historique sont prévues pour `0.3.18`. Toute future décision manuelle doit rester réversible et ne jamais détruire les variantes nécessaires au rollback.
|
||||||
|
|
||||||
Le détail de handoff est fixé dans `docs/plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md`.
|
Le handoff historique est conservé dans `docs/plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md`; le sizing et la répartition actuels sont fixés par `docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md`.
|
||||||
|
|
||||||
## 15. Handoff `0.3.17` : Job Backfill multi-stratégie
|
## 15. Handoff `0.3.17` -> `0.3.20`
|
||||||
|
|
||||||
Le Job doit conserver son vertical slice existant puis ajouter des stratégies historiques choisies selon requête + capabilities + configuration.
|
`0.3.17` ferme le cycle de vie complet des variantes/conflits et la résilience opérationnelle Store/Transport. `0.3.18` expose ensuite inspection et résolution dans Store Desk. Le Job Backfill multi-stratégie est reporté par défaut à `0.3.19` : il doit conserver son vertical slice existant puis ajouter des stratégies historiques choisies selon requête + capabilities + configuration. L'adaptation Backfill Desk correspondante est ciblée par défaut sur `0.3.20`.
|
||||||
|
|
||||||
| Stratégie | Entrée de campagne typique | Acquisition | Admission |
|
| Stratégie | Entrée de campagne typique | Acquisition | Admission |
|
||||||
|----------------------------------------|-----------------------------------|----------------------------|------------------|
|
|----------------------------------------|-----------------------------------|----------------------------|------------------|
|
||||||
@@ -939,11 +941,12 @@ Ordre conseillé :
|
|||||||
0.3.14 P0 : gaps run-local, coverage prouvée, repair borné, source-loss et shutdown/fairness cross-layer
|
0.3.14 P0 : gaps run-local, coverage prouvée, repair borné, source-loss et shutdown/fairness cross-layer
|
||||||
0.3.15 P0 : Raw Transaction Ingest Desk multi-route + stabilité Mainnet Yellowstone/getBlock/polling
|
0.3.15 P0 : Raw Transaction Ingest Desk multi-route + stabilité Mainnet Yellowstone/getBlock/polling
|
||||||
0.3.15 P1 : diagnostic/convergence logMessages tronqués + backpressure gRPC soutenue + Stop post-half-close
|
0.3.15 P1 : diagnostic/convergence logMessages tronqués + backpressure gRPC soutenue + Stop post-half-close
|
||||||
0.3.16 P0 : variantes/conflits RAW durables, promotions/résolutions, retries et Store Desk conflicts
|
0.3.16 P0 : variantes RAW durables, promotion prouvée, conflit minimal durable, Worker non terminal
|
||||||
0.3.17 P0 : block scan historique
|
0.3.17 P0 : résolution/rétention des variantes + retry Store + reconnect Transport configurable
|
||||||
0.3.17 P0 : replay Yellowstone borné
|
0.3.18 P0 : Store Desk conflits/variantes/résolutions opérateur
|
||||||
0.3.17 P1 : provider history/archive
|
0.3.19 P0 : block scan historique + replay Yellowstone borné
|
||||||
0.3.17 P1 : Old Faithful
|
0.3.19 P1 : provider history/archive + Old Faithful
|
||||||
|
0.3.20 P0 : Backfill Desk multi-route
|
||||||
plus tard : substrats directs et sources vendor-specific sans accès actuel
|
plus tard : substrats directs et sources vendor-specific sans accès actuel
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1065,9 +1068,11 @@ TR-C2 = adapter productif Transport DTO -> common réserv
|
|||||||
0.3.11 = fondation Worker source-neutral, persistence et observabilité
|
0.3.11 = fondation Worker source-neutral, persistence et observabilité
|
||||||
0.3.12 = première verticale Yellowstone + hydration/replay continuity
|
0.3.12 = première verticale Yellowstone + hydration/replay continuity
|
||||||
0.3.13 = cinq familles live + convergence/fairness/health/shutdown/completeness
|
0.3.13 = cinq familles live + convergence/fairness/health/shutdown/completeness
|
||||||
0.3.16 = résilience RAW, variantes/conflits/résolutions, retry/reconnect et Store Desk
|
0.3.16 = fondations RAW multi-variantes + conflit durable minimal + Worker non terminal
|
||||||
0.3.17 = Job Backfill multi-route/multi-stratégie historique
|
0.3.17 = lifecycle/résolution/rétention variantes + retry Store + reconnect Transport
|
||||||
0.3.18 = Backfill Desk multi-route
|
0.3.18 = Store Desk variantes/conflits/résolutions
|
||||||
|
0.3.19 cible = Job Backfill multi-route/multi-stratégie historique
|
||||||
|
0.3.20 cible = Backfill Desk multi-route
|
||||||
```
|
```
|
||||||
|
|
||||||
`0.3.9` n'implémente aucune nouvelle stratégie d'acquisition. Il ferme l'architecture et l'inventaire nécessaires aux releases suivantes.
|
`0.3.9` n'implémente aucune nouvelle stratégie d'acquisition. Il ferme l'architecture et l'inventaire nécessaires aux releases suivantes.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md -->
|
<!-- file: docs/plans/038-V0_3_16_RAW_RESILIENCE_CONFLICT_PLAN.md -->
|
||||||
<!-- version: 5 -->
|
<!-- version: 6 -->
|
||||||
|
|
||||||
# Plan `0.3.16` -> `0.3.18` — résilience RAW, variantes, conflits et récupération
|
# Plan `0.3.16` -> `0.3.18` — résilience RAW, variantes, conflits et récupération
|
||||||
|
|
||||||
@@ -978,19 +978,19 @@ Backend PostgreSQL : bootstrap V003, variant ledger, rattachement exact des nouv
|
|||||||
|
|
||||||
#### `0.3.16-pre.005`
|
#### `0.3.16-pre.005`
|
||||||
|
|
||||||
Comparateur partagé : `Exact`, `CompatibleLessComplete`, `CompatibleMoreComplete`, `Conflict`, `Incomparable` ; canaris `logMessages` bidirectionnels et politique fail-closed sur les autres champs. Implémentation livrée par cette tranche ; gate opérateur requis avant `pre.006`.
|
Comparateur partagé : `Exact`, `CompatibleLessComplete`, `CompatibleMoreComplete`, `Conflict`, `Incomparable` ; canaris `logMessages` bidirectionnels et politique fail-closed sur les autres champs. Implémentation livrée et gate opérateur confirmé propre après `pre.005-fix.001`.
|
||||||
|
|
||||||
#### `0.3.16-pre.006`
|
#### `0.3.16-pre.006`
|
||||||
|
|
||||||
Sélecteur canonique et promotion atomique : revision, projection V001 cohérente, conservation de l'ancien canonique et journal minimal des transitions.
|
Sélecteur canonique et promotion atomique : revision, projection V001 cohérente et conservation de l'ancien canonique. Implémentation livrée et gate opérateur confirmé propre après `pre.006-fix.001`.
|
||||||
|
|
||||||
#### `0.3.16-pre.007`
|
#### `0.3.16-pre.007`
|
||||||
|
|
||||||
Conflit durable minimal + intégration Worker : variante conservée, case ouverte, outcome non terminal, suppression/restriction de l'arbitrage run-local plus fort que le Store et health `Degraded` lorsque requis.
|
Conflit durable minimal + intégration Worker : variante conservée, case ouverte, outcome non terminal, suppression de l'arbitrage run-local plus fort que le Store et health `Degraded`. Implémentation livrée et gate opérateur confirmé entièrement propre après `pre.007-fix.003`.
|
||||||
|
|
||||||
#### `0.3.16-pre.008`
|
#### `0.3.16-pre.008`
|
||||||
|
|
||||||
Hardening technique ciblé de la vertical slice : concurrence, rollback transactionnel, régressions Store/Job Backfill/Worker, preuves PostgreSQL live opt-in actualisées et gate workspace. Cette tranche ne mélange ni réconciliation documentaire durable ni préparation de publication.
|
Hardening technique ciblé de la vertical slice : concurrence, rollback transactionnel, régressions Store/Job Backfill/Worker, preuve PostgreSQL live opt-in et gate workspace. Le live RawTransaction a été exécuté avec succès sur PostgreSQL 17 ; le gate opérateur est entièrement propre après `pre.008-fix.001`.
|
||||||
|
|
||||||
#### `0.3.16-pre.009`
|
#### `0.3.16-pre.009`
|
||||||
|
|
||||||
@@ -1004,6 +1004,19 @@ Préparation de publication minimale : `CHANGELOG.md`, `ROADMAP.md`, prompt de d
|
|||||||
|
|
||||||
Publication stable mécanique après gates propres. Aucun Store Desk ni retry Store complet n'est requis pour fermer cette release.
|
Publication stable mécanique après gates propres. Aucun Store Desk ni retry Store complet n'est requis pour fermer cette release.
|
||||||
|
|
||||||
|
État réconcilié avant le gate de `pre.009` :
|
||||||
|
|
||||||
|
```text
|
||||||
|
pre.001 -> pre.008-fix.001 livrés
|
||||||
|
pre.007-fix.003 gate entièrement vert
|
||||||
|
pre.008-fix.001 gate entièrement vert
|
||||||
|
PostgreSQL RawTransaction live PostgreSQL 17 PASS
|
||||||
|
pre.009 réconciliation documentaire en cours
|
||||||
|
pre.010 préparation de publication restant à faire
|
||||||
|
```
|
||||||
|
|
||||||
|
La fermeture `0.3.16` revendique uniquement les fondations multi-variantes, la promotion automatique strictement prouvée, le conflit durable minimal et la continuité Worker après quarantaine. Résolution opérateur complète, rétention/pins de variantes, retry Store, reconnect configurable et Store Desk restent explicitement dans `0.3.17`/`0.3.18`.
|
||||||
|
|
||||||
### 20.2 `0.3.17` — résilience opérationnelle et cycle de vie des variantes
|
### 20.2 `0.3.17` — résilience opérationnelle et cycle de vie des variantes
|
||||||
|
|
||||||
Objectif de fermeture : rendre l'acquisition résiliente aux indisponibilités Store/Transport et fournir les contrats backend-neutral d'inspection/résolution nécessaires aux opérateurs et à la future UI.
|
Objectif de fermeture : rendre l'acquisition résiliente aux indisponibilités Store/Transport et fournir les contrats backend-neutral d'inspection/résolution nécessaires aux opérateurs et à la future UI.
|
||||||
@@ -1038,7 +1051,11 @@ Hardening cross-layer et preuves live ciblées : conflits concurrents, outage/re
|
|||||||
|
|
||||||
#### `0.3.17-pre.008`
|
#### `0.3.17-pre.008`
|
||||||
|
|
||||||
Gate technique final, réconciliation documentaire et préparation de `0.3.17-rel.001` ainsi que du prompt `0.3.18`.
|
Réconciliation documentaire finale : plan, validation, README/USAGE et références durables concernées.
|
||||||
|
|
||||||
|
#### `0.3.17-pre.009`
|
||||||
|
|
||||||
|
Préparation de publication minimale : `CHANGELOG.md`, `ROADMAP.md`, prompt `0.3.18`, version et delta obligatoires uniquement.
|
||||||
|
|
||||||
#### `0.3.17-rel.001`
|
#### `0.3.17-rel.001`
|
||||||
|
|
||||||
@@ -1074,7 +1091,11 @@ Preuves end-to-end et gate technique/live final : PostgreSQL/Store/Worker/Desk,
|
|||||||
|
|
||||||
#### `0.3.18-pre.007`
|
#### `0.3.18-pre.007`
|
||||||
|
|
||||||
Réconciliation documentaire, `CHANGELOG.md`, `ROADMAP.md`, prompt de reprise suivant et préparation de `0.3.18-rel.001`.
|
Réconciliation documentaire finale : plan, validation, README/USAGE et références durables concernées.
|
||||||
|
|
||||||
|
#### `0.3.18-pre.008`
|
||||||
|
|
||||||
|
Préparation de publication minimale : `CHANGELOG.md`, `ROADMAP.md`, prompt de reprise suivant, version et delta obligatoires uniquement.
|
||||||
|
|
||||||
#### `0.3.18-rel.001`
|
#### `0.3.18-rel.001`
|
||||||
|
|
||||||
@@ -1115,7 +1136,6 @@ Le Job Backfill actuel doit seulement rester compatible avec les contrats Store
|
|||||||
|
|
||||||
Les décisions suivantes ne changent pas l'architecture du gate et peuvent être finalisées au moment où des mesures/tests réels existent :
|
Les décisions suivantes ne changent pas l'architecture du gate et peuvent être finalisées au moment où des mesures/tests réels existent :
|
||||||
|
|
||||||
- noms SQL définitifs des ressources V003 ;
|
|
||||||
- valeurs numériques par défaut de Store retry ;
|
- valeurs numériques par défaut de Store retry ;
|
||||||
- valeur par défaut du jitter et de `reset_after_stable_duration` Transport ;
|
- valeur par défaut du jitter et de `reset_after_stable_duration` Transport ;
|
||||||
- colonnes exactes des DataTables Store Desk ;
|
- colonnes exactes des DataTables Store Desk ;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<!-- file: docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md -->
|
<!-- file: docs/validation/033-V0_3_16_RAW_RESILIENCE_CONFLICT.md -->
|
||||||
<!-- version: 2 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# Validation `0.3.16` -> `0.3.18` — résilience RAW et gestion des conflits
|
# Validation `0.3.16` -> `0.3.18` — résilience RAW et gestion des conflits
|
||||||
|
|
||||||
## 1. Objet
|
## 1. Objet
|
||||||
|
|
||||||
Ce document suit le programme de résilience RAW depuis le gate `0.3.16-pre.001` jusqu'à la fermeture prévue de `0.3.18`.
|
Ce document suit le programme de résilience RAW depuis le gate `0.3.16-pre.001` jusqu'à la fermeture prévue de `0.3.18`. La présente révision réconcilie spécifiquement l'état réellement validé de `0.3.16` avant sa lane de préparation de publication.
|
||||||
|
|
||||||
La première tranche ne prétend pas valider une implémentation qui n'existe pas encore. Elle valide le point de départ, les contrats acquis, les décisions d'architecture et la liste des preuves à construire. Le fix documentaire `0.3.16-pre.001-fix.001` répartit ensuite cette matrice sur trois releases stables afin de respecter la contrainte opérationnelle d'une version par session au maximum.
|
La première tranche ne prétend pas valider une implémentation qui n'existe pas encore. Elle valide le point de départ, les contrats acquis, les décisions d'architecture et la liste des preuves à construire. Le fix documentaire `0.3.16-pre.001-fix.001` répartit ensuite cette matrice sur trois releases stables afin de respecter la contrainte opérationnelle d'une version par session au maximum.
|
||||||
|
|
||||||
@@ -412,3 +412,171 @@ Le fix `0.3.16-pre.001-fix.001` ne supprime aucune preuve de la matrice ; il cha
|
|||||||
Chaque stable possède son propre gate de fermeture. Une preuve non nécessaire au périmètre de la stable courante n'est pas déclarée manquante : elle reste explicitement attendue par la version suivante du programme.
|
Chaque stable possède son propre gate de fermeture. Une preuve non nécessaire au périmètre de la stable courante n'est pas déclarée manquante : elle reste explicitement attendue par la version suivante du programme.
|
||||||
|
|
||||||
Les scopes Backfill initialement réservés à `0.3.17` et `0.3.18` sont déplacés après ce programme afin d'éviter une collision de roadmap ; les cibles de planning par défaut deviennent respectivement `0.3.19` et `0.3.20`.
|
Les scopes Backfill initialement réservés à `0.3.17` et `0.3.18` sont déplacés après ce programme afin d'éviter une collision de roadmap ; les cibles de planning par défaut deviennent respectivement `0.3.19` et `0.3.20`.
|
||||||
|
|
||||||
|
## 12. Réconciliation finale `0.3.16-pre.009`
|
||||||
|
|
||||||
|
### 12.1 Périmètre réellement acquis par `0.3.16`
|
||||||
|
|
||||||
|
La vertical slice `0.3.16` ferme les éléments suivants :
|
||||||
|
|
||||||
|
```text
|
||||||
|
Store API
|
||||||
|
RawTransactionVariantId / relation / reason code
|
||||||
|
comparateur partagé fail-closed
|
||||||
|
RawTransactionVariantWriteOutcome
|
||||||
|
RawAcquisitionWriteOutcome::transaction_variant()
|
||||||
|
|
||||||
|
PostgreSQL V003
|
||||||
|
ksp_raw_transaction_variants
|
||||||
|
ksp_raw_transaction_canonical_selectors
|
||||||
|
ksp_raw_transaction_observation_variants
|
||||||
|
ksp_raw_transaction_conflicts
|
||||||
|
|
||||||
|
Convergence
|
||||||
|
Exact -> observation/réutilisation de variante
|
||||||
|
CompatibleLessComplete -> variante observée, canonique inchangé
|
||||||
|
CompatibleMoreComplete -> promotion atomique
|
||||||
|
Conflict / Incomparable -> variante durable + conflict case Open, canonique inchangé
|
||||||
|
|
||||||
|
Worker
|
||||||
|
toute acquisition atteint le Store après sérialisation run-local par identité
|
||||||
|
QuarantinedConflict -> succès durable, Running + Degraded
|
||||||
|
identité suivante -> continue à être traitée
|
||||||
|
ERROR_CODE_RAW_CONFLICT legacy -> terminal de compatibilité
|
||||||
|
|
||||||
|
Job Backfill
|
||||||
|
QuarantinedConflict -> BackfillEntityPersistence::Conflict
|
||||||
|
outcome observation -> conservé, y compris AlreadyPresent
|
||||||
|
```
|
||||||
|
|
||||||
|
`content_hash` reste un préfiltre/intégrité et ne remplace jamais la comparaison des bytes lorsque ceux-ci sont disponibles. La seule dominance automatique admise en `0.3.16` reste la troncature `meta.logMessages` strictement prouvée ; les autres différences restent fail-closed.
|
||||||
|
|
||||||
|
### 12.2 Atomicité et rollback validés
|
||||||
|
|
||||||
|
Le hardening `pre.008` verrouille les invariants suivants :
|
||||||
|
|
||||||
|
- la branche de conflit ne modifie ni le sélecteur canonique ni la projection V001 ;
|
||||||
|
- les helpers de promotion et de conflict case restent dans la transaction d'acquisition externe ;
|
||||||
|
- un échec tardif après création de la variante divergente et du conflict case mais avant `COMMIT` annule ces écritures ;
|
||||||
|
- après rollback, selector et projection V001 restent cohérents avec le canonique antérieur ;
|
||||||
|
- deux écritures divergentes concurrentes produisent un canonique et une quarantaine durable, pas une erreur terminale de contenu.
|
||||||
|
|
||||||
|
### 12.3 Gate opérateur `0.3.16-pre.008-fix.001`
|
||||||
|
|
||||||
|
Le 22 septembre 2026, l'opérateur a exécuté :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
cargo check --workspace
|
||||||
|
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||||
|
|
||||||
|
cargo test -p ksp-store-api --all-targets --all-features
|
||||||
|
cargo test -p ksp-store-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-store-postgres-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-job-backfill-lib --all-targets --all-features
|
||||||
|
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
|
||||||
|
```
|
||||||
|
|
||||||
|
Résultats observés :
|
||||||
|
|
||||||
|
```text
|
||||||
|
cargo fmt --all -- --check PASS
|
||||||
|
General Rust rule audit clean
|
||||||
|
Rust export completeness audit 0 candidate(s)
|
||||||
|
KSP workspace Rust rule audit clean
|
||||||
|
Markdown table audit clean (352 table(s), 958 file(s))
|
||||||
|
cargo check --workspace PASS
|
||||||
|
cargo clippy --workspace --all-targets --all-features -D warnings PASS
|
||||||
|
|
||||||
|
ksp-store-api
|
||||||
|
29 unit + 2 dependency + 1 external backend + 9 public API
|
||||||
|
+ 5 release completeness + 5 security hardening PASS
|
||||||
|
|
||||||
|
ksp-store-lib
|
||||||
|
10 unit + 3 dependency + 1 feature mismatch
|
||||||
|
+ 6 hardening completeness + 5 public API PASS
|
||||||
|
|
||||||
|
ksp-store-postgres-lib
|
||||||
|
88 unit + 13 dependency + 16 hardening completeness
|
||||||
|
+ 13 public API + 3 V003 migration + 8 V003 variant PASS
|
||||||
|
foundation/raw-account/raw-transaction live tests ignored in normal gate as designed
|
||||||
|
|
||||||
|
ksp-job-backfill-lib
|
||||||
|
53 unit + 4 dependency + 9 hardening + 1 HTTP block material
|
||||||
|
+ 6 public API + 3 release + 2 WS parity + 1 Yellowstone PASS
|
||||||
|
|
||||||
|
ksp-worker-raw-transaction-ingest-lib
|
||||||
|
163 unit + 12 cross-layer + 21 dependency + 41 hardening
|
||||||
|
+ 22 public API + 18 release completeness PASS
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun warning Clippy n'est toléré par ce gate.
|
||||||
|
|
||||||
|
### 12.4 Preuve PostgreSQL réelle
|
||||||
|
|
||||||
|
Le live RawTransaction a été exécuté séparément avec une URI dédiée fournie silencieusement sur stdin :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
read -rsp 'PostgreSQL URI: ' KSP_TEST_POSTGRES_URI
|
||||||
|
printf '\n'
|
||||||
|
printf '%s\n' "$KSP_TEST_POSTGRES_URI" \
|
||||||
|
| cargo test -p ksp-store-postgres-lib \
|
||||||
|
--test postgres_raw_transaction_live \
|
||||||
|
-- --ignored --nocapture
|
||||||
|
unset KSP_TEST_POSTGRES_URI
|
||||||
|
```
|
||||||
|
|
||||||
|
Résultat observé :
|
||||||
|
|
||||||
|
```text
|
||||||
|
KSP Store RawTransaction live proof: server major 17
|
||||||
|
test pre_009_real_postgres_raw_transaction_vertical_slice_is_atomic_concurrent_and_recoverable ... ok
|
||||||
|
1 passed; 0 failed
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette preuve couvre notamment la concurrence divergente, la quarantaine durable, la cohérence selector/projection et le rollback tardif ajoutés au hardening `pre.008`.
|
||||||
|
|
||||||
|
### 12.5 Périmètre explicitement reporté
|
||||||
|
|
||||||
|
Ne sont **pas** revendiqués comme acquis par `0.3.16` :
|
||||||
|
|
||||||
|
```text
|
||||||
|
résolution/reopen/historique complet des conflict cases
|
||||||
|
rétention/pins/purge guards propres aux variantes
|
||||||
|
classification Store Transient/Terminal complète
|
||||||
|
retry Store / Blocked / backoff Worker
|
||||||
|
reconnexion WebSocket/Yellowstone configurable étendue
|
||||||
|
inspection/résolution de variantes via ksp-store-lib
|
||||||
|
Store Desk conflits/variantes/résolutions
|
||||||
|
Backfill multi-route/multi-stratégie
|
||||||
|
Backfill Desk multi-route
|
||||||
|
```
|
||||||
|
|
||||||
|
Les six premiers groupes appartiennent à `0.3.17`, Store Desk à `0.3.18`, puis les extensions Backfill sont ciblées par défaut sur `0.3.19`/`0.3.20`.
|
||||||
|
|
||||||
|
### 12.6 État de fermeture avant publication
|
||||||
|
|
||||||
|
```text
|
||||||
|
architecture/sizing CLOSED
|
||||||
|
Store API variantes/comparateur CLOSED
|
||||||
|
migration V003 CLOSED
|
||||||
|
variant ledger + observation mapping CLOSED
|
||||||
|
promotion canonique atomique CLOSED
|
||||||
|
conflit durable minimal CLOSED
|
||||||
|
Worker non terminal sur quarantaine CLOSED
|
||||||
|
régression Backfill CLOSED
|
||||||
|
hardening concurrence/rollback CLOSED
|
||||||
|
PostgreSQL RawTransaction live PASS sur PostgreSQL 17
|
||||||
|
gate technique pre.008-fix.001 PASS
|
||||||
|
réconciliation documentaire pre.009 CURRENT LANE
|
||||||
|
préparation publication pre.010 PENDING
|
||||||
|
rel.001 PENDING
|
||||||
|
```
|
||||||
|
|
||||||
|
La lane `pre.009` ne doit modifier ni `CHANGELOG.md`, ni `ROADMAP.md`, ni le prompt de démarrage `0.3.17`. Ces trois responsabilités appartiennent exclusivement à `pre.010`.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user