v0.2.11-pre.010-fix.001

This commit is contained in:
2026-08-26 12:34:48 +02:00
parent 2db3c4be78
commit 98708df6e0
5 changed files with 148 additions and 27 deletions

View File

@@ -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"] 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] [workspace.package]
version = "0.2.11-pre.10" version = "0.2.11-pre.10.fix.1"
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-offchain-transport-lib/tests/security_hardening.rs // file: crates/ksp-offchain-transport-lib/tests/security_hardening.rs
// version: 1 // version: 2
#![warn(missing_docs)] #![warn(missing_docs)]
#![deny(unreachable_pub)] #![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("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("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(()); return std::result::Result::Ok(());
} }

View File

@@ -0,0 +1,118 @@
<!-- file: deltas/0.2.11/pre.010-fix.001.md -->
<!-- version: 1 -->
# 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.

View File

@@ -1,9 +1,9 @@
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md --> <!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
<!-- version: 17 --> <!-- version: 18 -->
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider # 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é ## 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 ### `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. 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 ### `pre.011` — Gate technique et live final
**Statut : planifié.** **Statut : planifié.**

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md --> <!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
<!-- version: 16 --> <!-- version: 17 -->
# Validation `0.2.11` — Off-chain price transport SOL/USD # 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` ## 3.13 Gate `0.2.11-pre.010`
| Critère | Statut | Preuve | | Critère | Statut | Preuve |
|------------------------------------------------------------------------|---------|------------------------------------------------------| |------------------------------------------------------------------------|---------|-----------------------------------------------------|
| version workspace `0.2.11-pre.10` | PASS | `Cargo.toml` racine | | 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 | | 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 | | 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` | | 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 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 `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` | | 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 | | 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 | | 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` | | 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` | | 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` | | 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 | | `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 | | 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 Rust sandbox | PASS | clean, 0 candidate export |
| audit Markdown sandbox | PLANNED | à exécuter sur l'état final de l'archive | | audit Markdown sandbox | PASS | clean sur le fix |
| `cargo check` / Clippy / tests ciblés et workspace | PLANNED | gate opérateur requis après application de `pre.010` | | 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 ## 4. Matrice provider prévue