Files
2026-09-04 14:45:05 +02:00

5.3 KiB

Delta 0.3.9-pre.003 — hardening et freeze fonctionnelle de ksp-worker-api

Base requise

0.3.9-pre.002-fix.002
workspace.package.version = 0.3.9-pre.2.fix.2

Le gate opérateur de cette base est fermé : audits Rust/Markdown propres, cargo check --workspace PASS, Clippy --all-targets --all-features -- -D warnings PASS, cargo test -p ksp-worker-api PASS avec 13 tests unitaires, 4 tests dependency-boundary et 2 tests public API, puis les deux cargo tree ciblés confirment la frontière ksp-worker-api -> ksp-core-lib.

Objet

Fermer le contrat Worker générique avant l'audit RAW Transaction. La production API matérialisée en pre.002 n'est pas élargie : la tranche ajoute les preuves adversariales, external-consumer et release-completeness prévues par le plan, ainsi que les documents durables d'une bibliothèque fonctionnellement complète.

Hardening lifecycle et redaction

tests/security_hardening.rs couvre :

Stopped et Faulted immuables sous tous les mutateurs publics
Running -> Faulted puis stop lifecycle rejeté
Running -> Stopping -> Faulted puis Stopped rejeté
Running -> Stopping -> Stopped puis Faulted rejeté
WorkerId hostile redacted dans Debug
WorkerLifecycle et WorkerSnapshot sans fuite de l'identité hostile
valeur d'identité invalide jamais recopiée dans Error/Debug/context
WorkerStopToken Send + Sync, partagé et visible cross-thread
stop demandé après terminal sans réanimation du lifecycle
Send + Sync des primitives publiques promises

Le premier état terminal validement enregistré reste donc autoritaire ; le token de stop transporte seulement une intention coopérative.

Source latest-value externe std-only

tests/snapshot_source.rs implémente WorkerSnapshotSource depuis le contexte d'un vrai test d'intégration, sans dépendance de test supplémentaire et avec uniquement std :

Arc
Mutex
Waker
Future
Pin
AtomicBool

Cette implémentation prouve par compilation l'object-safety via &dyn WorkerSnapshotSource, le contrat Send + Sync et le future Send. Les scénarios couvrent :

deux listeners indépendants enregistrés sur la même séquence
listener rapide reçoit sequence 1
listener lent saute directement à sequence 2 après coalescing
late listener commence par current() puis attend sequence > observed
publication terminale réveille le listener
snapshot Stopped terminal reste lisible par current()

Aucune queue d'événements ni runtime async concret n'entre dans ksp-worker-api.

Freeze de surface

tests/release_completeness.rs verrouille :

six modules de production exacts : error, identity, lib, lifecycle, snapshot, stop
inventaire exact des vingt-et-un reexports crate-root
aucun pub mod
WorkerSnapshot limité à id/kind/sequence/state/health/activity
aucun payload/String libre dans le snapshot commun
aucun WorkerHandle générique
aucun Job/checkpoint/backfill/RawTransaction/provider/endpoint/slot
aucun Config/Interface/Logging/Transport/Store
aucun Tokio/Futures crate/serde/Tauri/Solana/provider SDK

La dependency-boundary existante reste inchangée et continue d'imposer ksp-core-lib comme unique dépendance normale.

Documentation durable

La crate reçoit :

crates/ksp-worker-api/README.md
crates/ksp-worker-api/USAGE.md

Le README décrit responsabilités, lifecycle, latest-value, stop, restart ownership et firewall. USAGE.md reste version-neutral et fournit les exemples de consommation crate-root pour identity, lifecycle, health/activity, stop, snapshot, WorkerSnapshotSource et sequence. La réconciliation documentaire finale de pre.008 pourra uniquement ajuster ces documents aux preuves finales sans les transformer en journal de release.

Version

workspace.package.version = 0.3.9-pre.3
delivery = 0.3.9-pre.003

Le header du Cargo.toml racine passe de 479 à 480.

Fichiers modifiés

Cargo.toml
docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md
docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md

Fichiers ajoutés

crates/ksp-worker-api/README.md
crates/ksp-worker-api/USAGE.md
crates/ksp-worker-api/tests/release_completeness.rs
crates/ksp-worker-api/tests/security_hardening.rs
crates/ksp-worker-api/tests/snapshot_source.rs
deltas/0.3.9/pre.003.md

Audits d'assemblage

General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (320 table(s), 736 file(s))

Cargo/rustc/rustfmt ne sont pas disponibles dans l'environnement d'assemblage ; aucun nouveau gate Rust n'est déclaré PASS ici.

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
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-api
cargo tree -p ksp-worker-api --edges normal
cargo tree -p ksp-worker-api -e features

La freeze fonctionnelle de Worker API devient effective uniquement après fermeture de ce gate. pre.004 peut alors commencer l'audit RAW standard/KSP sans rouvrir l'API pour des besoins Solana-specific.