diff --git a/Cargo.toml b/Cargo.toml index b3991b9..18e3e82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.2.11-pre.10" +version = "0.2.11-pre.10.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-offchain-transport-lib/tests/security_hardening.rs b/crates/ksp-offchain-transport-lib/tests/security_hardening.rs index eae46fd..c873bae 100644 --- a/crates/ksp-offchain-transport-lib/tests/security_hardening.rs +++ b/crates/ksp-offchain-transport-lib/tests/security_hardening.rs @@ -1,5 +1,5 @@ // file: crates/ksp-offchain-transport-lib/tests/security_hardening.rs -// version: 1 +// version: 2 #![warn(missing_docs)] #![deny(unreachable_pub)] @@ -66,7 +66,6 @@ fn pre_010_market_price_sources_do_not_read_environment_or_use_float_price_truth }; assert!(!source.contains("std::env"), "market-price source must not bypass Config environment ownership: {name}"); assert!(!source.contains("as_f64("), "market-price source must not use serde_json f64 as canonical price truth: {name}"); - assert!(!source.contains("tracing::"), "market-price source must use ksp-logging-lib rather than tracing directly: {name}"); } return std::result::Result::Ok(()); } diff --git a/deltas/0.2.11/pre.010-fix.001.md b/deltas/0.2.11/pre.010-fix.001.md new file mode 100644 index 0000000..28adfec --- /dev/null +++ b/deltas/0.2.11/pre.010-fix.001.md @@ -0,0 +1,118 @@ + + + +# Delta `0.2.11-pre.010-fix.001` — Canari ownership logging du hardening + +## 1. Base requise + +Ce correctif s'applique exclusivement après `0.2.11-pre.010`. + +Version Cargo attendue à l'entrée : + +```text +0.2.11-pre.10 +``` + +Version Cargo de sortie : + +```text +0.2.11-pre.10.fix.1 +``` + +## 2. Motif du correctif + +Le gate opérateur du `2026-08-26` a produit : + +```text +cargo fmt --all exécuté +audit Rust workspace PASS +audit Markdown PASS, 124 tables / 118 files +cargo check --workspace PASS +cargo clippy --workspace --all-targets PASS +cargo test -p ksp-offchain-transport-lib PASS +cargo test -p ksp-config-lib PASS +cargo test --workspace FAIL +``` + +L'échec workspace provient du canari global : + +```text +ksp-logging-lib/tests/ownership.rs +workspace_crates_do_not_bypass_ksp_logging_facade +``` + +Le nouveau `tests/security_hardening.rs` de `pre.010` contenait lui-même le chemin lexical interdit dans une assertion destinée à vérifier son absence dans les modules `market_price_*`. Le scanner global inspectant tous les fichiers Rust, il a correctement détecté ce littéral dans le test et l'a interprété comme un bypass. + +## 3. Correction + +Le canari local Off-chain ne duplique plus la vérification de ownership logging. + +`tests/security_hardening.rs` continue de vérifier ses invariants propres : + +```text +redaction des API keys dans Debug +absence de lecture directe de std::env dans market_price_* +absence de as_f64 comme vérité canonique de prix +absence d'URL provider libre dans Config +absence de rate-limit provider libre dans Config +``` + +L'autorité unique pour interdire les chemins logging directs dans les crates du workspace reste : + +```text +crates/ksp-logging-lib/tests/ownership.rs +``` + +Il n'est ni nécessaire ni souhaitable de contourner ce scanner en fragmentant ou construisant dynamiquement la chaîne interdite dans un autre test. + +## 4. Scope fonctionnel inchangé + +Ce fix ne modifie pas : + +```text +les huit providers V1 +HTTP commun +rate limits / cooldowns +MarketPriceService +refresh / refresh_many / refresh_all +Config Off-chain Transport +numeric safety +parsing timestamps +provenance +redaction runtime +API publique #[non_exhaustive] +endpoints ou credentials +smoke live +``` + +Aucune nouvelle dépendance n'est ajoutée. + +## 5. Fichiers modifiés + +```text +Cargo.toml +crates/ksp-offchain-transport-lib/tests/security_hardening.rs +docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +``` + +## 6. Fichier ajouté + +```text +deltas/0.2.11/pre.010-fix.001.md +``` + +## 7. Gate opérateur requis + +```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.2.11 +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-offchain-transport-lib +cargo test -p ksp-config-lib +cargo test --workspace +``` + +`pre.011` ne doit commencer qu'après ce gate propre. diff --git a/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md b/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md index 6e7ccb9..8328741 100644 --- a/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md +++ b/docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider -**Statut courant : `0.2.11-pre.010` durcit la façade et les invariants avant le gate live. Les enums publiques évolutives de `market_price` sont désormais `#[non_exhaustive]`, des canaries release-level verrouillent l'inventaire exact des huit providers, la redaction et les frontières Config/HTTP, et des tests adversariaux complètent numeric safety, timestamps et provenance. `README.md` / `USAGE.md` de la nouvelle crate sont introduits comme brouillons techniques uniquement ; la réconciliation documentaire finale reste réservée à `pre.012`. Le gate opérateur de `pre.009` est intégralement PASS.** +**Statut courant : `0.2.11-pre.010-fix.001` corrige uniquement un canari de hardening qui dupliquait lexicalement le scanner global de ownership logging et faisait échouer `cargo test --workspace`. Le hardening fonctionnel de `pre.010` reste inchangé ; l'autorité de détection des bypass logging demeure `ksp-logging-lib/tests/ownership.rs`. Le gate du fix doit être rejoué avant `pre.011`.** ## 1. Base et autorité @@ -776,10 +776,12 @@ Ajout de `cfg.std.offchain_transport` / `schema.std.offchain_transport`, du docu ### `pre.010` — Hardening et complétude technique -**Statut : réalisé côté delta ; gate Cargo opérateur à rejouer.** +**Statut : réalisé ; `pre.010-fix.001` corrige un faux positif du canari local de hardening, gate du fix à rejouer.** Durcissement de la façade publique avec `#[non_exhaustive]` sur les enums évolutives, absorption future-safe de ces enums par l'adapter Config, canaries de complétude exacte des huit providers, tests adversariaux numeric/timestamps/provenance/redaction et vérification de l'absence d'URL/rate-limit provider configurables. Les premiers `README.md` / `USAGE.md` d'Off-chain Transport et les ajouts Config associés sont des brouillons techniques ; `pre.012` reste seule propriétaire de la réconciliation documentaire finale. Le contrat `refresh_many`/`refresh_all` V1 est explicitement réaffirmé séquentiel et déterministe. +`pre.010-fix.001` retire du canari Off-chain la vérification lexicale du chemin logging direct : elle dupliquait le scanner global de `ksp-logging-lib` et son propre littéral de test était lui-même détecté comme bypass. Le scanner workspace reste l'autorité unique pour cette frontière ; aucune politique logging ni logique runtime Off-chain ne change. + ### `pre.011` — Gate technique et live final **Statut : planifié.** diff --git a/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md b/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md index e8c3f0f..0d46cee 100644 --- a/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md +++ b/docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md @@ -1,5 +1,5 @@ - + # Validation `0.2.11` — Off-chain price transport SOL/USD @@ -315,27 +315,29 @@ La tranche n'ajoute aucune URL provider configurable, aucun SDK provider et aucu ## 3.13 Gate `0.2.11-pre.010` -| Critère | Statut | Preuve | -|------------------------------------------------------------------------|---------|------------------------------------------------------| -| version workspace `0.2.11-pre.10` | PASS | `Cargo.toml` racine | -| enums publiques évolutives marquées `#[non_exhaustive]` | PASS | provider/access modes/setup + canari completeness | -| adapter Config future-safe face aux access modes non exhaustifs | PASS | branches wildcard vers erreur effective sûre | -| inventaire exact des huit providers et sémantiques verrouillé | PASS | `tests/release_completeness.rs` | -| aucun environnement lu par les modules `market_price_*` | PASS | `tests/security_hardening.rs` | -| aucun `as_f64` utilisé comme vérité de prix `market_price` | PASS | `tests/security_hardening.rs` | -| aucun `tracing::` direct dans `market_price_*` | PASS | `tests/security_hardening.rs` | -| Debug keyed settings/service ne divulgue pas les API keys | PASS | canari secret déterministe | -| Config rejette URL provider et override de rate limit | PASS | schema strict + test Config adversarial | -| timestamps RFC3339/pre-epoch/overflow durcis | PASS | unit test `market_price_adapter` | -| JSON numeric pathologique/null/non-numérique rejeté | PASS | unit test `market_price_decimal` | -| provenance accepte la borne et rejette trim/control/oversize | PASS | unit test `market_price_observation` | -| `refresh_many` / `refresh_all` V1 documentés séquentiels/déterministes | PASS | plan + `README.md` / `USAGE.md` Off-chain | -| README/USAGE techniques créés sans usurper la réconciliation finale | PASS | crate Off-chain + compléments Config | -| audit Rust sandbox | PLANNED | à exécuter sur l'état final de l'archive | -| audit Markdown sandbox | PLANNED | à exécuter sur l'état final de l'archive | -| `cargo check` / Clippy / tests ciblés et workspace | PLANNED | gate opérateur requis après application de `pre.010` | +| Critère | Statut | Preuve | +|------------------------------------------------------------------------|---------|-----------------------------------------------------| +| version workspace `0.2.11-pre.10.fix.1` | PASS | `Cargo.toml` racine | +| enums publiques évolutives marquées `#[non_exhaustive]` | PASS | provider/access modes/setup + canari completeness | +| adapter Config future-safe face aux access modes non exhaustifs | PASS | branches wildcard vers erreur effective sûre | +| inventaire exact des huit providers et sémantiques verrouillé | PASS | `tests/release_completeness.rs` | +| aucun environnement lu par les modules `market_price_*` | PASS | `tests/security_hardening.rs` | +| aucun `as_f64` utilisé comme vérité de prix `market_price` | PASS | `tests/security_hardening.rs` | +| aucun bypass logging direct dans le workspace | PASS | scanner global `ksp-logging-lib/tests/ownership.rs` | +| Debug keyed settings/service ne divulgue pas les API keys | PASS | canari secret déterministe | +| Config rejette URL provider et override de rate limit | PASS | schema strict + test Config adversarial | +| timestamps RFC3339/pre-epoch/overflow durcis | PASS | unit test `market_price_adapter` | +| JSON numeric pathologique/null/non-numérique rejeté | PASS | unit test `market_price_decimal` | +| provenance accepte la borne et rejette trim/control/oversize | PASS | unit test `market_price_observation` | +| `refresh_many` / `refresh_all` V1 documentés séquentiels/déterministes | PASS | plan + `README.md` / `USAGE.md` Off-chain | +| README/USAGE techniques créés sans usurper la réconciliation finale | PASS | crate Off-chain + compléments Config | +| audit Rust sandbox | PASS | clean, 0 candidate export | +| audit Markdown sandbox | PASS | clean sur le fix | +| gate brut `pre.010` | FAIL | workspace ownership logging : 1 canari FAIL | +| fix `pre.010-fix.001` statique | PASS | doublon lexical retiré, audits sandbox | +| gate Cargo complet du fix | PLANNED | à rejouer avant `pre.011` | -`pre.010` ne fait aucun smoke live, ne change aucun endpoint provider et n'introduit ni fallback, ni consensus, ni scheduler. Les documents crate créés ici sont des brouillons techniques courants ; `pre.012` reste seule propriétaire de la réconciliation documentaire finale après le gate technique/live de `pre.011`. +`pre.010` ne fait aucun smoke live, ne change aucun endpoint provider et n'introduit ni fallback, ni consensus, ni scheduler. Les documents crate créés ici sont des brouillons techniques courants ; `pre.012` reste seule propriétaire de la réconciliation documentaire finale après le gate technique/live de `pre.011`. Le gate brut de `pre.010` a passé audits, `cargo check`, Clippy et tests ciblés, puis `cargo test --workspace` a échoué dans `ksp-logging-lib/tests/ownership.rs` parce que `tests/security_hardening.rs` contenait littéralement le chemin logging interdit dans une assertion destinée à le bannir. `pre.010-fix.001` supprime ce scanner local redondant et conserve `ksp-logging-lib/tests/ownership.rs` comme autorité workspace unique. ## 4. Matrice provider prévue