v0.3.6-pre.009

This commit is contained in:
2026-09-01 16:04:58 +02:00
parent d89aee9910
commit b861a1e3b8
16 changed files with 1846 additions and 86 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
<!-- version: 15 -->
<!-- version: 16 -->
# Validation v0.3.6 — Job API et premier backfill RAW
@@ -90,7 +90,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 6. Notifications multi-listeners
`pre.003` fige le contrat public et ses canaries de resynchronisation. Les cases portant sur le stockage/réveil concret restent volontairement ouvertes jusqu'au producer `ksp-job-backfill-lib` ; un fake de test n'est pas traité comme preuve runtime de production.
`pre.003` fige le contrat public et ses canaries de resynchronisation. `pre.009` matérialise maintenant le producer concret `ksp-job-backfill-lib` avec un `tokio::sync::watch` privé, un handle clonable et des canaries latest-value ; leur gate Rust opérateur reste à rejouer, donc les critères comportementaux ci-dessous restent ouverts jusqu'à exécution.
- [ ] Stockage O(1) de la dernière valeur, sans historique non borné.
- [ ] Un listener lent ne bloque jamais le producteur.
@@ -106,14 +106,14 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
- [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.
- [X] Signature Base58 décodée vers exactement 64 octets, prouvée par le gate `pre.006-fix.002`.
- [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 ; canarie corrigée par `pre.008-fix.001`, gate opérateur du fix à rejouer.
- [X] Checkpoint rejeté si son JobId ou son fingerprint de scope diffère ; canarie `pre.008-fix.001` exécutée avec succès.
- [X] Aucun défaut d'application silencieux dans la bibliothèque.
## 8. Pagination, ordre et déduplication
@@ -175,20 +175,22 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 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. Le gate opérateur confirme format, audits et `cargo check`, mais la compilation des tests échoue en `E0618`/`E0282` parce qu'une liaison locale `request` masque le helper homonyme dans la canarie checkpoint. `pre.008-fix.001` renomme uniquement cette liaison en `primary_request`; le gate du fix reste à rejouer.
`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. Le gate initial révèle uniquement un shadowing de helper dans une canarie ; `pre.008-fix.001` le corrige sans changer le contrat. Le gate réduit du fix est intégralement vert : audits, `cargo check`, Clippy sans warning, 39 unitaires et 9 canaries d'intégration passent sur `0.3.6-pre.8.fix.1`.
- [ ] 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.
- [ ] Frontière avance sur insert, already present et purged skip durables.
- [ ] Missing, conflit, conversion, Transport, Store et annulation créent un trou.
- [ ] Frontière ne saute jamais un trou même si des résultats ultérieurs terminent.
- [ ] Latest rejoue la vue courante de façon idempotente.
- [ ] Before reprend au curseur contigu.
- [ ] After et explicite rejouent le scope borné avec préfixe validé.
- [X] Nombre d'hydratations en vol borné par la requête, prouvé par `pre.008-fix.001`.
- [X] Aucune file de candidats non bornée dans l'exécuteur `pre.008`; les notifications concrètes restent à valider avec `pre.009`.
- [X] Résultats hors ordre réconciliés par index stable.
- [X] Frontière avance sur insert, already present et purged skip durables.
- [X] Missing, conflit, conversion, Transport et Store créent un trou ; la branche annulation est matérialisée dans `pre.009` et reste à exécuter.
- [X] Frontière ne saute jamais un trou même si des résultats ultérieurs terminent.
- [X] Latest rejoue la vue courante de façon idempotente.
- [X] Before reprend au curseur contigu.
- [X] After et explicite rejouent le scope borné avec préfixe validé.
## 13. Annulation et résultats terminaux
`pre.009` matérialise le runtime concret, le canal latest-value et les chemins d'annulation/drainage. Les canaries couvrent l'attente RPC de découverte, une future pré-Store longue, le drainage des candidats déjà admis, les listeners lents/indépendants, la rétention terminale et les arbitrations terminales ; le gate Rust opérateur reste à rejouer avant de cocher ces critères comportementaux.
- [ ] Annulation idempotente et état `Cancelling` observable.
- [ ] Admissions arrêtées après observation du token.
- [ ] Attente de page et hydratation RPC longues abandonnables.
@@ -204,10 +206,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`, `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] Versions/features auditées : aucune nouvelle version externe ; `sha2`, `futures-util` et `tokio` réutilisent les entrées workspace existantes. `futures-util` reste un détail normal privé depuis `pre.008` et `pre.009` promeut Tokio en dépendance normale privée limitée à `macros` + `sync`; aucun type Tokio n'est exposé.
- [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.007` ; `pre.008` atteint la compilation des tests puis échoue sur le shadowing corrigé par `pre.008-fix.001`.
- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.008-fix.001` avec 39 unitaires et 9 canaries vertes ; le gate `pre.009` 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).
@@ -219,7 +221,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 exécutés avec succès au gate `pre.007`; fake processor concurrent `pre.008` matérialisé, gate à rejouer.
- [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-fix.001` exécuté avec succès.
- [ ] 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.