v0.3.9-pre.002-fix.002

This commit is contained in:
2026-09-04 14:29:24 +02:00
parent 156d237460
commit 84647c12ea
6 changed files with 141 additions and 19 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 478 # version: 479
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api"] members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api"]
[workspace.package] [workspace.package]
version = "0.3.9-pre.2.fix.1" version = "0.3.9-pre.2.fix.2"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-worker-api/src/snapshot.rs // file: crates/ksp-worker-api/src/snapshot.rs
// version: 2 // version: 3
/// Monotone sequence attached to one latest-value Worker snapshot stream. /// Monotone sequence attached to one latest-value Worker snapshot stream.
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
@@ -37,6 +37,11 @@ impl crate::WorkerSnapshotSequence {
pub const fn is_after(&self, observed: Self) -> bool { pub const fn is_after(&self, observed: Self) -> bool {
return self.0 > observed.0; return self.0 > observed.0;
} }
#[cfg(test)]
const fn exhausted_for_test() -> Self {
return Self(u64::MAX);
}
} }
/// Fixed common latest-value snapshot exposed by every Worker implementation. /// Fixed common latest-value snapshot exposed by every Worker implementation.
@@ -130,7 +135,7 @@ pub trait WorkerSnapshotSource: std::marker::Send + std::marker::Sync {
#[cfg(test)] #[cfg(test)]
fn exhausted_snapshot_sequence() -> crate::WorkerSnapshotSequence { fn exhausted_snapshot_sequence() -> crate::WorkerSnapshotSequence {
return crate::WorkerSnapshotSequence(u64::MAX); return crate::WorkerSnapshotSequence::exhausted_for_test();
} }
#[cfg(test)] #[cfg(test)]

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-worker-api/tests/dependency_boundary.rs // file: crates/ksp-worker-api/tests/dependency_boundary.rs
// version: 2 // version: 3
//! Dependency and runtime-neutrality canaries for the Worker API foundation. //! Dependency and runtime-neutrality canaries for the Worker API foundation.
@@ -82,12 +82,7 @@ fn pre_002_fix_001_shared_visible_items_use_crate_root_facade_inside_owner_modul
] { ] {
assert!(lifecycle.contains(expected), "missing crate-root Worker lifecycle impl target: {expected}"); assert!(lifecycle.contains(expected), "missing crate-root Worker lifecycle impl target: {expected}");
} }
for expected in [ for expected in ["impl crate::WorkerSnapshotSequence {", "impl crate::WorkerSnapshot {", "impl std::fmt::Debug for crate::WorkerSnapshot {"] {
"impl crate::WorkerSnapshotSequence {",
"impl crate::WorkerSnapshot {",
"impl std::fmt::Debug for crate::WorkerSnapshot {",
"return crate::WorkerSnapshotSequence(u64::MAX);",
] {
assert!(snapshot.contains(expected), "missing crate-root Worker snapshot reference: {expected}"); assert!(snapshot.contains(expected), "missing crate-root Worker snapshot reference: {expected}");
} }
for expected in [ for expected in [
@@ -100,6 +95,16 @@ fn pre_002_fix_001_shared_visible_items_use_crate_root_facade_inside_owner_modul
return; return;
} }
#[test]
fn pre_002_fix_002_private_tuple_constructor_stays_inside_owner_impl() {
let snapshot = include_str!("../src/snapshot.rs");
assert!(snapshot.contains("const fn exhausted_for_test() -> Self {"));
assert!(snapshot.contains("return Self(u64::MAX);"));
assert!(snapshot.contains("return crate::WorkerSnapshotSequence::exhausted_for_test();"));
assert!(!snapshot.contains("return crate::WorkerSnapshotSequence(u64::MAX);"));
return;
}
fn manifest_dependency_names(section: &str) -> std::vec::Vec<&str> { fn manifest_dependency_names(section: &str) -> std::vec::Vec<&str> {
let mut names = std::vec::Vec::new(); let mut names = std::vec::Vec::new();
for line in section.lines() { for line in section.lines() {

View File

@@ -0,0 +1,96 @@
<!-- file: deltas/0.3.9/pre.002-fix.002.md -->
<!-- version: 1 -->
# Delta `0.3.9-pre.002-fix.002` — constructeur privé de `WorkerSnapshotSequence`
## Base requise
```text
0.3.9-pre.002-fix.001
workspace.package.version = 0.3.9-pre.2.fix.1
```
Le gate opérateur de `pre.002-fix.001` confirme les audits Rust/Markdown et `cargo check --workspace`, mais Clippy `--all-targets --all-features -- -D warnings` et `cargo test -p ksp-worker-api` échouent sur `E0423` dans `snapshot.rs`. Les deux `cargo tree` ciblés restent conformes à la frontière Core-only.
## Cause exacte
`WorkerSnapshotSequence` est un tuple struct public dont le champ `u64` reste volontairement privé. Le type est réexporté au crate-root, mais ce re-export ne rend pas le constructeur tuple visible :
```rust
return crate::WorkerSnapshotSequence(u64::MAX);
```
échoue donc lors de la compilation des targets de test.
Le défaut ne remet pas en cause `RUST-IMPORT-009` pour les targets d'`impl` : `impl crate::WorkerSnapshotSequence` reste la forme correcte. Il faut seulement confiner l'accès au champ privé dans le module propriétaire.
## Correctif
L'impl propriétaire reçoit un constructeur associé privé et uniquement compilé pour les tests :
```rust
#[cfg(test)]
const fn exhausted_for_test() -> Self {
return Self(u64::MAX);
}
```
Le helper privé conserve la référence crate-root au type partagé :
```rust
return crate::WorkerSnapshotSequence::exhausted_for_test();
```
Ainsi :
- aucun champ ne devient `pub` ou `pub(crate)` ;
- aucun constructeur arbitraire n'entre dans l'API publique ;
- les targets d'`impl` restent sous `crate::Type` ;
- l'initialisation du champ privé reste confinée dans l'impl situé dans le module propriétaire ;
- le helper d'overflow reste strictement `#[cfg(test)]`.
La canarie `dependency_boundary` de `pre.002-fix.001` cesse d'exiger le constructeur tuple invalide et une nouvelle canarie vérifie explicitement ce pont privé.
## Version
Ce fix modifie du Rust :
```text
workspace.package.version = 0.3.9-pre.2.fix.2
delivery = 0.3.9-pre.002-fix.002
```
Le header du `Cargo.toml` racine passe de `478` à `479`.
## Fichiers modifiés
```text
Cargo.toml
crates/ksp-worker-api/src/snapshot.rs
crates/ksp-worker-api/tests/dependency_boundary.rs
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
```
## Fichier ajouté
```text
deltas/0.3.9/pre.002-fix.002.md
```
## Hors scope
Aucun changement de surface publique, lifecycle, stop semantics, snapshot shape, dépendance, feature, runtime ou travail `pre.003`.
## Gate opérateur demandé
```bash
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
```

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md --> <!-- file: docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md -->
<!-- version: 5 --> <!-- version: 6 -->
# Plan v0.3.9 — Worker API générique + audit RAW Transaction # Plan v0.3.9 — Worker API générique + audit RAW Transaction
@@ -563,9 +563,15 @@ La crate dépend uniquement de `ksp-core-lib`, ne possède aucune feature/dev/bu
#### `pre.002-fix.001` — chemins crate-root dans les modules propriétaires #### `pre.002-fix.001` — chemins crate-root dans les modules propriétaires
**Statut : réalisé ; correctif de conformité Rust.** **Statut : réalisé ; gate opérateur en échec de compilation test.**
Correction de la nouvelle crate Worker selon `RUST-IMPORT-009` : tout `impl` d'un type partagé/exporté cible désormais explicitement `crate::Type`, y compris les implémentations de traits `Debug`/`Default`. Le helper de test de séquence emploie également `crate::WorkerSnapshotSequence`. Une canarie dependency-boundary dédiée verrouille ces références sans élargir la surface fonctionnelle de `pre.002`. `workspace.package.version` devient `0.3.9-pre.2.fix.1`. Correction de la nouvelle crate Worker selon `RUST-IMPORT-009` : tout `impl` d'un type partagé/exporté cible désormais explicitement `crate::Type`, y compris les implémentations de traits `Debug`/`Default`. Le gate opérateur confirme les audits et `cargo check --workspace`, puis Clippy `--all-targets` et `cargo test -p ksp-worker-api` révèlent `E0423` sur le helper de séquence : le re-export `crate::WorkerSnapshotSequence` expose le type mais pas son constructeur tuple à champ privé. `workspace.package.version` reste historiquement `0.3.9-pre.2.fix.1` pour cette livraison.
#### `pre.002-fix.002` — constructeur tuple privé de séquence
**Statut : réalisé ; correctif de compilation test.**
Le champ tuple de `WorkerSnapshotSequence` reste privé. L'`impl crate::WorkerSnapshotSequence` reçoit un constructeur associé strictement privé et `#[cfg(test)]`, `exhausted_for_test()`, qui effectue localement `Self(u64::MAX)`. Le helper privé appelle ensuite `crate::WorkerSnapshotSequence::exhausted_for_test()`. Cette forme maintient simultanément `RUST-IMPORT-009`, l'opacité publique de la séquence et la visibilité Rust correcte du constructeur. La canarie dependency-boundary distingue désormais explicitement target d'`impl` crate-root et construction privée confinée. `workspace.package.version` devient `0.3.9-pre.2.fix.2`.
### `pre.003` — hardening, races, object-safety, impl externe et freeze ### `pre.003` — hardening, races, object-safety, impl externe et freeze

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md --> <!-- file: docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md -->
<!-- version: 4 --> <!-- version: 5 -->
# Validation v0.3.9 — Worker API + audit RAW Transaction # Validation v0.3.9 — Worker API + audit RAW Transaction
@@ -111,9 +111,19 @@ Les cases cochées de cette sous-section attestent la matérialisation de la sur
- [X] Violation `RUST-IMPORT-009` identifiée sur les targets d'`impl` des types Worker exportés. - [X] Violation `RUST-IMPORT-009` identifiée sur les targets d'`impl` des types Worker exportés.
- [X] `identity.rs` utilise `impl crate::WorkerId` et `impl crate::WorkerKindCode`, y compris pour `Debug`. - [X] `identity.rs` utilise `impl crate::WorkerId` et `impl crate::WorkerKindCode`, y compris pour `Debug`.
- [X] `lifecycle.rs` utilise la façade crate-root pour les cinq targets d'`impl` visibles. - [X] `lifecycle.rs` utilise la façade crate-root pour les cinq targets d'`impl` visibles.
- [X] `snapshot.rs` utilise la façade crate-root pour les trois targets d'`impl` visibles et le helper de séquence. - [X] `snapshot.rs` utilise la façade crate-root pour les trois targets d'`impl` visibles.
- [X] `stop.rs` utilise la façade crate-root pour l'impl inhérent, `Default` et `Debug`. - [X] `stop.rs` utilise la façade crate-root pour l'impl inhérent, `Default` et `Debug`.
- [X] Canarie dependency-boundary ajoutée contre cette régression. - [X] Canarie dependency-boundary ajoutée contre cette régression.
- [X] Gate opérateur exécuté : audits propres et `cargo check --workspace` PASS.
- [X] Clippy `--all-targets --all-features -- -D warnings` et `cargo test -p ksp-worker-api` bloquent sur `E0423` dans le helper de séquence.
#### `pre.002-fix.002`
- [X] Aucun élargissement de visibilité du champ tuple `WorkerSnapshotSequence`.
- [X] Constructeur associé privé `#[cfg(test)]` ajouté dans `impl crate::WorkerSnapshotSequence`.
- [X] Construction terminale confinée à `Self(u64::MAX)` dans l'impl propriétaire.
- [X] Helper privé appelle `crate::WorkerSnapshotSequence::exhausted_for_test()`.
- [X] Canarie dependency-boundary interdit le retour de `crate::WorkerSnapshotSequence(u64::MAX)`.
- [ ] Gate Cargo du fix exécuté par l'opérateur. - [ ] Gate Cargo du fix exécuté par l'opérateur.
### `pre.003` ### `pre.003`
@@ -234,10 +244,10 @@ Aucun item ci-dessous nest déclaré exécuté en `pre.001`.
La livraison initiale `pre.001` avait conservé `workspace.package.version = 0.3.8` en suivant lexception du prompt 028. Cette exception est supplantée par la règle normative `VER-ID-009`. La livraison initiale `pre.001` avait conservé `workspace.package.version = 0.3.8` en suivant lexception du prompt 028. Cette exception est supplantée par la règle normative `VER-ID-009`.
Après `pre.002-fix.001`, létat courant est : Après `pre.002-fix.002`, létat courant est :
```text ```text
workspace.package.version = 0.3.9-pre.2.fix.1 workspace.package.version = 0.3.9-pre.2.fix.2
``` ```
`pre.002` reste la tranche non-fix `0.3.9-pre.2`. Son correctif de conformité Rust porte `0.3.9-pre.2.fix.1` conformément à `VER-ID-007` et `VER-ID-010`. L'état précédent `0.3.9-pre.1.fix.2` reste documenté dans `pre.001-fix.002`. `pre.002` reste la tranche non-fix `0.3.9-pre.2`. Les correctifs de conformité/compilation portent successivement `0.3.9-pre.2.fix.1` puis `0.3.9-pre.2.fix.2` conformément à `VER-ID-007` et `VER-ID-010`. L'état précédent `0.3.9-pre.1.fix.2` reste documenté dans `pre.001-fix.002`.