0.3.16-pre.009

This commit is contained in:
2026-09-22 08:59:09 +02:00
parent f2227dce21
commit 40add02ac2
16 changed files with 498 additions and 105 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 648
# version: 649
[workspace]
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"]
[workspace.package]
version = "0.3.16-pre.8.fix.1"
version = "0.3.16-pre.9"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-job-backfill-lib/README.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# ksp-job-backfill-lib
@@ -56,7 +56,7 @@ ksp-job-backfill-lib
-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
@@ -112,7 +112,7 @@ La crate ne possède pas :
- Worker API / worker live ;
- retry, pacing ou sélection d'endpoint Transport ;
- 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 ;
- control plane Job générique.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-job-backfill-lib/USAGE.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# Utilisation de ksp-job-backfill-lib
@@ -191,7 +191,7 @@ entity: Inserted | AlreadyPresent | SkippedPurged | Conflict
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
@@ -203,4 +203,4 @@ Le caller ne doit pas :
- utiliser provider/endpoint comme identité transactionnelle ;
- inventer une provenance pour `getTransaction = null` ;
- 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.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-lib/README.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# 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::close(self).await` pour la fermeture explicite bornée ;
- 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 ;
- 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
`Store` implémente exactement dix capabilities RAW backend-neutral :
`Store` implémente exactement quatorze capabilities RAW backend-neutral :
```text
RawTransactionRead
@@ -74,13 +74,17 @@ RawTransactionObservationRead
RawTransactionObservationWrite
RawTransactionRetentionRead
RawTransactionRetentionWrite
RawTransactionInspectionRead
RawTransactionObservationInspectionRead
RawAccountStateRead
RawAccountStateWrite
RawAccountObservationRead
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 :
@@ -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/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/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.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-lib/USAGE.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# 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.
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
@@ -379,6 +379,6 @@ Les conflits et queries invalides utilisent les codes backend-neutral `store_api
## 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.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-postgres-lib/README.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# 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 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`.
@@ -108,9 +119,9 @@ persist_raw_transaction_acquisition
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
@@ -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/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/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.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-store-postgres-lib/USAGE.md -->
<!-- version: 11 -->
<!-- version: 12 -->
# 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`.
@@ -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`.
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.

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/README.md -->
<!-- version: 18 -->
<!-- version: 19 -->
# ksp-worker-raw-transaction-ingest-lib
@@ -289,7 +289,7 @@ variant quarantined conflict
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

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md -->
<!-- version: 16 -->
<!-- version: 17 -->
# 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.
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

181
deltas/0.3.16/pre.009.md Normal file
View 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).

View File

@@ -1,5 +1,5 @@
<!-- file: docs/000-README.md -->
<!-- version: 74 -->
<!-- version: 75 -->
# 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.
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

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/004-COMPONENT_INVENTORY.md -->
<!-- version: 43 -->
<!-- version: 44 -->
# Inventaire initial des composants KSP
@@ -18,46 +18,46 @@ Ce document maintient l'inventaire synthétique des composants retenus ou presse
## Inventaire synthétique
| 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 |
| 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 Desk | `ksp-app-config-desk` | app | Stable | `0.1.4` | validation/management Config |
| On-chain HTTP | `ksp-onchain-transport-lib` | lib | Stable | `0.2.1``0.2.4` | HTTP standard complet : 52/52 current + 14/14 historical |
| Wallet | `ksp-wallet-lib` | lib | Stable | `0.2.5` | `.kspwallet`, VIEW/OWNER, secrets, signature, import/export |
| Wallet Desk | `ksp-app-wallet-desk` | app | Stable | `0.2.6` | Wallet + Config + balance HTTP + projection SOL/USD auxiliaire |
| Wallet V2 | `ksp-wallet-lib` | lib | Stable | `0.2.6` | wire/runtime V2 + API default/versionnée + migration explicite |
| Standard WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.7` | WebSocket Solana 18/18, sessions/subscriptions bornées |
| Helius WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.8` | LaserStream WS : 7 standard + transaction, actor partagé |
| Yellowstone | `ksp-onchain-transport-lib` | lib | Stable | `0.2.9` | client gRPC standard/provider-neutral |
| Off-chain price | `ksp-offchain-transport-lib` | lib | Stable | `0.2.11` | prix SOL/USD multi-provider, limits et availability |
| SOL Prices Desk | `ksp-app-solprices-desk` | app | Stable | `0.2.12` | HID provider-agnostic pour visualisation/refresh prix |
| Interface passive | `ksp-interface-lib` | lib | Stable | `0.2.13` | façade wire + contrats passifs partagés, dont événements acquisition provider-neutral |
| 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 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 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 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` |
| 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 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` |
| 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 |
| 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 |
| 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 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 worker | nom à fixer | worker/lib | Retenu | fin couche STRUCTURAL | backlog RAW -> STRUCTURAL continu |
| Materializer API | `ksp-materializer-api` | API | Retenu | premier groupe DECODED | contrats extensibles matérialisation |
| Materializer impl. | `ksp-materializer-lib` | lib | Retenu | premier groupe DECODED | implementations officielles communes |
| Execution policy | `ksp-execution-policy-api` | API | Retenu | premier vrai besoin execution | décision/safety multi-contexte |
| Execution orchestration | `ksp-execution-lib` | lib | Retenu | premier vrai cycle execution | Program + policy + Wallet + transport |
| Scenarios | `ksp-scenario-<domain>-lib` | lib | Retenu | vertical slices | validation métier/devnet par groupe |
| Scenario API | `ksp-scenario-api` | API | Non retenu | — | norme souple avant trait commun |
| Market Desk | `ksp-app-market-desk` | app | Pressenti | après Meteora/Raydium/Pump/Orca | tokens, pools, trades, liquidity, price, OHLC |
| Trading Intelligence | noms à définir | libs/jobs | Pressenti | après données stables | features/signaux/anomalies/ML |
| 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 |
| 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 Desk | `ksp-app-config-desk` | app | Stable | `0.1.4` | validation/management Config |
| On-chain HTTP | `ksp-onchain-transport-lib` | lib | Stable | `0.2.1``0.2.4` | HTTP standard complet : 52/52 current + 14/14 historical |
| Wallet | `ksp-wallet-lib` | lib | Stable | `0.2.5` | `.kspwallet`, VIEW/OWNER, secrets, signature, import/export |
| Wallet Desk | `ksp-app-wallet-desk` | app | Stable | `0.2.6` | Wallet + Config + balance HTTP + projection SOL/USD auxiliaire |
| Wallet V2 | `ksp-wallet-lib` | lib | Stable | `0.2.6` | wire/runtime V2 + API default/versionnée + migration explicite |
| Standard WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.7` | WebSocket Solana 18/18, sessions/subscriptions bornées |
| Helius WS | `ksp-onchain-transport-lib` | lib | Stable | `0.2.8` | LaserStream WS : 7 standard + transaction, actor partagé |
| Yellowstone | `ksp-onchain-transport-lib` | lib | Stable | `0.2.9` | client gRPC standard/provider-neutral |
| Off-chain price | `ksp-offchain-transport-lib` | lib | Stable | `0.2.11` | prix SOL/USD multi-provider, limits et availability |
| SOL Prices Desk | `ksp-app-solprices-desk` | app | Stable | `0.2.12` | HID provider-agnostic pour visualisation/refresh prix |
| Interface passive | `ksp-interface-lib` | lib | Stable | `0.2.13` | façade wire + contrats passifs partagés, dont événements acquisition provider-neutral |
| 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 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`, 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`, 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`, 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 |
| 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`, 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.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 |
| 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.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 |
| 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 |
| Materializer API | `ksp-materializer-api` | API | Retenu | premier groupe DECODED | contrats extensibles matérialisation |
| Materializer impl. | `ksp-materializer-lib` | lib | Retenu | premier groupe DECODED | implementations officielles communes |
| Execution policy | `ksp-execution-policy-api` | API | Retenu | premier vrai besoin execution | décision/safety multi-contexte |
| Execution orchestration | `ksp-execution-lib` | lib | Retenu | premier vrai cycle execution | Program + policy + Wallet + transport |
| Scenarios | `ksp-scenario-<domain>-lib` | lib | Retenu | vertical slices | validation métier/devnet par groupe |
| Scenario API | `ksp-scenario-api` | API | Non retenu | — | norme souple avant trait commun |
| Market Desk | `ksp-app-market-desk` | app | Pressenti | après Meteora/Raydium/Pump/Orca | tokens, pools, trades, liquidity, price, OHLC |
| Trading Intelligence | noms à définir | libs/jobs | Pressenti | après données stables | features/signaux/anomalies/ML |
## Contrats séparés retenus

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md -->
<!-- version: 22 -->
<!-- version: 23 -->
# 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.
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
@@ -465,7 +465,7 @@ ksp-job-backfill-lib
-> 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

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md -->
<!-- version: 18 -->
<!-- version: 19 -->
# 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
```
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
sources EARLY / pre-execution
campagne historique multi-source ou caller-paramétrable
variantes RAW durables et résolution générale des conflits
promotion canonique d'une représentation moins complète vers une plus complète
retry Store et reconnexion Transport configurables au niveau prévu par 0.3.16
cycle de vie complet des conflits : résolution/reopen/historique/rétention des variantes
retry Store et reconnexion Transport configurables
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
| 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`.
## 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 :
@@ -897,17 +899,17 @@ RawTransaction identity (network, signature)
-> 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 |
|----------------------------------------|-----------------------------------|----------------------------|------------------|
@@ -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.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.16 P0 : variantes/conflits RAW durables, promotions/résolutions, retries et Store Desk conflicts
0.3.17 P0 : block scan historique
0.3.17 P0 : replay Yellowstone borné
0.3.17 P1 : provider history/archive
0.3.17 P1 : Old Faithful
0.3.16 P0 : variantes RAW durables, promotion prouvée, conflit minimal durable, Worker non terminal
0.3.17 P0 : résolution/rétention des variantes + retry Store + reconnect Transport configurable
0.3.18 P0 : Store Desk conflits/variantes/résolutions opérateur
0.3.19 P0 : block scan historique + replay Yellowstone borné
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
```
@@ -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.12 = première verticale Yellowstone + hydration/replay continuity
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.17 = Job Backfill multi-route/multi-stratégie historique
0.3.18 = Backfill Desk multi-route
0.3.16 = fondations RAW multi-variantes + conflit durable minimal + Worker non terminal
0.3.17 = lifecycle/résolution/rétention variantes + retry Store + reconnect Transport
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.

View File

@@ -1,5 +1,5 @@
<!-- 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
@@ -978,19 +978,19 @@ Backend PostgreSQL : bootstrap V003, variant ledger, rattachement exact des nouv
#### `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`
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`
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`
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`
@@ -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.
É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
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`
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`
@@ -1074,7 +1091,11 @@ Preuves end-to-end et gate technique/live final : PostgreSQL/Store/Worker/Desk,
#### `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`
@@ -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 :
- noms SQL définitifs des ressources V003 ;
- valeurs numériques par défaut de Store retry ;
- valeur par défaut du jitter et de `reset_after_stable_duration` Transport ;
- colonnes exactes des DataTables Store Desk ;

View File

@@ -1,11 +1,11 @@
<!-- 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
## 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.
@@ -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.
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`.