v0.3.6-pre.006
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md -->
|
||||
<!-- version: 9 -->
|
||||
<!-- version: 10 -->
|
||||
|
||||
# Plan v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -343,7 +343,7 @@ Graphe prévu :
|
||||
|
||||
Aucun document Config `std.jobs.*` n'est introduit. Les réglages de Job sont fournis explicitement par l'hôte ; la composition Config appartient à l'application v0.3.7.
|
||||
|
||||
La dépendance Base58 exacte sera ajoutée seulement après audit de version et de features lors de la tranche de conversion.
|
||||
L'audit de `pre.006` conclut qu'aucune dépendance Base58 externe n'est nécessaire pour cette frontière étroite : un décodeur privé borné à exactement 64 octets suffit, évite une dépendance publique ou protocolaire supplémentaire et reste couvert par les golden tests. `serde_json`, déjà centralisé au workspace, devient la seule dépendance normale additionnelle de la crate pour l'écriture canonique et récursive du JSON.
|
||||
|
||||
## 20. Stratégie de tests et canaries
|
||||
|
||||
@@ -434,7 +434,7 @@ Les tests couvrent le succès direct `null`, la surface publique et surtout un r
|
||||
|
||||
### `pre.005` — Fondation Backfill et découverte
|
||||
|
||||
**Statut : réalisé ; corrigé par `pre.005-fix.001`, gate opérateur du fix à rejouer.**
|
||||
**Statut : clôturé ; corrigé par `pre.005-fix.001`, gate opérateur vert.**
|
||||
|
||||
Budget cible : **15-20 min**. Entrée : Transport observé stable et gate `pre.004` vert. La tranche crée `ksp-job-backfill-lib` avec dépendances directes Job API, Core, Logging, Onchain Transport, Store façade sans feature backend imposée et SHA-256 déjà centralisé au workspace ; Tokio reste uniquement une dev-dependency pour les tests async de cette tranche.
|
||||
|
||||
@@ -444,15 +444,19 @@ La requête impose explicitement `JobId`, `RawNetworkId`, rôle HTTP, engagement
|
||||
|
||||
#### `pre.005-fix.001` — Return explicite dans la closure du curseur Before
|
||||
|
||||
**Statut : matérialisé ; gate opérateur à rejouer.**
|
||||
**Statut : clôturé ; gate opérateur vert.**
|
||||
|
||||
Le gate opérateur de `pre.005` confirme `cargo fmt`, les audits Rust/Markdown, `cargo check --workspace`, les 11 tests unitaires, les 6 canaries d’intégration et les arbres Cargo. `cargo clippy --workspace --all-targets` échoue uniquement sur `clippy::implicit_return` à la construction optionnelle du curseur `before` dans `discover_older`. Le fix remplace l'expression implicite de la closure par `return value.as_str().to_owned()` sans modifier la valeur produite, les branches de scope, la pagination ou le contrat public. Comme un fichier Rust est corrigé, la version workspace devient `0.3.6-pre.5.fix.1`.
|
||||
Le gate opérateur de `pre.005` confirme `cargo fmt`, les audits Rust/Markdown, `cargo check --workspace`, les 11 tests unitaires, les 6 canaries d’intégration et les arbres Cargo. `cargo clippy --workspace --all-targets` échoue uniquement sur `clippy::implicit_return` à la construction optionnelle du curseur `before` dans `discover_older`. Le fix remplace l'expression implicite de la closure par `return value.as_str().to_owned()` sans modifier la valeur produite, les branches de scope, la pagination ou le contrat public. Comme un fichier Rust est corrigé, la version workspace devient `0.3.6-pre.5.fix.1`. Le gate du fix est ensuite intégralement vert : `cargo fmt`, audits Rust/Markdown, `cargo check`, Clippy, 11 unitaires, 6 canaries et arbres Cargo passent sur `0.3.6-pre.5.fix.1`. Les versions d'en-tête du `Cargo.toml` racine et du fichier Rust corrigé sont synchronisées dans la base opérateur avant ouverture de `pre.006`.
|
||||
|
||||
### `pre.006` — Conversion RAW v1 et provenance
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : matérialisé ; gate opérateur à rejouer.**
|
||||
|
||||
Budget cible : **15-20 min**. Entrée : candidats déterministes. Implémenter décodage Base58 minimal, payload canonique et provenance. Sortie : golden bytes, hash, absent contre `null` et block time hostile couverts.
|
||||
Budget cible : **15-20 min**. Entrée : candidats déterministes et gate `pre.005-fix.001` vert. La tranche ajoute une conversion RAW v1 strictement en mémoire : `BackfillSignature::to_raw_transaction_signature` décode Base58 vers exactement 64 octets sans SDK Solana ni nouvelle dépendance Base58 ; `hydrate_backfill_candidate` appelle uniquement `HttpTransportPool::get_transaction_observed` avec `base64`, engagement explicite et `maxSupportedTransactionVersion = 0`. Un résultat `null` devient `BackfillHydrationOutcome::Missing(RawTransactionReference)` et ne contient structurellement aucune provenance.
|
||||
|
||||
Le payload `ksp.solana.raw_transaction` version `1` conserve la transaction comme tuple `[data, "base64"]`, omet `slot` et `blockTime`, préserve les états omitted/null/value de `meta`, `version` et `transactionIndex`, et canonise récursivement les objets JSON par tri lexical des clés avant calcul SHA-256. Les block times négatifs ou hors plage sont rejetés. Une acquisition disponible produit `RawTransaction` et `RawTransactionObservation` avec provider, protocole `solana.http.json_rpc`, méthode `getTransaction`, endpoint victorieux, engagement, `JobId` et timestamp de réception. La clé d'observation est domain-separated et dépend du JobId, fingerprint, signature, provider, endpoint, engagement et version du contrat ; changer d'endpoint crée donc une observation distincte sans changer l'identité `(network, signature)`.
|
||||
|
||||
La tranche matérialise 8 nouveaux tests unitaires de conversion, portant le total Backfill à 19 unitaires, et une canarie publique supplémentaire, portant les canaries d'intégration à 7. Aucun appel de persistance Store, checkpoint, concurrence runtime ou snapshot concret n'est ouvert ; ces responsabilités restent aux tranches suivantes.
|
||||
|
||||
### `pre.007` — Persistance Store et idempotence
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
|
||||
<!-- version: 9 -->
|
||||
<!-- version: 10 -->
|
||||
|
||||
# Validation v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -60,6 +60,8 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
- [X] Gate opérateur de `pre.005` : `cargo fmt`, audits Rust/Markdown et `cargo check --workspace` verts ; les 11 tests unitaires et 6 canaries `ksp-job-backfill-lib` sont verts.
|
||||
- [X] Le même gate révèle un unique échec Clippy `clippy::implicit_return` dans la closure privée qui dérive le curseur `before`; les arbres Cargo normal/features sont néanmoins exécutés et cohérents avec le graphe prévu.
|
||||
- [X] `pre.005-fix.001` ajoute uniquement le `return` explicite exigé dans cette closure et ne modifie ni valeur, ni pagination, ni identité réseau, ni dépendance, ni API publique.
|
||||
- [X] Gate opérateur de `pre.005-fix.001` : `cargo fmt`, audits Rust/Markdown, `cargo check`, Clippy, 11 unitaires + 6 canaries `ksp-job-backfill-lib` et arbres Cargo normal/features verts sur `0.3.6-pre.5.fix.1`.
|
||||
- [X] Versions d'en-tête du `Cargo.toml` racine et de `discovery.rs` corrigées dans la base opérateur avant `pre.006`.
|
||||
|
||||
## 4. Autorités et cohérence documentaire
|
||||
|
||||
@@ -100,30 +102,30 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
|
||||
## 7. Admission et portées
|
||||
|
||||
`pre.005` matérialise les contrats et leurs tests. Le gate opérateur confirme les 11 unitaires et 6 canaries, tandis que Clippy impose un fix syntaxique sans effet comportemental avant clôture complète. L'identité candidate est `(RawNetworkId, signature)` ; rôle HTTP, provider, endpoint et protocole ne participent ni à cette identité ni au fingerprint sémantique du scope.
|
||||
`pre.005` matérialise les contrats et leurs tests. Le gate du fix confirme les 11 unitaires et 6 canaries avec Clippy vert. L'identité candidate est `(RawNetworkId, signature)` ; rôle HTTP, provider, endpoint et protocole ne participent ni à cette identité ni au fingerprint sémantique du scope.
|
||||
|
||||
- [ ] `LatestAddress`, `BeforeAddress`, `AfterAddress` et `ExplicitSignatures` couverts.
|
||||
- [ ] Adresse validée par le type Core existant.
|
||||
- [X] `LatestAddress`, `BeforeAddress`, `AfterAddress` et `ExplicitSignatures` couverts.
|
||||
- [X] Adresse validée par le type Core existant.
|
||||
- [ ] Signature Base58 décodée vers exactement 64 octets.
|
||||
- [ ] Engagement limité à `Confirmed` ou `Finalized`.
|
||||
- [ ] Taille de page entre 1 et 1 000.
|
||||
- [ ] Nombre de pages entre 1 et 10 000.
|
||||
- [ ] Nombre de candidats entre 1 et 10 000.
|
||||
- [ ] Concurrence d'hydratation entre 1 et 64.
|
||||
- [ ] `min_context_slot` transmis sans en changer le sens.
|
||||
- [X] Engagement limité à `Confirmed` ou `Finalized`.
|
||||
- [X] Taille de page entre 1 et 1 000.
|
||||
- [X] Nombre de pages entre 1 et 10 000.
|
||||
- [X] Nombre de candidats entre 1 et 10 000.
|
||||
- [X] Concurrence d'hydratation entre 1 et 64.
|
||||
- [X] `min_context_slot` transmis sans en changer le sens.
|
||||
- [ ] Checkpoint rejeté si son JobId ou son fingerprint de scope diffère.
|
||||
- [ ] Aucun défaut d'application silencieux dans la bibliothèque.
|
||||
- [X] Aucun défaut d'application silencieux dans la bibliothèque.
|
||||
|
||||
## 8. Pagination, ordre et déduplication
|
||||
|
||||
- [ ] Latest respecte l'ordre officiel du plus récent au plus ancien.
|
||||
- [ ] Before utilise une ancre exclusive et avance vers l'historique plus ancien.
|
||||
- [ ] After atteint l'ancre, garde les plus proches candidats plus récents et produit un ordre déterministe.
|
||||
- [ ] Ancre before absente acceptée comme curseur.
|
||||
- [ ] Ancre after non atteinte bornée et signalée comme résultat partiel.
|
||||
- [ ] Doublons inter-pages retirés à première occurrence.
|
||||
- [ ] Doublons explicites retirés sans réordonner la liste.
|
||||
- [ ] Limites de pages et candidats respectées sur tous les chemins.
|
||||
- [X] Latest respecte l'ordre officiel du plus récent au plus ancien.
|
||||
- [X] Before utilise une ancre exclusive et avance vers l'historique plus ancien.
|
||||
- [X] After atteint l'ancre, garde les plus proches candidats plus récents et produit un ordre déterministe.
|
||||
- [X] Ancre before absente acceptée comme curseur.
|
||||
- [X] Ancre after non atteinte bornée et signalée comme résultat partiel.
|
||||
- [X] Doublons inter-pages retirés à première occurrence.
|
||||
- [X] Doublons explicites retirés sans réordonner la liste.
|
||||
- [X] Limites de pages et candidats respectées sur tous les chemins.
|
||||
|
||||
## 9. Acquisition Transport et retry
|
||||
|
||||
@@ -137,6 +139,8 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
|
||||
## 10. RAW v1 et provenance
|
||||
|
||||
`pre.006` matérialise cette surface et ses tests statiques/unitaires ; les cases ci-dessous restent ouvertes jusqu'au gate Cargo opérateur de la tranche.
|
||||
|
||||
- [X] Identité logique future auditée : transaction/signature scoping par `RawNetworkId`, jamais par rôle/provider/endpoint/protocole.
|
||||
- [X] Le Store PostgreSQL actuel est mono-réseau via `ksp_store_identity`; un futur backend multi-réseaux devra préserver `(network, signature)` par clé/partition équivalente.
|
||||
- [ ] Format `ksp.solana.raw_transaction`, version `1`, figé.
|
||||
|
||||
Reference in New Issue
Block a user