Files
khadhroony-solana-project/deltas/0.3.7/pre.010.md
2026-09-02 18:56:09 +02:00

5.0 KiB

Delta 0.3.7-pre.010 — Cancel ciblé et races terminales Backfill Desk

1. Base requise

0.3.7-pre.009-fix.002
workspace.package.version = 0.3.7-pre.9.fix.2

2. Objectif

Ouvrir le contrôle coopératif d'un run déjà admis sans modifier le contrat de campagne : Cancel ciblé par JobId backend, idempotence, protection contre les requêtes périmées, état cancelling observable et shutdown applicatif best-effort. Resume reste hors périmètre.

3. Cancel ciblé

La nouvelle commande backfill_cancel(job_id) accepte uniquement le JobId généré par le backend et déjà projeté par le monitoring. Le slot single-run vérifie l'identité avant d'appeler BackfillJobHandle::cancel().

Cette cible évite qu'un Cancel IPC retardé destiné au run N puisse annuler le run N+1 après une terminaison rapide et un nouveau Start.

4. Idempotence et races

Règles appliquées :

  • premier Cancel pré-terminal : accepted=true ;
  • répétition sur le même run : accepted=false, sans effet supplémentaire ;
  • terminal déjà gagné : accepted=false avec état terminal ;
  • JobId différent du run actif ou du terminal retenu : erreur stable backfill_desk/backfill_run_mismatch ;
  • absence de run actif/retenu correspondant : backfill_desk/backfill_run_not_active ;
  • Start continue d'être refusé tant que le slot actif existe, y compris pendant cancelling.

Le DTO de réponse contient seulement accepted, job_id et state.

5. Shutdown coopératif

Le close de la fenêtre principale gagne d'abord le one-shot begin_shutdown(), ce qui bloque tout nouveau Start. Il demande ensuite best-effort l'annulation du run actif avant de poursuivre le shutdown Store/process.

Cette séquence ne promet pas le drain crash-safe du travail déjà soumis. La sémantique de drain coopératif reste celle de ksp-job-backfill-lib : arrêt des nouvelles admissions et traitement du travail déjà engagé avant terminal lorsque le process reste vivant.

6. Frontend

La carte latest-value ajoute Annuler. Le bouton n'est disponible que pour un statut actif, transmet uniquement jobId, affiche l'acceptation sûre puis resynchronise immédiatement via backfill_status.

Aucune adresse, signature, ancre, provider, endpoint, credential, checkpoint ou payload métier n'est envoyé ou journalisé par le chemin Cancel.

7. Version

workspace.package.version = 0.3.7-pre.10
label = 0.3.7-pre.010

8. Fichiers ajoutés

deltas/0.3.7/pre.010.md

9. Fichiers modifiés

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
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.009-fix.002 est intégralement propre : audits Rust/Markdown, cargo check --workspace, Clippy, 49 tests unitaires Job Backfill et toutes les suites Backfill Desk passent.

12. Validations exécutées dans l'environnement d'assemblage

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 :

  • Cancel ciblé par JobId backend et protection stale-run ;
  • répétition idempotente et terminal non réouvert ;
  • shutdown : annulation demandée après begin_shutdown() et avant exit ;
  • DTO Cancel limité aux métadonnées sûres ;
  • frontend sans payload de campagne sur le chemin Cancel ;
  • 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.011 :

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.011 ouvrira checkpoint/frontier et Resume in-session, sans durable checkpoint externe ni scheduler générique.