6.0 KiB
Delta 0.3.6-pre.002 — identité, lifecycle et annulation Job API
Base requise
0.3.6-pre.001-fix.001
workspace.package.version = 0.3.6-pre.1.fix.1
Le gate opérateur communiqué pour la base passe les cinq tests Python du validateur Markdown, l'audit de 264 tables dans 141 fichiers, l'audit Rust workspace et cargo check --workspace sur les 14 crates existantes.
Objectif
Créer la fondation runtime-neutral de ksp-job-api avec identité bornée, lifecycle explicite et annulation coopérative, sans ouvrir les notifications de pre.003 ni aucun contrat Backfill ou Worker.
Surface ajoutée
JobId: code opaque de 1 à 128 octets, alphabet ASCII alphanumérique plus_,-,.et:;JobKindCode: code stable soumis aux mêmes bornes ;JobCompletion:CompleteouPartial;JobState:Created,Running,Cancelling,Completed,CancelledouFailed;JobLifecycle: propriétaire non cloneable des transitions ;JobCancellationToken: demande atomique cloneable, idempotente,Send + Syncet indépendante de Tokio ;- trois
ErrorCodestables sous le domainejob_api; - constantes publiques de bornes d'identité.
Invariants de lifecycle
Created -> Running
Created -> Cancelled
Running -> Cancelling
Running -> Completed
Running -> Failed
Cancelling -> Completed
Cancelling -> Cancelled
Cancelling -> Failed
Toute autre transition échoue avec les codes source/cible en contexte sûr et laisse l'état inchangé. Un état terminal n'accepte plus aucune mutation. Le lifecycle n'est pas cloneable afin qu'une copie divergente ne puisse pas créer un second état de vérité.
Le token d'annulation est volontairement distinct du lifecycle : un consumer demande l'annulation de façon idempotente ; le producteur observe le token puis applique la transition appropriée. Aucun thread, task, callback ou primitive runtime n'est créé par l'API.
Firewalls
La crate dépend exactement de ksp-core-lib. Elle n'a aucune feature, dev-dependency ou build-dependency et n'expose aucun type Config, Interface, Logging, Transport, Store, Tokio, serde, Worker ou Backfill.
Les notifications, séquences, snapshots et listeners restent réservés à pre.003.
Tests ajoutés
Dix unitaires :
- admission exacte et rejets des deux identités ;
- alphabet sûr ;
- partage, idempotence et état initial du token ;
- chemins terminaux, transitions depuis
Cancelling, erreur sûre, immuabilité terminale et matrice exacte 6 par 6.
Onze canaries d'intégration :
- 2 dépendances et runtime-neutralité ;
- 3 API publique externe ;
- 3 complétude et non-ouverture des tranches futures ;
- 3 sécurité, redaction et visibilité cross-thread.
Fichiers ajoutés
crates/ksp-job-api/Cargo.toml
crates/ksp-job-api/src/cancellation.rs
crates/ksp-job-api/src/error.rs
crates/ksp-job-api/src/identity.rs
crates/ksp-job-api/src/lib.rs
crates/ksp-job-api/src/lifecycle.rs
crates/ksp-job-api/unit_tests/cancellation.rs
crates/ksp-job-api/unit_tests/identity.rs
crates/ksp-job-api/unit_tests/lifecycle.rs
crates/ksp-job-api/tests/dependency_boundary.rs
crates/ksp-job-api/tests/public_api.rs
crates/ksp-job-api/tests/release_completeness.rs
crates/ksp-job-api/tests/security_hardening.rs
deltas/0.3.6/pre.002.md
Fichiers modifiés
Cargo.toml
docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md
docs/validation/023-V0_3_6_JOB_API_BACKFILL.md
Mécanique Cargo :
header version: 394 -> 395
workspace.package.version: 0.3.6-pre.1.fix.1 -> 0.3.6-pre.2
workspace members: ajout de crates/ksp-job-api
Fichiers supprimés
Aucun.
Décisions prises
- l'hôte fournit le
JobIdpour pouvoir le conserver lors d'une reprise contrôlée ; - aucune génération UUID ou dépendance aléatoire n'entre dans Job API ;
- les identités ne sont pas sérialisables par défaut et leurs champs restent privés ;
JobIdest masqué enDebug, alors que le kind stable reste visible ;- le lifecycle est possédé, passif et non cloneable ;
- l'annulation partage uniquement un
AtomicBoolstandard ; Failedn'embarque pas encore de cause optionnelle ; les snapshots structurés depre.003porteront l'observabilité sans Option-soup ;- aucune README/USAGE intermédiaire n'est créée avant la surface consommable réconciliée prévue par le couloir documentaire.
Validations exécutées
python3 scripts/audit_rust_workspace_rules.py
-> General Rust rule audit: clean
-> Rust export completeness audit: 0 candidate(s)
-> KSP workspace Rust rule audit: clean
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.6
-> Markdown table audit: clean (264 tables / 142 fichiers)
python3 -m unittest scripts/tests/test_audit_markdown_tables.py
-> 5 tests / OK
La reconstruction indépendante de la base par extraction successive de v0.3.5, pre.001 puis pre.001-fix.001 confirme que le delta ne touche que les 17 fichiers ajoutés ou modifiés listés ci-dessus. Les inventaires statiques confirment dix tests unitaires, onze canaries d'intégration et la dépendance normale unique vers Core.
Validations non exécutées
L'environnement d'assemblage ne fournit ni cargo ni rustfmt. Les commandes suivantes ne sont pas annoncées comme réussies :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-job-api
cargo tree -p ksp-job-api --edges normal
cargo tree -p ksp-job-api -e features
Gate opérateur demandé
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.6
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-job-api
cargo tree -p ksp-job-api --edges normal
cargo tree -p ksp-job-api -e features
Questions ouvertes
Aucune question ne bloque pre.003 après un gate opérateur vert.