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.