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,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
```