Files
khadhroony-solana-project/deltas/0.3.7/pre.011.md
2026-09-02 19:50:01 +02:00

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.