v0.3.7-pre.008-fix.003

This commit is contained in:
2026-09-02 17:14:00 +02:00
parent d49d7af0a4
commit ed72aaba67
4 changed files with 141 additions and 21 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 429 # version: 430
[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-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"] members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-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"]
[workspace.package] [workspace.package]
version = "0.3.7-pre.8.fix.2" version = "0.3.7-pre.8.fix.3"
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-app-backfill-desk/tests/desktop_security.rs // file: crates/ksp-app-backfill-desk/tests/desktop_security.rs
// version: 8 // version: 9
//! Security and dependency-boundary checks for the Backfill Desk scaffold. //! Security and dependency-boundary checks for the Backfill Desk scaffold.
@@ -11,6 +11,19 @@ fn app_root() -> std::path::PathBuf {
return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); return std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
} }
fn struct_source<'a>(source: &'a str, marker: &str) -> &'a str {
let start = match source.find(marker) {
std::option::Option::Some(value) => value,
std::option::Option::None => return "",
};
let tail = &source[start..];
let end = match tail.find("\n}") {
std::option::Option::Some(value) => value + 2,
std::option::Option::None => return "",
};
return &tail[..end];
}
fn collect_files(directory: &std::path::Path, extension: &str, files: &mut std::vec::Vec<std::path::PathBuf>) { fn collect_files(directory: &std::path::Path, extension: &str, files: &mut std::vec::Vec<std::path::PathBuf>) {
let entries = std::fs::read_dir(directory); let entries = std::fs::read_dir(directory);
let entries = match entries { let entries = match entries {
@@ -166,14 +179,8 @@ fn pre_006_frontend_receives_only_safe_http_route_metadata_and_no_endpoint_mater
fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_owned() { fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_owned() {
let root = app_root(); let root = app_root();
let dto = read_text(root.join("src/dto_backfill.rs").as_path()); let dto = read_text(root.join("src/dto_backfill.rs").as_path());
let request_start = dto.find("pub(crate) struct BackfillStartRequestDto"); let request_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartRequestDto");
let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto"); assert!(!request_source.is_empty());
assert!(request_start.is_some());
assert!(preview_start.is_some());
let request_source = match (request_start, preview_start) {
(std::option::Option::Some(start), std::option::Option::Some(end)) if start < end => &dto[start..end],
_ => "",
};
for forbidden in [ for forbidden in [
"pub(crate) network:", "pub(crate) network:",
"pub(crate) provider", "pub(crate) provider",
@@ -209,14 +216,8 @@ fn pre_007_request_mapping_keeps_network_endpoint_and_payload_secrets_backend_ow
fn pre_008_start_surface_keeps_payload_and_physical_resources_backend_owned() { fn pre_008_start_surface_keeps_payload_and_physical_resources_backend_owned() {
let root = app_root(); let root = app_root();
let dto = read_text(root.join("src/dto_backfill.rs").as_path()); let dto = read_text(root.join("src/dto_backfill.rs").as_path());
let response_start = dto.find("pub(crate) struct BackfillStartResponseDto"); let response_source = struct_source(dto.as_str(), "pub(crate) struct BackfillStartResponseDto");
let preview_start = dto.find("pub(crate) struct BackfillRequestPreviewDto"); assert!(!response_source.is_empty());
assert!(response_start.is_some());
assert!(preview_start.is_some());
let response_source = match (response_start, preview_start) {
(std::option::Option::Some(start), std::option::Option::Some(end)) if start < end => &dto[start..end],
_ => "",
};
assert!(response_source.contains("pub(crate) job_id: String")); assert!(response_source.contains("pub(crate) job_id: String"));
assert!(response_source.contains("pub(crate) state: String")); assert!(response_source.contains("pub(crate) state: String"));
for forbidden in ["address", "signature", "provider", "endpoint", "url", "credential", "token", "network"] { for forbidden in ["address", "signature", "provider", "endpoint", "url", "credential", "token", "network"] {

View File

@@ -0,0 +1,100 @@
<!-- file: deltas/0.3.7/pre.008-fix.003.md -->
<!-- version: 1 -->
# Delta `0.3.7-pre.008-fix.003` — canaris sécurité bornés aux DTO exacts
## 1. Base requise
```text
0.3.7-pre.008-fix.002
workspace.package.version = 0.3.7-pre.8.fix.2
```
## 2. Objectif
Corriger les deux derniers faux positifs du gate `pre.008` sans modifier la production : les canaris sécurité de la request et de l'acknowledgement Start inspectaient des fenêtres textuelles qui débordaient sur les DTO voisins.
## 3. Cause
`BackfillStartRequestDto` est suivi de `BackfillStartResponseDto`, lui-même suivi de `BackfillRequestPreviewDto`. Le test request découpait depuis le début de la request jusqu'au début de la preview : il incluait donc `BackfillStartResponseDto::job_id` et concluait à tort que le frontend request DTO possédait un JobId.
Le test Start acknowledgement découpait depuis le début de la response jusqu'au début de la preview. Cette fenêtre incluait les commentaires de documentation placés avant `BackfillRequestPreviewDto`, dont les mots `address` et `signature`, et concluait à tort à une fuite de payload.
## 4. Correction
- ajouter un helper de test `struct_source` ;
- borner l'audit request au corps exact de `BackfillStartRequestDto` ;
- borner l'audit acknowledgement au corps exact de `BackfillStartResponseDto` ;
- conserver tous les marqueurs interdits existants ;
- ne modifier aucun DTO ni code de production.
## 5. Version
```text
workspace.package.version = 0.3.7-pre.8.fix.3
label = 0.3.7-pre.008-fix.003
```
## 6. Fichiers ajoutés
```text
deltas/0.3.7/pre.008-fix.003.md
```
## 7. Fichiers modifiés
```text
Cargo.toml
crates/ksp-app-backfill-desk/tests/desktop_security.rs
docs/validation/024-V0_3_7_BACKFILL_DESK.md
```
## 8. Fichiers supprimés
Aucun.
## 9. Gate opérateur ayant déclenché le fix
```text
python3 scripts/audit_rust_workspace_rules.py PASS
python3 scripts/audit_markdown_tables.py ... deltas/0.3.7 PASS
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-job-backfill-lib PASS — 49 unitaires + suites d'intégration
cargo test -p ksp-app-backfill-desk FAIL — 2 faux positifs desktop_security
```
Le canari `pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned` de `pre.008-fix.002` passe désormais.
## 10. 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 :
- `BackfillStartRequestDto` de production byte-for-byte inchangé ;
- `BackfillStartResponseDto` de production byte-for-byte inchangé ;
- fenêtre request limitée à sa propre struct ;
- fenêtre acknowledgement limitée à sa propre struct ;
- aucun fichier fonctionnel Backfill Desk/Job/Store/Transport modifié.
## 11. Gate opérateur requis
```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
```
Les `cargo tree` ne sont pas requis pour ce fix : aucune dépendance ni feature Cargo n'est modifiée.
## 12. Questions ouvertes
Aucune pour ce correctif.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md --> <!-- file: docs/validation/024-V0_3_7_BACKFILL_DESK.md -->
<!-- version: 13 --> <!-- version: 14 -->
# Validation v0.3.7 — Backfill Desk # Validation v0.3.7 — Backfill Desk
@@ -380,7 +380,7 @@ Le gate opérateur de `pre.008` confirme que les audits Rust/Markdown sont propr
- [X] aucune API publique Job, logique de requête, Start Desk, Store, Transport ou frontend n'est modifiée ; - [X] aucune API publique Job, logique de requête, Start Desk, Store, Transport ou frontend n'est modifiée ;
- [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ; - [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
- [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.008-fix.001` à exécuter. - [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.008-fix.001` à exécuter.
## 18. `pre.008-fix.002` — canari d'ordre Start local au bon spawn ## 19. `pre.008-fix.002` — canari d'ordre Start local au bon spawn
Le replay opérateur de `pre.008-fix.001` confirme que la correction `Send` est effective : audits, `cargo check --workspace`, Clippy et `ksp-job-backfill-lib` passent. La suite Backfill Desk atteint alors le canari `pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned`, qui échoue sur `prepare_index < spawn_index`. Le replay opérateur de `pre.008-fix.001` confirme que la correction `Send` est effective : audits, `cargo check --workspace`, Clippy et `ksp-job-backfill-lib` passent. La suite Backfill Desk atteint alors le canari `pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned`, qui échoue sur `prepare_index < spawn_index`.
@@ -401,3 +401,22 @@ cargo test -p ksp-app-backfill-desk
cargo tree -p ksp-app-backfill-desk --edges normal cargo tree -p ksp-app-backfill-desk --edges normal
cargo tree -p ksp-app-backfill-desk -e features cargo tree -p ksp-app-backfill-desk -e features
``` ```
## 20. `pre.008-fix.003` — canaris sécurité bornés aux DTO exacts
Le replay opérateur de `pre.008-fix.002` confirme que les corrections précédentes sont effectives : audits Rust/Markdown, `cargo check --workspace`, Clippy et `ksp-job-backfill-lib` passent, puis le canari d'ordre Start corrigé passe également. Le dernier blocage est limité à deux canaris `desktop_security`.
Les DTO de production sont conformes. Les deux échecs sont des faux positifs causés par des fenêtres textuelles trop larges : le contrôle de `BackfillStartRequestDto` s'étendait jusqu'à `BackfillRequestPreviewDto` et incluait donc légitimement `BackfillStartResponseDto::job_id`; le contrôle de `BackfillStartResponseDto` incluait les commentaires de documentation du DTO suivant, qui contiennent les mots `address`/`signature`.
Le correctif ajoute un helper de test qui extrait uniquement la déclaration de struct visée, de son marqueur `struct` jusqu'à son accolade fermante immédiate. Les deux canaris auditeront désormais exactement `BackfillStartRequestDto` et `BackfillStartResponseDto`, sans modifier les DTO ni aucun code de production.
### Gate du fix
- [X] aucun fichier de production Backfill Desk, Job Backfill, Store ou Transport modifié ;
- [X] le canari request ne peut plus inclure `BackfillStartResponseDto::job_id` ;
- [X] le canari Start acknowledgement ne peut plus inclure la documentation de `BackfillRequestPreviewDto` ;
- [X] les champs réellement interdits restent vérifiés dans le corps exact des DTO exposés ;
- [X] version Cargo synchronisée en `0.3.7-pre.8.fix.3` ;
- [X] audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
- [ ] replay opérateur `cargo fmt/check/clippy/test` de `pre.008-fix.003` à exécuter ; aucun `cargo tree` requis car dépendances/features inchangées.