v0.3.6-pre.007
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# Plan v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -466,13 +466,19 @@ Le fix conserve exactement la forme publique `BackfillHydrationOutcome::Availabl
|
||||
|
||||
#### `pre.006-fix.002` — Auto-deref idiomatique des accesseurs RAW
|
||||
|
||||
Le gate opérateur de `pre.006-fix.001` confirme les audits, `cargo check`, les 20 tests unitaires et les 7 canaries, mais Clippy émet encore deux warnings `clippy::explicit_auto_deref` dans les accesseurs `transaction()` et `observation()` de `BackfillRawAcquisition`. Le correctif supprime uniquement les déréférencements explicites `(*self.inner)` au profit de l'auto-deref de Rust lors de l'accès aux champs privés. La représentation avec une unique `Box`, les signatures publiques, la sémantique RAW/provenance et le coût d'allocation restent inchangés. La version workspace devient `0.3.6-pre.6.fix.2`.
|
||||
**Statut : réalisé ; gate opérateur vert.**
|
||||
|
||||
Le gate opérateur de `pre.006-fix.001` confirme les audits, `cargo check`, les 20 tests unitaires et les 7 canaries, mais Clippy émet encore deux warnings `clippy::explicit_auto_deref` dans les accesseurs `transaction()` et `observation()` de `BackfillRawAcquisition`. Le correctif supprime uniquement les déréférencements explicites `(*self.inner)` au profit de l'auto-deref de Rust lors de l'accès aux champs privés. La représentation avec une unique `Box`, les signatures publiques, la sémantique RAW/provenance et le coût d'allocation restent inchangés. La version workspace devient `0.3.6-pre.6.fix.2`. Le gate opérateur de `fix.002` est intégralement vert : audits Rust/Markdown, `cargo check`, Clippy sans warning, 20 unitaires, 7 canaries d'intégration et arbres Cargo passent.
|
||||
|
||||
### `pre.007` — Persistance Store et idempotence
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : matérialisé ; gate opérateur à rejouer.**
|
||||
|
||||
Budget cible : **15-20 min**. Entrée : RAW v1 figé. Composer l'écriture atomique Store normale et les outcomes distincts. Sortie : insert, already present, purge, observation, missing, conflit et relance idempotente couverts.
|
||||
Budget cible : **15-20 min**. Entrée : RAW v1 figé et gate `pre.006-fix.002` vert. La tranche ajoute `persist_backfill_hydration` et une projection Backfill explicite des outcomes Store sans créer de second contrat de persistance. Une acquisition disponible est consommée par l'unique capacité atomique `RawTransactionWrite::persist_raw_transaction_acquisition` via `ksp-store-lib`, toujours en `RawTransactionAcquisitionMode::Normal`; aucune prélecture Store, écriture d'observation séparée ou `ForceRehydrate` n'est introduite.
|
||||
|
||||
Le réseau du Store est comparé à l'identité `(RawNetworkId, signature)` avant toute écriture. `Missing` n'effectue aucune écriture. Les outcomes Store valides sont projetés en dispositions entité/observation distinctes : `Inserted/Inserted`, `AlreadyPresent/Inserted`, `AlreadyPresent/AlreadyPresent` et `SkippedPurged/NotRecorded`. `ERROR_CODE_RAW_CONFLICT` devient un outcome Backfill `Conflict/NotRecorded`, distinct d'un succès idempotent ; les autres erreurs Store restent des erreurs. Les combinaisons impossibles en mode normal, dont `Rehydrated`, sont rejetées par `ERROR_CODE_BACKFILL_PERSISTENCE_INVALID`.
|
||||
|
||||
La tranche matérialise 29 tests unitaires et 8 canaries d'intégration au total. Les doubles Store restent privés et déterministes ; ils couvrent insert, nouvelle observation sur entité existante, relance idempotente, purge normale, conflit, erreur Store, mismatch réseau et incohérence de référence. La frontière contiguë, la concurrence et le checkpoint restent fermés jusqu'à `pre.008`.
|
||||
|
||||
### `pre.008` — Concurrence, frontier et checkpoint
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
|
||||
<!-- version: 12 -->
|
||||
<!-- version: 13 -->
|
||||
|
||||
# Validation v0.3.6 — Job API et premier backfill RAW
|
||||
|
||||
@@ -143,7 +143,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
|
||||
`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 opérateur du fix confirme ensuite les audits, `cargo check`, les 20 unitaires et les 7 canaries, mais Clippy signale encore deux `clippy::explicit_auto_deref` dans `transaction()` et `observation()`.
|
||||
|
||||
`pre.006-fix.002` remplace uniquement `&(*self.inner).transaction` et `&(*self.inner).observation` par les accès auto-deref idiomatiques `&self.inner.transaction` et `&self.inner.observation`. La Box privée unique, l'API publique et tous les invariants RAW/provenance restent inchangés. Le gate Cargo de `fix.002` reste à rejouer par l'opérateur.
|
||||
`pre.006-fix.002` remplace uniquement `&(*self.inner).transaction` et `&(*self.inner).observation` par les accès auto-deref idiomatiques `&self.inner.transaction` et `&self.inner.observation`. La Box privée unique, l'API publique et tous les invariants RAW/provenance restent inchangés. Le gate opérateur de `fix.002` est intégralement vert : audits Rust/Markdown, `cargo check`, Clippy sans warning, 20 unitaires, 7 canaries d'intégration et arbres Cargo passent sur `0.3.6-pre.6.fix.2`.
|
||||
|
||||
- [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.
|
||||
@@ -156,20 +156,22 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
- [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.
|
||||
- [X] Clé d'observation domain-separated et déterministe, couverte par le gate `pre.006-fix.002`.
|
||||
- [X] Endpoint différent produit une nouvelle observation légitime.
|
||||
|
||||
## 11. Persistance Store
|
||||
|
||||
- [ ] Dépendance unique vers `ksp-store-lib`, jamais vers backend ou API directement.
|
||||
- [ ] Écriture atomique transaction plus observation en mode `Normal`.
|
||||
- [ ] Aucune prélecture de présence avant hydratation.
|
||||
- [ ] Entités insérée, déjà présente et purgée distinguées.
|
||||
- [ ] Observations insérée, déjà présente et non enregistrée distinguées.
|
||||
- [ ] `getTransaction = null` ne produit aucune écriture fabriquée.
|
||||
- [ ] Conflit Store reste une erreur terminale visible.
|
||||
- [ ] Même JobId et même endpoint donnent une relance idempotente.
|
||||
- [ ] `ForceRehydrate` inaccessible depuis le chemin normal.
|
||||
`pre.007` matérialise la composition Store normale sans élargir les responsabilités. Le chemin public consomme un `BackfillHydrationOutcome`, contrôle d'abord le réseau logique du Store, puis utilise exclusivement l'écriture atomique transaction + observation de `ksp-store-lib`. `Missing` ne déclenche aucune écriture. Un conflit de contenu Store est converti en outcome Backfill explicite afin que les tranches de frontier/snapshot puissent le compter puis le traiter comme trou/échec, sans le confondre avec l'idempotence. Les tests Rust de cette tranche sont matérialisés mais restent à exécuter dans le gate opérateur.
|
||||
|
||||
- [X] Dépendance unique vers `ksp-store-lib`, jamais vers backend ou API directement, confirmée par audit de manifeste/source.
|
||||
- [X] Écriture atomique transaction plus observation composée en mode `Normal` dans l'unique chemin de persistance.
|
||||
- [X] Aucune prélecture de présence avant hydratation ou persistance.
|
||||
- [ ] Entités insérée, déjà présente et purgée distinguées au gate Rust `pre.007`.
|
||||
- [ ] Observations insérée, déjà présente et non enregistrée distinguées au gate Rust `pre.007`.
|
||||
- [ ] `getTransaction = null` ne produit aucune écriture fabriquée au gate Rust `pre.007`.
|
||||
- [ ] Conflit Store reste un outcome terminal visible, distinct d'un succès idempotent, au gate Rust `pre.007`.
|
||||
- [ ] Même JobId et même endpoint donnent une relance idempotente au gate Rust `pre.007`.
|
||||
- [X] `ForceRehydrate` absent du chemin normal `pre.007` par audit de source.
|
||||
|
||||
## 12. Concurrence, frontière et checkpoint
|
||||
|
||||
@@ -203,7 +205,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
- [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.002`.
|
||||
- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.006-fix.002`.
|
||||
- [ ] `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).
|
||||
@@ -215,7 +217,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
|
||||
|
||||
## 15. Preuves d'intégration et fermeture
|
||||
|
||||
- [ ] Fake Transport et fake Store déterministes sans backend direct.
|
||||
- [X] Fake Transport et fake Store déterministes sans backend direct matérialisés ; exécution du fake Store `pre.007` à confirmer au gate opérateur.
|
||||
- [ ] Vertical découverte, hydratation, conversion, persistance et observation couvert.
|
||||
- [ ] Smoke Devnet plus PostgreSQL configuré exécuté si l'environnement explicite est disponible.
|
||||
- [ ] Aucun endpoint payant, credential ou donnée sensible requis par les tests normaux.
|
||||
|
||||
Reference in New Issue
Block a user