v0.3.6-pre.010

This commit is contained in:
2026-09-01 16:55:14 +02:00
parent 8dbd86c297
commit 7f8ce987a5
6 changed files with 613 additions and 25 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md -->
<!-- version: 20 -->
<!-- version: 23 -->
# Plan v0.3.6 — Job API et premier backfill RAW
@@ -504,7 +504,7 @@ Budget cible : **15-20 min**. Entrée : frontière prouvée et gate `pre.008-fix
L'annulation réutilise `JobCancellationToken` et ajoute un signal réveillable privé. Les attentes de découverte et d'hydratation pré-Store sont abandonnables ; une vérification supplémentaire intervient après hydratation et avant soumission Store. Dès que `persist_backfill_hydration` est appelée, l'écriture atomique n'est plus sélectionnée contre l'annulation : toute opération Store déjà soumise est drainée jusqu'à un résultat connu. L'exécuteur arrête ensuite les nouvelles admissions, draine l'in-flight et publie frontier/checkpoint sûrs. Une arbitration atomique sépare `ACTIVE`, demande d'annulation et états terminaux : une annulation acceptée avant la décision terminale gagne sur une complétion normale, une complétion déjà réclamée refuse l'annulation tardive, et une erreur fatale peut remplacer une annulation pendante afin de ne pas masquer un échec Transport/Store.
Le snapshot complet reste sûr : phase, catégorie de scope, borne de découverte, compteurs d'admission/fin, dispositions entité/observation, missing/conflits/annulations/trous, maximum in-flight, préfixe contigu, checkpoint et éventuel code d'erreur stable ; aucune URL, endpoint/provider, payload RAW ou message fournisseur n'y entre. La tranche matérialise 47 tests unitaires et 10 canaries d'intégration au total, dont listener lent/multi-listeners, rétention terminale, courses terminales, attente pré-Store longue, attente de page RPC pendante et drainage après annulation. Le gate opérateur exécute ces 47 + 10 tests avec succès, mais Clippy révèle deux réexports `pub(crate)` non consommés via la façade crate-root et une canarie générique à type non utilisé ; l'audit manuel montre en outre que plusieurs usages intra-module des items partagés `pub`/`pub(crate)` de la nouvelle crate contournent `crate::`, en contradiction avec `RUST-IMPORT-009`, `RUST-IMPORT-012` et `RUST-API-007`. `pre.010` reste fermé jusqu'au gate vert du fix.
Le snapshot complet reste sûr : phase, catégorie de scope, borne de découverte, compteurs d'admission/fin, dispositions entité/observation, missing/conflits/annulations/trous, maximum in-flight, préfixe contigu, checkpoint et éventuel code d'erreur stable ; aucune URL, endpoint/provider, payload RAW ou message fournisseur n'y entre. La tranche matérialise 47 tests unitaires et 10 canaries d'intégration au total, dont listener lent/multi-listeners, rétention terminale, courses terminales, attente pré-Store longue, attente de page RPC pendante et drainage après annulation. Le gate opérateur exécute ces 47 + 10 tests avec succès, mais Clippy révèle deux réexports `pub(crate)` non consommés via la façade crate-root et une canarie générique à type non utilisé ; l'audit manuel montre en outre que plusieurs usages intra-module des items partagés `pub`/`pub(crate)` de la nouvelle crate contournent `crate::`, en contradiction avec `RUST-IMPORT-009`, `RUST-IMPORT-012` et `RUST-API-007`. `pre.009-fix.002` est désormais validé par le gate opérateur : audits, `cargo check`, Clippy et 47 unitaires + 10 canaries sont verts. `pre.010` peut donc ouvrir le hardening externe.
#### `pre.009-fix.001` — Normalisation crate-root des items partagés et visibilité runtime
@@ -514,16 +514,18 @@ Le fix réconcilie l'intégralité de `ksp-job-backfill-lib` avec les règles de
#### `pre.009-fix.002` — Construction privée du fingerprint via façade crate-root
**Statut : matérialisé ; gate opérateur à rejouer.**
**Statut : alisé ; gate opérateur intégralement vert.**
Le gate de `pre.009-fix.001` révèle une erreur `E0423` : le type public `BackfillScopeFingerprint` est correctement référencé via `crate::BackfillScopeFingerprint`, mais son constructeur de tuple struct n'est pas visible à travers le réexport crate-root puisque son champ `[u8; 32]` reste privé. Le correctif conserve le champ privé et la discipline crate-root : l'initialisation des octets est confinée dans un constructeur associé privé `from_bytes` défini dans `impl crate::BackfillScopeFingerprint`, puis le calcul de fingerprint appelle `crate::BackfillScopeFingerprint::from_bytes(bytes)`. Aucun contrat public, fingerprint, hash, dépendance ou feature ne change.
### `pre.010` — Hardening et canaries externes
**Statut : planifié.**
**Statut : réalisé ; gate opérateur à rejouer.**
Budget cible : **15-20 min**. Entrée : vertical déterministe complet. Fermer scénarios adversariaux, API externe, dépendances et sécurité ; exécuter la preuve live si justifiée et disponible. Sortie : aucun défaut fonctionnel ou firewall ouvert.
La tranche n'élargit aucune API de production et ne modifie aucune dépendance : elle ajoute une suite d'intégration externe `tests/hardening.rs` et renforce la canarie de complétude. Les preuves couvrent les neuf codes d'erreur publics et leur unicité, les bornes/adversaires de requête, l'identité sémantique du fingerprint `(réseau + scope)` indépendante du JobId/rôle Transport, les redactions `Debug`, l'état initial et l'idempotence de l'annulation via le handle public, la surface exacte des dépendances normales/dev, l'absence de backend Store direct et de retour des couches basses vers Job, les chemins crate-root exigés par RUST-IMPORT-009/010/012 et l'absence de types Tokio/Store backend/HTTP dans la façade publique. Le gate matérialisé attendu reste à 47 unitaires et passe de 10 à 20 canaries d'intégration. Le smoke live reste conditionnel et n'est pas requis par cette tranche faute d'environnement PostgreSQL explicitement fourni.
### `pre.011` — Gate technique final
**Statut : planifié.**

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/023-V0_3_6_JOB_API_BACKFILL.md -->
<!-- version: 20 -->
<!-- version: 23 -->
# Validation v0.3.6 — Job API et premier backfill RAW
@@ -189,29 +189,29 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
## 13. Annulation et résultats terminaux
`pre.009` matérialise le runtime concret, le canal latest-value et les chemins d'annulation/drainage. Le gate opérateur exécute avec succès les 47 unitaires et 10 canaries couvrant 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. La qualité Rust reste néanmoins bloquée : `pre.009-fix.001` corrige les chemins crate-root/visibilités et le warning Clippy de la canarie publique, puis son gate révèle `E0423` sur la construction du fingerprint public opaque ; `pre.009-fix.002` corrige ce dernier point et reste à valider.
`pre.009` matérialise le runtime concret, le canal latest-value et les chemins d'annulation/drainage. Le gate opérateur exécute avec succès les 47 unitaires et 10 canaries couvrant 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. La qualité Rust reste néanmoins bloquée : `pre.009-fix.001` corrige les chemins crate-root/visibilités et le warning Clippy de la canarie publique, puis son gate révèle `E0423` sur la construction du fingerprint public opaque ; `pre.009-fix.002` corrige ce dernier point ; son gate opérateur est désormais intégralement vert : audits, `cargo check`, Clippy sans warning, 47 unitaires et 10 canaries.
- [ ] Annulation idempotente et état `Cancelling` observable.
- [ ] Admissions arrêtées après observation du token.
- [ ] Attente de page et hydratation RPC longues abandonnables.
- [ ] Persistance déjà soumise drainée jusqu'à un résultat connu.
- [ ] Course complétion contre annulation déterministe.
- [ ] Course erreur fatale contre annulation déterministe.
- [ ] Missing seul donne `Completed` avec résultat `Partial`.
- [ ] Conflit, conversion ou infrastructure donnent `Failed`.
- [ ] Checkpoint final cohérent avec le dernier préfixe durable.
- [X] Annulation idempotente et état `Cancelling` observable au gate `pre.009-fix.002`.
- [X] Admissions arrêtées après observation du token au gate `pre.009-fix.002`.
- [X] Attente de page et hydratation RPC longues abandonnables au gate `pre.009-fix.002`.
- [X] Persistance déjà soumise drainée jusqu'à un résultat connu au gate `pre.009-fix.002`.
- [X] Course complétion contre annulation déterministe au gate `pre.009-fix.002`.
- [X] Course erreur fatale contre annulation déterministe au gate `pre.009-fix.002`.
- [X] Missing seul donne `Completed` avec résultat `Partial`, couvert par le runtime/exécuteur validé `pre.009-fix.002`.
- [X] Conflit, conversion ou infrastructure donnent `Failed`, couvert par le runtime/exécuteur validé `pre.009-fix.002`.
- [X] Checkpoint final cohérent avec le dernier préfixe durable au gate `pre.009-fix.002`.
## 14. Firewalls et qualité Rust
- [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.
- [ ] Aucun retour de dépendance vers Job depuis les couches basses ; canarie externe `pre.010` matérialisée.
- [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] `pre.009` : `cargo check --workspace` vert et 47 unitaires + 10 canaries vertes ; Clippy signale 3 warnings de normalisation/API de test, corrigés par `pre.009-fix.001`; le gate de ce fix révèle ensuite `E0423`, corrigé par `pre.009-fix.002` et encore à revalider.
- [X] `pre.009` : après `fix.001` puis `fix.002`, audits, `cargo check`, Clippy sans warning et 47 unitaires + 10 canaries sont verts sur `0.3.6-pre.9.fix.2`.
- [X] Audit manuel `pre.009-fix.001` : les items partagés de `ksp-job-backfill-lib` passent par `crate::Item`; `BackfillRuntimeControl`/`TerminalClaim` restent privés et les unit tests runtime utilisent `super::Item`, conformément à RUST-IMPORT-009/012 et RUST-API-007.
- [ ] `pre.009-fix.002` : `E0423` corrigé en confinant la construction du champ privé dans `BackfillScopeFingerprint::from_bytes`; gate opérateur Rust à rejouer.
- [X] `pre.009-fix.002` : `E0423` corrigé en confinant la construction du champ privé dans `BackfillScopeFingerprint::from_bytes`; gate opérateur intégralement vert.
- [ ] `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).
@@ -221,6 +221,20 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique
- [ ] `cargo test --workspace --all-targets --all-features` vert.
- [ ] `cargo tree -d` examiné et doublons justifiés.
### Hardening externe `pre.010`
La tranche ajoute 9 canaries externes et une canarie de complétude, portant le total d'intégration attendu à 20 sans modifier les 47 unitaires. Le gate Rust reste à rejouer.
- [ ] Neuf codes d'erreur publics Backfill stables, uniques et dans le domaine `job_backfill`; canarie externe matérialisée.
- [ ] Signature Base58 hostile et bornes de requête invalides retournent les codes stables attendus ; canarie externe matérialisée.
- [ ] Fingerprint sensible au réseau mais indépendant du JobId et du rôle Transport ; canarie externe matérialisée.
- [ ] `Debug` des signatures/fingerprint/requête/handle ne révèle ni signature brute ni payload snapshot ; canarie externe matérialisée.
- [ ] Handle public créé en état `Created`, annulation acceptée une fois puis idempotemment rejetée ; canarie externe matérialisée.
- [ ] Surface de dépendances exacte et backend-neutral, avec Store façade `default-features = false`; canarie externe matérialisée.
- [ ] Surface source Backfill conforme aux chemins crate-root pour les items partagés et sans `crate::module::Item`; canarie externe matérialisée.
- [ ] Aucun retour des couches Core/Logging/Transport/Store vers Job ; canarie externe matérialisée.
- [ ] Façade publique sans fuite Tokio/Futures/Serde/Store backend/HTTP ; canarie externe matérialisée.
## 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-fix.001` exécuté avec succès.