From d89aee99109c5bd4be2c5bdc26598d32a3f2e1b1 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Tue, 1 Sep 2026 15:22:54 +0200 Subject: [PATCH] v0.3.6-pre.008-fix.001 --- Cargo.toml | 4 +- .../unit_tests/checkpoint.rs | 12 ++-- deltas/0.3.6/pre.008-fix.001.md | 56 +++++++++++++++++++ .../plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md | 10 +++- .../validation/023-V0_3_6_JOB_API_BACKFILL.md | 8 +-- 5 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 deltas/0.3.6/pre.008-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index e67f941..53e5651 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 406 +# version: 407 [workspace] resolver = "3" members = ["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] -version = "0.3.6-pre.8" +version = "0.3.6-pre.8.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs b/crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs index 8fc4098..9c9d1ba 100644 --- a/crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs +++ b/crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs @@ -1,5 +1,5 @@ // file: crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs -// version: 1 +// version: 2 fn signature(character: char) -> std::option::Option { return crate::BackfillSignature::new(character.to_string().repeat(crate::MIN_BACKFILL_SIGNATURE_TEXT_BYTES)).ok(); @@ -71,7 +71,7 @@ fn pre_008_frontier_advances_only_across_contiguous_durable_results() { #[test] fn pre_008_checkpoint_is_bound_to_job_and_scope_fingerprint() { let scope = crate::BackfillScope::latest_address(ksp_core_lib::Pubkey::new_from_array([1_u8; 32])); - let request = match request(scope) { + let primary_request = match request(scope) { std::option::Option::Some(value) => value, std::option::Option::None => return, }; @@ -79,8 +79,8 @@ fn pre_008_checkpoint_is_bound_to_job_and_scope_fingerprint() { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; - let wrong_job = crate::BackfillCheckpoint::new(other_job, request.scope_fingerprint(), 0, std::option::Option::None); - let result = request.clone().with_checkpoint(wrong_job); + let wrong_job = crate::BackfillCheckpoint::new(other_job, primary_request.scope_fingerprint(), 0, std::option::Option::None); + let result = primary_request.clone().with_checkpoint(wrong_job); assert!(result.is_err()); if let std::result::Result::Err(error) = result { assert_eq!(error.code(), crate::ERROR_CODE_BACKFILL_CHECKPOINT_INVALID); @@ -90,8 +90,8 @@ fn pre_008_checkpoint_is_bound_to_job_and_scope_fingerprint() { std::option::Option::Some(value) => value, std::option::Option::None => return, }; - let wrong_scope = crate::BackfillCheckpoint::new(request.job_id().clone(), other_request.scope_fingerprint(), 0, std::option::Option::None); - assert!(request.with_checkpoint(wrong_scope).is_err()); + let wrong_scope = crate::BackfillCheckpoint::new(primary_request.job_id().clone(), other_request.scope_fingerprint(), 0, std::option::Option::None); + assert!(primary_request.with_checkpoint(wrong_scope).is_err()); return; } diff --git a/deltas/0.3.6/pre.008-fix.001.md b/deltas/0.3.6/pre.008-fix.001.md new file mode 100644 index 0000000..4eb32fa --- /dev/null +++ b/deltas/0.3.6/pre.008-fix.001.md @@ -0,0 +1,56 @@ + + + +# Delta v0.3.6-pre.008-fix.001 + +## Base requise + +- `0.3.6-pre.8` / livraison `pre.008`. +- Le gate opérateur de `pre.008` confirme les audits Rust/Markdown et `cargo check --workspace`. +- La compilation des targets de test échoue avant exécution des 39 unitaires et 9 canaries à cause d'un masquage lexical dans `unit_tests/checkpoint.rs`. + +## Correctif + +Dans `pre_008_checkpoint_is_bound_to_job_and_scope_fingerprint`, la liaison locale `request` masquait le helper `request(scope)` avant la création de `other_request`, produisant `E0618` puis l'erreur d'inférence secondaire `E0282`. Le correctif renomme uniquement cette liaison en `primary_request` et synchronise ses références. + +Aucun contrat public, comportement checkpoint/frontier, nombre de tests, dépendance, feature ou logique de production n'est modifié. + +## Cargo et versions de fichiers + +- `workspace.package.version` : `0.3.6-pre.8` -> `0.3.6-pre.8.fix.1`. +- `Cargo.toml` : version d'en-tête `406` -> `407`. +- `crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs` : version d'en-tête `1` -> `2`. +- plan 027 : version d'en-tête `14` -> `15`. +- validation 023 : version d'en-tête `14` -> `15`. + +## Graphe de dépendances + +`pre.008` ajoutait `futures-util` comme dépendance normale ; les deux arbres Cargo ont donc été inspectés pendant son gate malgré l'échec ultérieur des tests. Ce fix ne modifie ni dépendance ni feature : aucun `cargo clean` et aucun nouveau `cargo tree` ne sont nécessaires pour le valider. `cargo tree` dépend des manifests/résolution Cargo, pas des artefacts du répertoire `target`. + +## Payload + +Ajout : + +- `deltas/0.3.6/pre.008-fix.001.md` + +Modifications : + +- `Cargo.toml` +- `crates/ksp-job-backfill-lib/unit_tests/checkpoint.rs` +- `docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md` +- `docs/validation/023-V0_3_6_JOB_API_BACKFILL.md` + +Aucune suppression. + +## 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/0.3.6 +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-job-backfill-lib +``` + +Attendu : 39 tests unitaires et 9 canaries d'intégration, sans warning Clippy. Les arbres Cargo ne sont pas à rejouer pour ce fix sans changement de graphe. diff --git a/docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md b/docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md index e131d06..ecf54db 100644 --- a/docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md +++ b/docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md @@ -1,5 +1,5 @@ - + # Plan v0.3.6 — Job API et premier backfill RAW @@ -482,7 +482,7 @@ La tranche matérialise 29 tests unitaires et 8 canaries d'intégration au total ### `pre.008` — Concurrence, frontier et checkpoint -**Statut : matérialisé ; gate opérateur à rejouer.** +**Statut : réalisé ; corrigé par `pre.008-fix.001`, gate opérateur du fix à rejouer.** Budget cible : **15-20 min**. Entrée : résultats Store typés et gate `pre.007` vert. La tranche ajoute `BackfillCheckpoint`, `BackfillExecutionBatch` et `execute_backfill_discovery`. Le checkpoint est opaque, caller-owned et validé contre `JobId` + fingerprint de scope ; aucune table ou persistance durable de Job n'est créée. `BackfillRequest::with_checkpoint` reste additif afin de préserver les constructeurs existants. @@ -490,6 +490,12 @@ L'exécution utilise un `FuturesUnordered` privé et maintient au plus `hydratio La reprise suit les quatre sémantiques figées : Latest repart de la vue courante et s'appuie sur l'idempotence Store ; Before reprend via le dernier curseur contigu et cumule le préfixe durable ; After et Explicit rejouent le scope et sautent uniquement le préfixe validé. Si une découverte After finit sur `AfterAnchorNotReached`, aucun progrès nouveau de checkpoint n'est publié ; le checkpoint précédent est conservé s'il existe. La tranche matérialise 39 tests unitaires et 9 canaries d'intégration. L'annulation coopérative, le snapshot latest-value complet et les courses terminales restent fermés jusqu'à `pre.009`. +#### `pre.008-fix.001` — Masquage du helper `request` dans la canarie checkpoint + +**Statut : matérialisé ; gate opérateur à rejouer.** + +Le gate opérateur de `pre.008` confirme `cargo fmt`, les audits Rust/Markdown et `cargo check --workspace`, puis la compilation des targets de test échoue en `E0618`/`E0282` : dans `pre_008_checkpoint_is_bound_to_job_and_scope_fingerprint`, la variable locale `request` masque le helper homonyme avant la construction du second scope. Le fix renomme uniquement cette liaison locale en `primary_request` et synchronise ses usages ; aucun contrat, test, comportement runtime, checkpoint, dépendance ou feature ne change. Comme un fichier Rust est corrigé, la version workspace devient `0.3.6-pre.8.fix.1`. Les arbres Cargo de `pre.008` ont déjà été inspectés puisque cette tranche ajoutait `futures-util`; ils n'ont pas à être rejoués pour ce fix sans changement de graphe. + ### `pre.009` — Annulation et snapshots concrets **Statut : planifié.** diff --git a/docs/validation/023-V0_3_6_JOB_API_BACKFILL.md b/docs/validation/023-V0_3_6_JOB_API_BACKFILL.md index 4093e3f..d8e8180 100644 --- a/docs/validation/023-V0_3_6_JOB_API_BACKFILL.md +++ b/docs/validation/023-V0_3_6_JOB_API_BACKFILL.md @@ -1,5 +1,5 @@ - + # Validation v0.3.6 — Job API et premier backfill RAW @@ -113,7 +113,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique - [X] Nombre de candidats entre 1 et 10 000. - [X] Concurrence d'hydratation entre 1 et 64. - [X] `min_context_slot` transmis sans en changer le sens. -- [ ] Checkpoint rejeté si son JobId ou son fingerprint de scope diffère ; test `pre.008` matérialisé, gate opérateur à rejouer. +- [ ] Checkpoint rejeté si son JobId ou son fingerprint de scope diffère ; canarie corrigée par `pre.008-fix.001`, gate opérateur du fix à rejouer. - [X] Aucun défaut d'application silencieux dans la bibliothèque. ## 8. Pagination, ordre et déduplication @@ -175,7 +175,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique ## 12. Concurrence, frontière et checkpoint -`pre.008` matérialise un checkpoint opaque caller-owned, sans table Store ni promesse de reprise crash-safe. `BackfillRequest::with_checkpoint` valide `JobId` et fingerprint avant usage. L'exécuteur utilise une collection `FuturesUnordered` strictement bornée par `hydration_concurrency`, réconcilie les fins hors ordre par index stable et draine les futures déjà admises après la première erreur fatale. Les tests couvrent frontier contiguë, Missing, conflit, reprise Before/Latest/Explicit et protection After lorsque l'ancre n'est pas atteinte ; ils restent à exécuter dans le gate opérateur. +`pre.008` matérialise un checkpoint opaque caller-owned, sans table Store ni promesse de reprise crash-safe. `BackfillRequest::with_checkpoint` valide `JobId` et fingerprint avant usage. L'exécuteur utilise une collection `FuturesUnordered` strictement bornée par `hydration_concurrency`, réconcilie les fins hors ordre par index stable et draine les futures déjà admises après la première erreur fatale. Le gate opérateur confirme format, audits et `cargo check`, mais la compilation des tests échoue en `E0618`/`E0282` parce qu'une liaison locale `request` masque le helper homonyme dans la canarie checkpoint. `pre.008-fix.001` renomme uniquement cette liaison en `primary_request`; le gate du fix reste à rejouer. - [ ] Nombre d'hydratations en vol borné par la requête. - [ ] Aucune file de candidats ou notifications non bornée. @@ -207,7 +207,7 @@ Aucune entrée absolue, traversée, avec séparateur inversé ou lien symbolique - [X] Versions/features auditées : aucune nouvelle version externe ; `sha2`, `futures-util` et `tokio` réutilisent les entrées workspace existantes. `futures-util` devient un détail normal privé de `pre.008`, Tokio reste dev-only. - [X] `pre.005` matérialise 11 tests unitaires et 6 canaries d’intégration ; le gate opérateur les exécute tous avec succès. - [X] `pre.006` matérialise 19 tests unitaires et 7 canaries d’intégration ; le gate opérateur les exécute tous avec succès, avec uniquement le warning Clippy corrigé par `pre.006-fix.001`. -- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.007` ; le gate `pre.008` reste à rejouer. +- [X] `cargo clippy --workspace --all-targets` warning-free sur `pre.007` ; `pre.008` atteint la compilation des tests puis échoue sur le shadowing corrigé par `pre.008-fix.001`. - [ ] `cargo fmt --all -- --check` vert. - [X] `scripts/audit_rust_workspace_rules.py` vert sur `pre.005` dans l'environnement d'assemblage et dans le gate opérateur. - [X] `scripts/audit_markdown_tables.py` vert sur `pre.005` dans le gate opérateur (264 tables / 147 fichiers, delta inclus).