v0.3.7-pre.011

This commit is contained in:
2026-09-02 19:50:01 +02:00
parent 313d2a1ea6
commit 618f940310
20 changed files with 682 additions and 43 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/028-V0_3_7_BACKFILL_DESK_PLAN.md -->
<!-- version: 10 -->
<!-- version: 11 -->
# Plan v0.3.7 — Backfill Desk
@@ -192,9 +192,11 @@ Règles :
## 10. Reprise et checkpoint
V1 conserve le dernier `BackfillCheckpoint` uniquement dans Rust. L'UI voit `checkpoint_present` et `contiguous_completed`, jamais les octets/identité internes du checkpoint.
V1 conserve le dernier `BackfillCheckpoint` et la requête sémantique terminale uniquement dans Rust. L'UI voit `checkpoint_present` et `contiguous_completed`, jamais les octets/identité internes du checkpoint.
`Resume` reconstruit une requête sémantiquement identique avec un nouveau lifecycle contrôlé et réattache le checkpoint via `BackfillRequest::with_checkpoint`. Le backend doit préserver les éléments participant au scope fingerprint ; toute modification de scope/commitment/bornes sémantiques force une nouvelle campagne et invalide Resume.
Le checkpoint concret reste lié au JobId qui l'a produit. Pour créer un nouveau lifecycle sans affaiblir cette garantie, `ksp-job-backfill-lib` valide d'abord le checkpoint contre la requête terminale d'origine puis `BackfillRequest::resume_for_job` le réémet sur le nouveau JobId backend en conservant exactement scope fingerprint, frontier et cursor interne. La Desk ne fabrique ni ne modifie ces éléments.
`Resume` exige en outre que la composition Transport/Store courante reste compatible avec le réseau et le rôle logique de la requête retenue. Toute modification de scope/commitment/bornes sémantiques appartient à une nouvelle campagne et n'utilise pas Resume.
Aucun JSON, fichier ou table checkpoint n'est inventé. La reprise après crash/redémarrage est reportée à une évolution explicite du contrat Backfill si un besoin durable est démontré.
@@ -282,7 +284,9 @@ Le frontend expose **Annuler** uniquement pour un status actif, trace seulement
### pre.011 — checkpoint/frontier et Resume
Projection sûre, conservation Rust-only du checkpoint, reprise in-session et invariants par scope.
Conserver avec le dernier terminal la requête KSP ayant produit le checkpoint, uniquement dans l'état Rust de la Desk. `ksp-job-backfill-lib` ajoute `BackfillRequest::resume_for_job` : l'opération valide le checkpoint contre son JobId et son scope fingerprint d'origine, puis réémet uniquement l'identité Job pour le nouveau lifecycle sans exposer ni modifier cursor/frontier.
La commande `backfill_resume()` alloue un nouveau JobId backend, refuse un run actif ou l'absence de checkpoint, revalide la compatibilité réseau/rôle avec la composition courante, reconstruit `BackfillJobRuntime` et réutilise le même chemin de spawn/monitoring que Start. Le frontend expose **Reprendre** seulement sur un terminal avec `checkpoint_present`. Aucun checkpoint, adresse, signature ou paramètre de campagne ne traverse cette commande IPC.
### pre.012 — frontend fonctionnel et polish

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
<!-- version: 18 -->
<!-- version: 19 -->
# Validation v0.3.7 — Backfill Desk
@@ -500,4 +500,30 @@ Le frontend ajoute un bouton **Annuler** au monitoring, transmet uniquement le J
- [X] frontend Cancel sans adresse/signature/provider/endpoint/checkpoint/payload ;
- [X] aucune dépendance/feature Cargo ajoutée ;
- [X] Resume non ouvert ;
- [ ] `cargo fmt/check/clippy/test` de `pre.010` à rejouer par l'opérateur.
- [X] replay opérateur `cargo fmt/check/clippy/test` de `pre.010` propre ; smoke Tauri Mainnet confirme Cancel ciblé, terminalisation puis shutdown Store.
## 25. `pre.011` — checkpoint/frontier et Resume in-session
Le replay opérateur de `pre.010` ferme le couloir Cancel : audits Rust/Markdown, `cargo check --workspace`, Clippy, les 49 tests unitaires `ksp-job-backfill-lib` et toutes les suites Backfill Desk passent. Le smoke Tauri Mainnet confirme également le chemin réel : Store ready, campagne HTTP active, Cancel ciblé accepté, transition `cancelling`, terminalisation du Job puis libération du slot avant shutdown. La phase `finished` observée est la phase terminale commune ; le lifecycle Job reste `cancelled`.
`pre.011` ouvre la reprise in-session sans sérialisation du checkpoint. Le contrat existant lie volontairement `BackfillCheckpoint` au JobId qui l'a produit ; la Desk ne peut donc pas simplement attacher ce checkpoint à un nouveau Job. `ksp-job-backfill-lib` ajoute `BackfillRequest::resume_for_job` : le checkpoint est d'abord validé contre la requête d'origine puis réémis en interne pour le nouveau JobId, avec scope fingerprint, completed prefix et éventuel cursor Before inchangés.
`BackfillRunState` retient maintenant la requête terminale avec la notification terminale, uniquement en mémoire Rust. `backfill_resume` n'accepte aucun argument frontend, alloue un nouveau JobId backend, exige un checkpoint présent, refuse tout run actif et revalide que réseau Store et rôle HTTP correspondent encore à la composition courante. La commande utilise le même chemin `spawn_backfill_launch` et le même monitoring latest-value que Start.
Le frontend expose **Reprendre** uniquement pour un snapshot terminal avec `checkpoint_present=true`. `BackfillResumeResponseDto` contient uniquement `accepted`, `job_id` et `state`; aucun checkpoint, cursor, adresse, signature, provider, endpoint ou payload RAW ne traverse IPC.
### Gate statique local `pre.011`
- [X] checkpoint original validé avant réémission vers un nouveau JobId ;
- [X] scope fingerprint/frontier/cursor inchangés par `resume_for_job` ;
- [X] requête terminale + checkpoint retenus uniquement dans `BackfillRunState` Rust ;
- [X] Resume refusé sans terminal/checkpoint ou lorsqu'un run est déjà actif ;
- [X] compatibilité réseau Store + rôle HTTP revalidée avant reprise ;
- [X] nouveau JobId exclusivement backend ;
- [X] chemin de spawn/monitoring partagé avec Start ;
- [X] DTO Resume limité à `accepted`, `job_id`, `state` ;
- [X] frontend Resume sans checkpoint ni payload de campagne ;
- [X] aucun fichier/table/JSON de checkpoint durable ajouté ;
- [X] aucune dépendance/feature Cargo ajoutée ;
- [ ] `cargo fmt/check/clippy/test` de `pre.011` à rejouer par l'opérateur.