v0.2.11-pre.010-fix.001
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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(());
|
||||||
}
|
}
|
||||||
|
|||||||
118
deltas/0.2.11/pre.010-fix.001.md
Normal file
118
deltas/0.2.11/pre.010-fix.001.md
Normal 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.
|
||||||
@@ -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é.**
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user