v0.3.6-pre.006-fix.001
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md -->
|
||||
<!-- version: 10 -->
|
||||
<!-- version: 11 -->
|
||||
|
||||
# Plan v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -450,13 +450,19 @@ Le gate opérateur de `pre.005` confirme `cargo fmt`, les audits Rust/Markdown,
|
||||
|
||||
### `pre.006` — Conversion RAW v1 et provenance
|
||||
|
||||
**Statut : matérialisé ; gate opérateur à rejouer.**
|
||||
**Statut : matérialisé ; gate fonctionnel vert avec un warning Clippy.**
|
||||
|
||||
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.
|
||||
Le gate opérateur exécute avec succès 19 unitaires et 7 canaries d'intégration, ainsi que `cargo check` et les audits. Clippy reste toutefois non warning-free à cause de `clippy::large_enum_variant` : l'acquisition disponible est beaucoup plus volumineuse que la référence `Missing`. Aucun appel de persistance Store, checkpoint, concurrence runtime ou snapshot concret n'est ouvert ; ces responsabilités restent aux tranches suivantes.
|
||||
|
||||
#### `pre.006-fix.001` — Indirection privée de l'acquisition RAW
|
||||
|
||||
**Statut : matérialisé ; gate opérateur à rejouer.**
|
||||
|
||||
Le fix conserve exactement la forme publique `BackfillHydrationOutcome::Available(BackfillRawAcquisition)` et place uniquement les champs privés transaction + observation derrière une unique `Box`. Aucun `#[allow]` n'est utilisé et aucun `Box` n'apparaît dans l'enum public. Les getters et `into_parts` restent identiques ; une canarie unitaire verrouille la taille pointeur de `BackfillRawAcquisition`. La version workspace devient `0.3.6-pre.6.fix.1`.
|
||||
|
||||
### `pre.007` — Persistance Store et idempotence
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
|
||||
<!-- version: 10 -->
|
||||
<!-- version: 11 -->
|
||||
|
||||
# Validation v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -139,21 +139,23 @@ 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.
|
||||
`pre.006` matérialise cette surface et ses tests statiques/unitaires. Le gate opérateur confirme les audits, `cargo check`, les 19 unitaires et les 7 canaries, mais Clippy émet `clippy::large_enum_variant` sur `BackfillHydrationOutcome` : `Available(BackfillRawAcquisition)` contient au moins 560 octets alors que `Missing(reference)` en contient environ 88. Le résultat fonctionnel est vert, mais la tranche n'est pas considérée warning-free.
|
||||
|
||||
`pre.006-fix.001` conserve l'API publique de l'enum et introduit une seule indirection privée dans `BackfillRawAcquisition`. Aucun `#[allow]` n'est ajouté. Les getters et `into_parts` conservent leurs signatures, et une canarie vérifie que `BackfillRawAcquisition` reste de la taille d'un pointeur. Le gate Cargo du fix reste à rejouer par l'opérateur.
|
||||
|
||||
- [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é.
|
||||
- [ ] `getTransaction` demandé en `base64` avec version maximale `0`.
|
||||
- [ ] Bytes JSON compacts déterministes et golden tests stables.
|
||||
- [ ] Transaction binaire conservée sans décodage métier.
|
||||
- [ ] `meta`, `version` et `transactionIndex` distinguent absent, `null` et valeur.
|
||||
- [ ] Slot et block time non dupliqués dans le payload.
|
||||
- [ ] Block time négatif rejeté explicitement.
|
||||
- [ ] Hash SHA-256 et taille calculés sur les bytes exacts.
|
||||
- [ ] Provenance contient fournisseur, protocole, méthode, endpoint sûr, engagement et réception.
|
||||
- [X] Format `ksp.solana.raw_transaction`, version `1`, figé.
|
||||
- [X] `getTransaction` demandé en `base64` avec version maximale `0`.
|
||||
- [X] Bytes JSON compacts déterministes et golden tests stables.
|
||||
- [X] Transaction binaire conservée sans décodage métier.
|
||||
- [X] `meta`, `version` et `transactionIndex` distinguent absent, `null` et valeur.
|
||||
- [X] Slot et block time non dupliqués dans le payload.
|
||||
- [X] Block time négatif rejeté explicitement.
|
||||
- [X] Hash SHA-256 et taille calculés sur les bytes exacts.
|
||||
- [X] Provenance contient fournisseur, protocole, méthode, endpoint sûr, engagement et réception.
|
||||
- [ ] Clé d'observation domain-separated et déterministe.
|
||||
- [ ] Endpoint différent produit une nouvelle observation légitime.
|
||||
- [X] Endpoint différent produit une nouvelle observation légitime.
|
||||
|
||||
## 11. Persistance Store
|
||||
|
||||
@@ -198,6 +200,8 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
- [ ] Aucun retour de dépendance vers Job depuis les couches basses.
|
||||
- [X] Versions/features auditées : aucune nouvelle version externe ; `sha2` et `tokio` réutilisent les entrées workspace existantes, Tokio étant dev-only en `pre.005`.
|
||||
- [X] `pre.005` matérialise 11 tests unitaires et 6 canaries d’intégration ; le gate opérateur les exécute tous avec succès.
|
||||
- [X] `pre.006` matérialise 19 tests unitaires et 7 canaries d’intégration ; le gate opérateur les exécute tous avec succès, avec uniquement le warning Clippy corrigé par `pre.006-fix.001`.
|
||||
- [ ] `cargo clippy --workspace --all-targets` warning-free sur `pre.006-fix.001`.
|
||||
- [ ] `cargo fmt --all -- --check` vert.
|
||||
- [X] `scripts/audit_rust_workspace_rules.py` vert sur `pre.005` dans l'environnement d'assemblage et dans le gate opérateur.
|
||||
- [X] `scripts/audit_markdown_tables.py` vert sur `pre.005` dans le gate opérateur (264 tables / 147 fichiers, delta inclus).
|
||||
|
||||
Reference in New Issue
Block a user