v0.3.6-pre.008

This commit is contained in:
2026-09-01 15:14:57 +02:00
parent 138395ac35
commit 75cbf9df09
18 changed files with 1483 additions and 104 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
<!-- version: 13 -->
<!-- version: 14 -->
# Validation v0.3.6 — Job API et premier backfill RAW
@@ -113,7 +113,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
- [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.
- [ ] Checkpoint rejeté si son JobId ou son fingerprint de scope diffère ; test `pre.008` matérialisé, gate opérateur à rejouer.
- [X] Aucun défaut d'application silencieux dans la bibliothèque.
## 8. Pagination, ordre et déduplication
@@ -129,13 +129,13 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 9. Acquisition Transport et retry
- [ ] Les wrappers typés officiels restent l'unique chemin RPC.
- [X] Les wrappers typés officiels restent l'unique chemin RPC, confirmé par audit de source jusqu'à `pre.008`.
- [X] Retour observé additif de `getTransaction` matérialisé et gate opérateur vert.
- [X] Canarie déterministe : un `429` sur le premier endpoint reroute et rapporte le second provider/endpoint victorieux ; gate opérateur vert.
- [X] `HttpObservedValue<T>` ne contient que valeur typée, endpoint sûr et provider ; URL, headers et body HTTP brut restent privés.
- [ ] Aucun retry, pacing ou sélection d'endpoint dans Job.
- [ ] Aucune détection d'erreur par chaîne.
- [ ] Une erreur Transport finale arrête les admissions avec un code Job sûr.
- [X] Aucun retry, pacing ou sélection d'endpoint dans Job, confirmé par audit de source `pre.008`.
- [X] Aucune détection d'erreur par chaîne dans la composition Backfill `pre.008`.
- [ ] Une erreur Transport finale arrête les admissions avec un code Job sûr ; exécuteur et test `pre.008` matérialisés, gate opérateur à rejouer.
## 10. RAW v1 et provenance
@@ -161,20 +161,22 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 11. Persistance Store
`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.
`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. Le gate opérateur `pre.007` est intégralement vert : audits, `cargo check`, Clippy sans warning, 29 unitaires, 8 canaries et arbres Cargo passent.
- [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] Entités insérée, déjà présente et purgée distinguées au gate Rust `pre.007`.
- [X] Observations insérée, déjà présente et non enregistrée distinguées au gate Rust `pre.007`.
- [X] `getTransaction = null` ne produit aucune écriture fabriquée au gate Rust `pre.007`.
- [X] Conflit Store reste un outcome terminal visible, distinct d'un succès idempotent, au gate Rust `pre.007`.
- [X] 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
`pre.008` matérialise un checkpoint opaque caller-owned, sans table Store ni promesse de reprise crash-safe. `BackfillRequest::with_checkpoint` valide `JobId` et fingerprint avant usage. L'exécuteur utilise une collection `FuturesUnordered` strictement bornée par `hydration_concurrency`, réconcilie les fins hors ordre par index stable et draine les futures déjà admises après la première erreur fatale. Les tests couvrent frontier contiguë, Missing, conflit, reprise Before/Latest/Explicit et protection After lorsque l'ancre n'est pas atteinte ; ils restent à exécuter dans le gate opérateur.
- [ ] Nombre d'hydratations en vol borné par la requête.
- [ ] Aucune file de candidats ou notifications non bornée.
- [ ] Résultats hors ordre réconciliés par index stable.
@@ -202,10 +204,10 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
- [X] `ksp-job-api` dépend exactement de Core et n'a aucune feature, dev-dependency ou build-dependency.
- [X] `ksp-job-backfill-lib` ne dépend pas de Config, App, Wallet, Program, Interface ou backend Store ; `ksp-store-lib` est consommée avec `default-features = false`.
- [ ] 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] Versions/features auditées : aucune nouvelle version externe ; `sha2`, `futures-util` et `tokio` réutilisent les entrées workspace existantes. `futures-util` devient un détail normal privé de `pre.008`, Tokio reste dev-only.
- [X] `pre.005` matérialise 11 tests unitaires et 6 canaries dintégration ; le gate opérateur les exécute tous avec succès.
- [X] `pre.006` matérialise 19 tests unitaires et 7 canaries dintégration ; le gate opérateur les exécute tous avec succès, avec uniquement le warning Clippy corrigé par `pre.006-fix.001`.
- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.006-fix.002`.
- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.007` ; le gate `pre.008` reste à rejouer.
- [ ] `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).
@@ -217,7 +219,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 15. Preuves d'intégration et fermeture
- [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.
- [X] Fake Transport et fake Store déterministes sans backend direct exécutés avec succès au gate `pre.007`; fake processor concurrent `pre.008` matérialisé, gate à rejouer.
- [ ] 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.