# Delta `0.3.7-pre.011` — checkpoint/frontier et Resume in-session ## 1. Base requise ```text 0.3.7-pre.010 workspace.package.version = 0.3.7-pre.10 ``` ## 2. Objectif Ouvrir Resume sans introduire de checkpoint durable ni affaiblir l'identité du checkpoint : conserver la requête terminale et son checkpoint uniquement dans Rust, réémettre le checkpoint vers un nouveau JobId backend après validation de son identité d'origine, puis relancer le même runtime/monitoring que Start. ## 3. Reprise contrôlée côté Job Backfill `BackfillCheckpoint` reste opaque et lié au JobId qui l'a produit. `ksp-job-backfill-lib` ajoute `BackfillRequest::resume_for_job` : - le checkpoint est validé contre le JobId et le scope fingerprint de la requête terminale d'origine ; - seul le JobId est réémis pour le nouveau lifecycle ; - scope fingerprint, completed prefix et éventuel cursor `before` restent inchangés ; - `BackfillRequest::with_checkpoint` revalide ensuite le checkpoint réémis contre la nouvelle requête. Aucun constructeur public de checkpoint, aucune sérialisation et aucun cursor exposé ne sont ajoutés. ## 4. Ownership Rust-only côté Desk `BackfillRunState` retient désormais avec le dernier terminal la `BackfillRequest` exacte qui a produit ce terminal. Cette requête reste exclusivement backend et n'est jamais projetée vers IPC. `resume_request(new_job_id)` : - refuse Resume lorsqu'un run actif possède le slot ; - refuse l'absence de terminal ou de checkpoint ; - extrait le checkpoint uniquement depuis le snapshot terminal retenu ; - appelle `BackfillRequest::resume_for_job` avec le nouveau JobId backend. ## 5. Admission Resume `AppState::prepare_backfill_resume` : - refuse le shutdown en cours ; - exige `composition_ready` ; - alloue un nouveau JobId backend ; - reconstruit la requête via le checkpoint Rust-only ; - revalide réseau Store et rôle HTTP contre la composition courante ; - construit `BackfillJobRuntime`, installe le handle single-run, acquiert Transport/Store puis retourne `BackfillRunLaunch`. Start et Resume partagent ensuite `spawn_backfill_launch`, donc le monitoring latest-value et la restitution du Store restent identiques. ## 6. IPC et frontend Nouvelle commande : ```text backfill_resume() -> BackfillResumeResponseDto ``` `BackfillResumeResponseDto` contient uniquement : ```text accepted job_id state ``` Le frontend expose **Reprendre** seulement pour un snapshot terminal avec `checkpoint_present=true`. La commande Resume n'envoie aucun argument métier. Aucun checkpoint, adresse, signature, ancre, provider, endpoint, credential, network ou payload RAW ne traverse IPC. ## 7. Version ```text workspace.package.version = 0.3.7-pre.11 label = 0.3.7-pre.011 ``` ## 8. Fichiers ajoutés ```text deltas/0.3.7/pre.011.md ``` ## 9. Fichiers modifiés ```text Cargo.toml crates/ksp-app-backfill-desk/frontend/main.html crates/ksp-app-backfill-desk/frontend/ts/main.ts crates/ksp-app-backfill-desk/src/app_state.rs crates/ksp-app-backfill-desk/src/backfill_run.rs crates/ksp-app-backfill-desk/src/dto_backfill.rs crates/ksp-app-backfill-desk/src/errors.rs crates/ksp-app-backfill-desk/src/lib.rs crates/ksp-app-backfill-desk/src/tauri.rs crates/ksp-app-backfill-desk/tests/desktop_contract.rs crates/ksp-app-backfill-desk/tests/desktop_security.rs crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs crates/ksp-app-backfill-desk/unit_tests/dto_backfill.rs crates/ksp-job-backfill-lib/src/checkpoint.rs crates/ksp-job-backfill-lib/src/request.rs crates/ksp-job-backfill-lib/unit_tests/request.rs docs/plans/028-V0_3_7_BACKFILL_DESK_PLAN.md docs/validation/024-V0_3_7_BACKFILL_DESK.md ``` ## 10. Fichiers supprimés Aucun. ## 11. Gate précédent acquis Le replay opérateur de `0.3.7-pre.010` est intégralement propre : audits Rust/Markdown, `cargo check --workspace`, Clippy, 49 tests unitaires Job Backfill et toutes les suites Backfill Desk passent. Le smoke Tauri Mainnet confirme aussi le Cancel ciblé, le passage en `cancelling`, la terminalisation puis la libération du slot avant shutdown. ## 12. Validations exécutées dans l'environnement d'assemblage ```text python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.7 ``` Contrôles ciblés : - `resume_for_job` valide le checkpoint d'origine puis réémet uniquement le JobId ; - scope fingerprint, frontier et cursor interne restent inchangés ; - requête terminale/checkpoint restent Rust-only ; - Resume refuse run actif ou checkpoint absent ; - réseau Store + rôle HTTP revalidés avant admission ; - DTO Resume limité aux métadonnées sûres ; - frontend Resume sans payload de campagne/checkpoint ; - `std.store.json` inchangé par le delta ; - aucune dépendance/feature Cargo modifiée ; - syntaxe TypeScript par transpilation locale ; - contrôle différentiel des headers et reconstruction stricte par application du delta. ## 13. Validations non exécutées dans l'environnement d'assemblage `cargo` et `rustfmt` ne sont pas disponibles dans l'environnement d'assemblage. Gate opérateur obligatoire avant `pre.012` : ```text cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.7 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-job-backfill-lib cargo test -p ksp-app-backfill-desk ``` Aucun `cargo tree` n'est requis pour cette tranche : dépendances et features Cargo sont inchangées. ## 14. Suite `pre.012` terminera le frontend fonctionnel/polish, notamment l'autocomplete libre de Program IDs alimenté depuis `ksp-core-lib::entries()`/`ProgramIdEntry`, sans liste hardcodée ni checkpoint durable.