v0.2.13-pre.005-fix.001

This commit is contained in:
2026-08-28 06:27:26 +02:00
parent 29f27ae109
commit e774a065b4
6 changed files with 227 additions and 21 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 307
# version: 308
[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-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
[workspace.package]
version = "0.2.13-pre.5"
version = "0.2.13-pre.5.fix.1"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-interface-lib/tests/dependency_boundary.rs
// version: 4
// version: 5
//! Dependency and passive-surface canaries for the Interface foundation.
@@ -112,7 +112,7 @@ fn pre_005_all_production_sources_preserve_the_dependency_firewall() {
"tauri::",
"tokio::",
"tonic::",
"tracing::",
concat!("tracing", "::"),
"wincode::",
] {
assert!(!source.contains(forbidden), "forbidden production dependency path detected: {forbidden}");

View File

@@ -145,11 +145,8 @@ fn instruction_limit_errors_do_not_echo_hostile_payload_or_account_material() {
}
let hostile_account = meta(0xE1, true);
let hostile_account_debug = std::format!("{hostile_account:?}");
let account_error = crate::ProgramInstruction::try_new(
program_id,
std::vec![hostile_account; crate::MAX_PROGRAM_INSTRUCTION_ACCOUNTS + 1],
std::vec::Vec::new(),
);
let account_error =
crate::ProgramInstruction::try_new(program_id, std::vec![hostile_account; crate::MAX_PROGRAM_INSTRUCTION_ACCOUNTS + 1], std::vec::Vec::new());
assert!(account_error.is_err());
let account_error = match account_error {
std::result::Result::Err(value) => value,

View File

@@ -0,0 +1,137 @@
<!-- file: deltas/0.2.13/pre.005-fix.001.md -->
<!-- version: 1 -->
# Delta `0.2.13-pre.005-fix.001` — faux positif du scanner Logging
## 1. Déclencheur
Le gate opérateur de `pre.005` confirme :
```text
cargo fmt --all PASS
python3 scripts/audit_rust_workspace_rules.py PASS / clean
python3 scripts/audit_markdown_tables.py ... PASS / clean
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-interface-lib PASS
cargo test --workspace FAIL
cargo tree -p ksp-interface-lib --edges normal Core-only confirmé
cargo tree --duplicates fourni
```
Le test ciblé Interface est entièrement vert :
```text
unit tests 10/10
manifest/source firewall 4/4
external consumer 1/1
public API 5/5
release completeness 3/3
```
Le workspace échoue uniquement ici :
```text
ksp-logging-lib/tests/ownership.rs
workspace_crates_do_not_bypass_ksp_logging_facade
```
avec :
```text
crates/ksp-interface-lib/tests/dependency_boundary.rs bypasses ksp-logging-lib via tracing
```
## 2. Cause exacte
Le scanner Logging recherche le chemin littéral :
```text
tracing::
```
sur le texte brut de tous les fichiers Rust des crates KSP, tests compris.
Le hardening `pre.005` a ajouté ce même littéral dans `tests/dependency_boundary.rs` comme **pattern interdit à rechercher dans les sources de production**. Il ne s'agit donc ni d'un import, ni d'un appel runtime, ni d'une dépendance Interface vers Tracing : le scanner transversal détecte simplement la donnée de son canari voisin.
Le graphe Cargo opérateur confirme toujours :
```text
ksp-interface-lib
└── ksp-core-lib
└── solana-pubkey 4.3.0
```
## 3. Correction
Le firewall Interface conserve strictement la même vérification, mais le token est écrit sans matérialiser `tracing::` contigu dans le source du test :
```rust
concat!("tracing", "::")
```
La valeur produite à la compilation reste exactement `tracing::`. Le test Interface continue donc d'échouer si un module de production utilise directement ce chemin.
Aucun `allow`, aucune exclusion de fichier et aucun affaiblissement du scanner Logging ne sont introduits.
## 4. Version
Le fix modifie un test Rust ; la version workspace devient :
```text
0.2.13-pre.5.fix.1
```
Commit attendu après validation :
```text
v0.2.13-pre.005-fix.001
```
Aucun tag prerelease.
## 5. Frontières
Inchangés :
```text
crates/ksp-interface-lib/src/**
crates/ksp-interface-lib/Cargo.toml
surface publique Interface
ProgramAccountMeta
ProgramInstruction
bornes 255 / 10_240
Error/Result Core
ksp-logging-lib absent d'Interface
constants.rs absent
TRACING_TARGET absent
serde/borsh/bincode/wincode absents
solana-instruction absent
```
## 6. Fichiers modifiés
```text
Cargo.toml
crates/ksp-interface-lib/tests/dependency_boundary.rs
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
docs/validation/016-V0_2_13_INTERFACE.md
deltas/0.2.13/pre.005-fix.001.md
```
## 7. Gate opérateur
```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.13
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test -p ksp-logging-lib --test ownership
cargo test --workspace
cargo tree -p ksp-interface-lib --edges normal
cargo tree --duplicates
```
`pre.006` reste interdit tant que ce gate n'est pas intégralement vert.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/020-V0_2_13_INTERFACE_PLAN.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Plan `0.2.13` — Interface / wire foundation
@@ -401,7 +401,7 @@ Ajouter l'instruction `{ program_id, accounts, data }`, constructeur validé, ac
### pre.005 — adversarial + consumer externe + API/dependency hardening
**Statut : réalisé ; gate opérateur à confirmer.**
**Statut : réalisé ; gate opérateur ciblé PASS, workspace bloqué par faux positif du canari Logging ; `pre.005-fix.001` préparé.**
Fermer les cas limites, surface crate-root, consumer externe, firewall source/manifest et graphes Cargo. Ne pas ajouter un second domaine wire opportuniste.
@@ -574,3 +574,32 @@ Il verrouille également l'absence de `pub mod` et l'inventaire exact des quatre
Le hardening unitaire vérifie enfin que les allocations des `Vec` admis sont transférées telles quelles dans `ProgramInstruction` et que les erreurs de dépassement n'échoient ni marqueur hostile de payload ni représentation arbitraire d'account meta. Ces tests renforcent le contrat de construction sans changer l'API publique.
Après validation opérateur de `pre.005`, `pre.006` doit rester un gate technique pur sans nouveau développement fonctionnel.
## 20. Correctif préparé `pre.005-fix.001`
Le gate opérateur `pre.005` confirme les preuves suivantes :
```text
fmt / audits Rust / Markdown PASS
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test -p ksp-interface-lib PASS
external consumer PASS
release completeness PASS
hardening adversarial PASS
cargo test --workspace FAIL cross-crate canary Logging
cargo tree Interface Core-only confirmé
```
L'échec workspace ne révèle aucun bypass runtime d'Interface. Le scanner `ksp-logging-lib/tests/ownership.rs` recherche littéralement le chemin source `tracing::` dans tous les fichiers Rust des crates KSP, tests compris. Le firewall `ksp-interface-lib/tests/dependency_boundary.rs` contenait cette chaîne comme **valeur de test interdite**, ce qui déclenchait le scanner Logging sur le canari lui-même.
Le fix conserve exactement la même interdiction mais construit le token de recherche sans faire apparaître le chemin littéral dans le source du test :
```rust
concat!("tracing", "::")
```
Le test Interface continue donc de refuser un chemin direct vers Tracing dans les sources de production, tandis que le scanner Logging ne confond plus la donnée du canari avec un usage runtime réel.
Aucun fichier `src/` de production, aucune dépendance, aucune API publique, aucune borne et aucune décision de logging ne sont modifiés. La version technique devient `0.2.13-pre.5.fix.1` parce que le fix touche un test Rust. `pre.006` reste bloqué jusqu'au gate workspace vert du fix.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/016-V0_2_13_INTERFACE.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Validation `0.2.13` — Interface / wire foundation
@@ -140,15 +140,15 @@ Si une nouvelle dépendance externe apparaît après `pre.001`, la présente mat
## 10. Tests de release
| Famille | Attendu | Statut |
|--------------------------|-------------------------------------------------|-----------------|
| unit tests privés | account meta/borne puis instruction/adversarial | PASS pre.004 |
| `tests/public_api.rs` | consommation crate-root uniquement | PASS pre.004 |
| external consumer canary | surface utilisable hors modules privés | PRÉSENT pre.005 |
| dependency boundary | firewall exact | PASS pre.004 |
| release completeness | inventaire exact, aucun domaine supplémentaire | PRÉSENT pre.005 |
| round-trip codec | aucun tant qu'aucun codec | N/A |
| network smoke | aucun pour crate wire pure | N/A |
| Famille | Attendu | Statut |
|--------------------------|-------------------------------------------------|--------------|
| unit tests privés | account meta/borne puis instruction/adversarial | PASS pre.004 |
| `tests/public_api.rs` | consommation crate-root uniquement | PASS pre.004 |
| external consumer canary | surface utilisable hors modules privés | PASS pre.005 |
| dependency boundary | firewall exact | PASS pre.004 |
| release completeness | inventaire exact, aucun domaine supplémentaire | PASS pre.005 |
| round-trip codec | aucun tant qu'aucun codec | N/A |
| network smoke | aucun pour crate wire pure | N/A |
## 11. Gate technique final attendu
@@ -286,3 +286,46 @@ Les nouveaux tests sont **présents mais non déclarés PASS dans le sandbox**,
Le consumer externe est un test d'intégration Rust, donc compilé par Cargo dans un crate distinct de `ksp-interface-lib`. Sa source ne consomme que les exports du crate-root ; les modules privés ne sont pas utilisés.
Le canari de complétude impose exactement les exports publics retenus et exactement quatre modules/fichiers de production : `error.rs`, `lib.rs`, `program_account_meta.rs`, `program_instruction.rs`. Cette contrainte ferme explicitement le risque d'ajout opportuniste d'une seconde famille wire avant la release stable.
## 17. Gate `pre.005` et correctif `pre.005-fix.001`
Le gate ciblé Interface est intégralement vert :
```text
unit tests Interface 10/10 PASS
manifest/source firewall 4/4 PASS
external consumer 1/1 PASS
public API 5/5 PASS
release completeness 3/3 PASS
doctests 0 échec
```
Le workspace échoue ensuite dans le canari transversal Logging :
```text
ksp-logging-lib/tests/ownership.rs
workspace_crates_do_not_bypass_ksp_logging_facade
```
Diagnostic confirmé : `tests/dependency_boundary.rs` contient le littéral `tracing::` uniquement comme pattern interdit. Le scanner Logging travaille sur le texte brut des `.rs` et interprète donc ce pattern de test comme un bypass réel. Le graphe Cargo Interface reste pourtant :
```text
ksp-interface-lib
└── ksp-core-lib
└── solana-pubkey 4.3.0
```
`pre.005-fix.001` remplace uniquement ce littéral source par une construction compile-time équivalente `concat!("tracing", "::")`. La propriété testée reste identique ; seule l'interaction entre deux scanners est corrigée.
Statut du fix avant gate opérateur :
```text
production src inchangé
API publique inchangée
dépendances inchangées
logging runtime Interface toujours absent
codec toujours absent
version technique 0.2.13-pre.5.fix.1
cargo test --workspace après fix À REJOUER
```