Files
2026-08-28 15:12:59 +02:00

5.8 KiB

Delta 0.2.14-pre.005 — adversarial/API hardening + completeness

1. Base requise

Cette tranche s'applique exclusivement sur :

v0.2.13
+ 0.2.14-pre.001
+ 0.2.14-pre.002
+ 0.2.14-pre.003
+ 0.2.14-pre.004

Le gate opérateur fourni pour pre.004 est intégralement vert :

cargo fmt --all                                      PASS
python3 scripts/audit_rust_workspace_rules.py        PASS
python3 scripts/audit_markdown_tables.py ...         PASS — 172 tables / 121 fichiers
cargo check --workspace                              PASS
cargo clippy --workspace --all-targets               PASS
cargo test -p ksp-program-api                        PASS — 11 tests Rust
cargo test --workspace                               PASS
cargo tree -p ksp-program-api --edges normal         PASS — Core + Interface uniquement
cargo tree --duplicates                              exécuté

La version workspace passe de :

0.2.14-pre.4

à :

0.2.14-pre.5

Commit attendu :

v0.2.14-pre.005

2. Objectif

Fermer la surface Program API déjà matérialisée sans ajouter de contrat fonctionnel :

bounds et sécurité Debug/error
inventaire exact des exports publics
inventaire exact des modules de production
absence de closed-world Program enum
absence de registry/descriptors/preparer/payload D3
absence de serde/codec/logging/runtime
associated output sans bound implicite

3. Release completeness

Le nouveau tests/release_completeness.rs verrouille :

10 réexports crate-root exacts
aucun pub mod
3 fichiers Rust de production exacts
2 enums publics exacts, tous deux non_exhaustive
1 trait public exact : ProgramInstructionDecoder
aucun ProgramKind / registry / autre famille decoder / preparer
aucun Any / serde / codec / logging / réseau / IO runtime
aucun dyn ProgramInstructionDecoder ou registry hétérogène anticipé

La surface publique reste donc ouverte par Pubkey et associated output, pas par un inventaire central fermé.

4. Hardening adversarial

Le nouveau tests/security_hardening.rs couvre trois propriétés.

Input Interface maximal

Une instruction au maximum déjà admis par Interface :

255 account metas
10 240 bytes de data

traverse ProgramInstructionDecoder::decode par référence et le decoder observe les tailles exactes. Program API n'introduit aucun second bound ni nouveau type d'input.

Payload hostile et erreur Core

Un decoder de test reçoit un payload contenant un marqueur hostile puis retourne un ksp_program_api::Error sûr. Le contrat Program API ne copie automatiquement ni l'instruction ni ses bytes dans l'erreur, son Display ou son Debug.

L'hygiène des messages/contextes qu'une implémentation tierce construit volontairement reste la responsabilité de cette implémentation ; Program API n'ajoute aucun canal Failed parallèle susceptible de dupliquer le payload.

Associated output sans bound implicite

Un second decoder de test utilise un output contenant Rc<Cell<u8>>. Ce type n'implémente donc pas Send/Sync et aucun Debug/Clone n'est dérivé. La compilation prouve que type Decoded reste sans bound implicite ; le Debug de l'outcome demeure Decoded sans rendre la valeur.

5. Dependency/runtime firewall

Le manifest de production reste inchangé :

ksp-core-lib
ksp-interface-lib

Les canaris refusent toujours :

ksp-program-lib
ksp-logging-lib
Config / Transport / Wallet / Store / Materializer
serde / serde_json / Any
borsh / bincode / wincode
reqwest / tokio / tonic / tauri / tracing
std::env / std::fs / std::net dans la production Program API

6. Fichiers ajoutés

crates/ksp-program-api/tests/release_completeness.rs
crates/ksp-program-api/tests/security_hardening.rs
deltas/0.2.14/pre.005.md

7. Fichiers modifiés

Cargo.toml
docs/plans/021-V0_2_14_PROGRAM_API_PLAN.md
docs/validation/017-V0_2_14_PROGRAM_API.md

8. Fichiers volontairement inchangés

crates/ksp-program-api/Cargo.toml
crates/ksp-program-api/src/**
crates/ksp-program-api/README.md
crates/ksp-program-api/USAGE.md
crates/ksp-program-api/tests/dependency_boundary.rs
crates/ksp-program-api/tests/external_implementation.rs
crates/ksp-program-api/tests/public_api.rs
README.md
RULES.md
ROADMAP.md
CHANGELOG.md
docs/architecture/**
docs/rules/**
crates/ksp-core-lib/**
crates/ksp-interface-lib/**
crates/ksp-logging-lib/**
crates/ksp-*-transport-lib/**
crates/ksp-config-lib/**
crates/ksp-wallet-lib/**
crates/ksp-app-*/**
prompts/**

9. Scope négatif maintenu

Cette tranche n'introduit pas :

nouveau type ou trait de production
runtime decoder registry
Vec<Box<dyn ProgramInstructionDecoder>>
object-safety heterogeneous promise
identity/version/coverage descriptor
priority/conflict policy
ProgramAccountDecoder / Event / ReturnData
payload canonique D3
serde / JSON / Any
proof/confidence contextuels
ProgramExecutionPreparer
ExecutionPolicy / Execution

10. Gate opérateur attendu

Après application :

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.14
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-program-api
cargo test --workspace
cargo tree -p ksp-program-api --edges normal
cargo tree --duplicates

Le graphe normal doit rester :

ksp-program-api
├── ksp-core-lib
└── ksp-interface-lib
    └── ksp-core-lib

Une correction découverte par ce gate reste un 0.2.14-pre.005-fix.NNN et n'avance pas pre.006.

11. Suite

Après gate vert, pre.006 est un gate technique final sans développement fonctionnel. Il ne doit ajouter ni contrat, ni decoder officiel, ni registry, ni preparer.