154 lines
5.8 KiB
Markdown
154 lines
5.8 KiB
Markdown
<!-- file: deltas/0.3.7/pre.011.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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.
|