0.5.1-pre.001

This commit is contained in:
2026-08-09 18:53:09 +02:00
parent 7dddab6d37
commit 816eee59a9
9 changed files with 744 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
# file: Cargo.toml # file: Cargo.toml
# version: 44 # version: 45
[workspace] [workspace]
resolver = "3" resolver = "3"
@@ -18,7 +18,7 @@ members = [
] ]
[workspace.package] [workspace.package]
version = "0.5.0-pre.4" version = "0.5.1-pre.1"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-bot3" repository = "https://git.sasedev.com/Sasedev/khadhroony-bot3"

View File

@@ -1,5 +1,5 @@
<!-- file: README.md --> <!-- file: README.md -->
<!-- version: 19 --> <!-- version: 20 -->
# Khadhroony Bot3 # Khadhroony Bot3
@@ -21,7 +21,7 @@ Le workspace contient onze crates :
- `kb-wallet` : frontière de wallet et signataires ; - `kb-wallet` : frontière de wallet et signataires ;
- `kb-app-demo-desktop` : application Tauri de démonstration et validation opérateur. - `kb-app-demo-desktop` : application Tauri de démonstration et validation opérateur.
La série `0.5.x` prépare la séparation explicite entre le domaine applicatif `khadhroony-bot` et les bibliothèques généralistes `khadhroony-solana`. En `0.5.1`, les dix crates généralistes doivent migrer vers les noms `ks-*` / `ks_*`, tandis que `kb-app-demo-desktop` conserve son nom et reste une application du workspace Bot. La politique de migration est définie dans [`docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md`](docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md). La série `0.5.x` prépare la séparation explicite entre le domaine applicatif `khadhroony-bot` et les bibliothèques généralistes `khadhroony-solana`. En `0.5.1`, les dix crates généralistes doivent migrer vers les noms `ks-*` / `ks_*`, tandis que `kb-app-demo-desktop` conserve son nom et reste une application du workspace Bot. Le workspace, le dépôt et le répertoire racine restent nommés `khadhroony-bot3` pendant cette migration et ne doivent pas être renommés avant `1.0` ou une version ultérieure explicitement dédiée. La politique de migration est définie dans [`docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md`](docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md).
Références : Références :

View File

@@ -1,5 +1,5 @@
<!-- file: docs/README.md --> <!-- file: docs/README.md -->
<!-- version: 30 --> <!-- version: 31 -->
# Documentation active de Khadhroony Bot3 # Documentation active de Khadhroony Bot3
@@ -104,7 +104,9 @@ Les preuves détaillées de `0.4.8-pre.*` restent accessibles sous `../olddocs/a
Le cadrage `0.5.0` est clôturé. Son plan et les audits `pre.002`/`pre.003` sont archivés sous `../olddocs/archivekbot3/docs/plans/`. Le cadrage `0.5.0` est clôturé. Son plan et les audits `pre.002`/`pre.003` sont archivés sous `../olddocs/archivekbot3/docs/plans/`.
Le prochain plan temporaire sera créé pendant la première prerelease de `0.5.1`, conformément au cycle de développement. Plan actif de `0.5.1` :
- [`V0_5_1_KHADHROONY_SOLANA_NAMESPACE_AND_CONFIG_PLAN.md`](plans/V0_5_1_KHADHROONY_SOLANA_NAMESPACE_AND_CONFIG_PLAN.md) — inventaire de migration `ks-*` / `ks_*` / `KS_*`, configuration sûre et découpage borné des prereleases.
## 11. Prompt de reprise ## 11. Prompt de reprise

View File

@@ -1,5 +1,5 @@
<!-- file: docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md --> <!-- file: docs/decisions/KHADHROONY_SOLANA_NAMESPACE_POLICY.md -->
<!-- version: 1 --> <!-- version: 2 -->
# Politique de namespace Khadhroony Solana # Politique de namespace Khadhroony Solana
@@ -9,6 +9,8 @@ Cette décision est adoptée pendant la clôture de `0.5.0` et devient la cible
Le workspace `0.5.0` conserve encore physiquement les noms `kb-*`, `kb_*`, `KB_*`, `kb-lib.*` et `kb_sol_*` là où ils existent. Leur présence avant migration ne remet pas en cause la cible ci-dessous. Le workspace `0.5.0` conserve encore physiquement les noms `kb-*`, `kb_*`, `KB_*`, `kb-lib.*` et `kb_sol_*` là où ils existent. Leur présence avant migration ne remet pas en cause la cible ci-dessous.
Le renommage des bibliothèques internes ne renomme pas le workspace, le dépôt ni le répertoire racine : ils restent `khadhroony-bot3` pendant toute la série pré-`1.0`. Un éventuel renommage du workspace racine est explicitement hors périmètre de `0.5.x` et ne doit intervenir qu'en `1.0` ou ultérieurement sur décision dédiée.
## 2. Positionnement des projets ## 2. Positionnement des projets
`khadhroony-project` est une umbrella de projets liés au trading et/ou aux technologies crypto. Elle n'est pas limitée à Solana ni même à la crypto. Des projets futurs pourront par exemple viser XTB ou MetaTrader indépendamment des composants Solana. `khadhroony-project` est une umbrella de projets liés au trading et/ou aux technologies crypto. Elle n'est pas limitée à Solana ni même à la crypto. Des projets futurs pourront par exemple viser XTB ou MetaTrader indépendamment des composants Solana.

View File

@@ -0,0 +1,720 @@
<!-- file: docs/plans/V0_5_1_KHADHROONY_SOLANA_NAMESPACE_AND_CONFIG_PLAN.md -->
<!-- version: 1 -->
# Plan temporaire `0.5.1` — namespace Khadhroony Solana et configuration sûre
## 1. Statut et règle de cette prerelease
Ce document est le plan temporaire de `0.5.1`. `0.5.1-pre.001` reste exclusivement consacrée à l'inventaire, aux contrats de migration et au découpage des prereleases. Aucun répertoire de crate n'est renommé dans `pre.001` et aucun comportement runtime n'est restructuré.
La base `0.5.0-pre.004` a été validée par `cargo fmt --all`, `cargo check --workspace`, `cargo clippy --all-targets`, `python3 scripts/audit_rust_workspace_rules.py` et `cargo test --workspace`. Les tests d'API externe passent également.
## 2. Invariant du workspace racine
La migration `khadhroony-solana` **ne renomme pas le workspace, le dépôt ni le répertoire racine**.
Pendant toute la série pré-`1.0`, sauf décision ultérieure explicite :
```text
workspace / repository / root directory = khadhroony-bot3
```
Les bibliothèques internes Solana migrent vers `ks-*` / `ks_*` et leurs variables vers `KS_*`, mais elles restent membres du workspace `khadhroony-bot3`. Un éventuel renommage du workspace racine ne doit pas être entrepris avant `khadhroony-bot3` `1.0` ou une version ultérieure explicitement dédiée à cette opération.
## 3. Frontière des domaines
- `khadhroony-project` : umbrella de projets de trading et/ou crypto, pouvant aussi contenir des projets de trading non crypto comme de futurs `khadhroony-xtb` ou `khadhroony-mt5` ;
- `khadhroony-solana` : bibliothèques généralistes dédiées à Solana et réutilisables par plusieurs applications ;
- `khadhroony-bot3` : workspace applicatif actuel et futur robot de trading consommant les composants `khadhroony-solana` ;
- `kb-app-demo-desktop` : application du workspace Bot, actuellement banc de validation des composants Solana mais susceptible d'accueillir plus tard des démonstrations propres au bot.
`ks-pipeline-demo-scenarios` appartient bien à `khadhroony-solana` : ses scénarios qualifient les composants Solana et ne dépendent pas d'une stratégie de trading Bot.
## 4. Inventaire des crates et ordre de migration
| Package actuel | Identifiant Rust actuel | Package cible | Identifiant Rust cible | Dépendances workspace directes actuelles | Ordre |
|------------------------------|------------------------------|------------------------------|------------------------------|----------------------------------------------------------------------------------------------------|------:|
| `kb-core` | `kb_core` | `ks-core` | `ks_core` | — | 1 |
| `kb-program-ids` | `kb_program_ids` | `ks-program-ids` | `ks_program_ids` | — | 2 |
| `kb-config` | `kb_config` | `ks-config` | `ks_config` | kb-core | 3 |
| `kb-logging` | `kb_logging` | `ks-logging` | `ks_logging` | kb-core | 4 |
| `kb-wallet` | `kb_wallet` | `ks-wallet` | `ks_wallet` | kb-core | 5 |
| `kb-lib` | `kb_lib` | `ks-lib` | `ks_lib` | kb-core, kb-program-ids | 6 |
| `kb-onchain-transport` | `kb_onchain_transport` | `ks-onchain-transport` | `ks_onchain_transport` | kb-config, kb-core, kb-lib | 7 |
| `kb-store` | `kb_store` | `ks-store` | `ks_store` | kb-core, kb-lib | 8 |
| `kb-pipeline` | `kb_pipeline` | `ks-pipeline` | `ks_pipeline` | kb-core, kb-config, kb-lib, kb-onchain-transport, kb-program-ids, kb-store | 9 |
| `kb-pipeline-demo-scenarios` | `kb_pipeline_demo_scenarios` | `ks-pipeline-demo-scenarios` | `ks_pipeline_demo_scenarios` | kb-core, kb-config, kb-lib, kb-onchain-transport, kb-pipeline, kb-program-ids, kb-store, kb-wallet | 10 |
`kb-app-demo-desktop` est adapté en dernier, mais garde son package, son répertoire et ses identifiants applicatifs.
`kb-pipeline-demo-scenarios` possède également :
```text
lib : kb_pipeline_demo_scenarios -> ks_pipeline_demo_scenarios
bin : kb-pipeline-demo-scenarios-cli -> ks-pipeline-demo-scenarios-cli
```
### 4.1 Surface textuelle mesurée avant migration
Les valeurs suivantes sont des métriques d'orientation sur les fichiers actifs, hors archives et artefacts générés. Elles montrent qu'un renommage massif en une seule opération serait difficile à diagnostiquer.
| Crate | Références package / fichiers | Références identifiant Rust / fichiers |
|------------------------------|------------------------------:|---------------------------------------:|
| `kb-core` | 51 / 32 | 3165 / 407 |
| `kb-config` | 56 / 33 | 201 / 44 |
| `kb-lib` | 3145 / 550 | 2785 / 97 |
| `kb-logging` | 72 / 27 | 22 / 3 |
| `kb-program-ids` | 42 / 28 | 1413 / 334 |
| `kb-pipeline` | 287 / 112 | 436 / 38 |
| `kb-pipeline-demo-scenarios` | 145 / 75 | 173 / 18 |
| `kb-onchain-transport` | 125 / 56 | 530 / 50 |
| `kb-store` | 157 / 81 | 344 / 30 |
| `kb-wallet` | 75 / 30 | 53 / 17 |
Le volume `kb-lib` inclut notamment les identités techniques `kb-lib.*`; il ne doit pas être interprété comme autant d'importations Cargo.
### 4.2 Tests d'API externe à préserver
- `kb-lib/tests/external_decoder_api.rs` ;
- `kb-lib/tests/external_executor_api.rs` ;
- `kb-lib/tests/external_materializer_api.rs` ;
- `kb-lib/tests/external_metaplex_token_metadata_executor_api.rs` ;
- `kb-lib/tests/external_solana_program_metadata_account_api.rs` ;
- `kb-lib/tests/external_solana_program_metadata_executor_api.rs` ;
- `kb-lib/tests/external_solana_program_metadata_instruction_api.rs` ;
- `kb-lib/tests/external_solana_program_metadata_model_api.rs` ;
- `kb-lib/tests/operation_naming_matrix.rs` ;
- `kb-pipeline/tests/external_metadata_metaplex_token_metadata_pipeline_api.rs` ;
- `kb-pipeline/tests/external_metadata_solana_program_pipeline_api.rs` ;
- `kb-pipeline/tests/external_metadata_token_2022_pipeline_api.rs` ;
- `kb-pipeline-demo-scenarios/tests/external_metadata_solana_program_scenarios_api.rs`.
Les scripts d'audit contenant des références directes aux noms actuels incluent au minimum :
- `scripts/audit_khadhroony_workspace_rules.py` ;
- `scripts/audit_rust_general_rules.py`.
Le renommage doit préserver la sémantique de ces audits, pas seulement les faire compiler.
## 5. Contrats qui suivent le renommage de crate
Le renommage physique `kb-*` -> `ks-*` couvre en `0.5.1` :
- répertoires des dix crates ;
- `workspace.members` ;
- noms `package` Cargo ;
- noms de dépendances workspace et chemins `path` ;
- identifiants Rust `kb_*` -> `ks_*` ;
- nom de la lib et du CLI de `ks-pipeline-demo-scenarios` ;
- imports, exports et tests d'API externe ;
- scripts d'audit et commandes documentées ;
- targets de tracing qui représentent réellement une crate `khadhroony-solana` ;
- bindings TS-RS à la source lorsqu'ils incorporent une identité de crate. Les fichiers générés ne sont pas livrés sans nécessité explicite.
Ne suivent **pas** automatiquement le renommage :
- le workspace/repository/répertoire racine `khadhroony-bot3` ;
- `kb-app-demo-desktop` ;
- les tables SQL `kb_sol_*`, réservées à `0.5.3` -> `k_sol_*` ;
- les éventuelles futures tables Bot `kb_*` ;
- les noms sémantiques qui n'ont jamais été préfixés `kb` et ne représentent pas une identité de crate.
## 6. Identités runtime et persistées
L'inventaire actif contient **256 identités uniques `kb-lib.*`** :
- 118 décodeurs ;
- 113 exécuteurs ;
- 25 matérialiseurs.
La règle de migration est :
```text
kb-lib.decoder.<suffix> -> ks-lib-decoder.<suffix>
kb-lib.executor.<suffix> -> ks-lib-executor.<suffix>
kb-lib.materializer.<suffix> -> ks-lib-materializer.<suffix>
```
Cette migration est volontaire avant `0.6.x` : les bases peuvent encore être reconstruites ou migrées, et conserver des identités `kb-lib.*` créerait une dette durable dans les replays, diagnostics et données persistées.
Les `processor_name` sémantiques déjà indépendants du préfixe de crate, par exemple `materializer.admin` ou `materializer.trades`, **ne doivent pas recevoir artificiellement un préfixe `ks-lib-`**. Seules les identités effectivement `kb`-namespacées migrent.
Les targets de tracing de crates génériques doivent également migrer vers `ks-*`. Les routes de logging doivent être mises à jour dans la même prerelease afin qu'un changement de target ne rende aucune sortie silencieuse.
### 6.1 Inventaire exhaustif des identités `kb-lib.*`
| Identité actuelle | Identité cible |
|----------------------------------------------------------------|----------------------------------------------------------------|
| `kb-lib.decoder.adapter.saber_decimal_wrapper` | `ks-lib-decoder.adapter.saber_decimal_wrapper` |
| `kb-lib.decoder.adapter.spl_token_wrap` | `ks-lib-decoder.adapter.spl_token_wrap` |
| `kb-lib.decoder.admin.jupiter_lock` | `ks-lib-decoder.admin.jupiter_lock` |
| `kb-lib.decoder.admin.pump_fees` | `ks-lib-decoder.admin.pump_fees` |
| `kb-lib.decoder.amm.aldrin_v1` | `ks-lib-decoder.amm.aldrin_v1` |
| `kb-lib.decoder.amm.aldrin_v2` | `ks-lib-decoder.amm.aldrin_v2` |
| `kb-lib.decoder.amm.alphaq` | `ks-lib-decoder.amm.alphaq` |
| `kb-lib.decoder.amm.believe` | `ks-lib-decoder.amm.believe` |
| `kb-lib.decoder.amm.bonk_swap` | `ks-lib-decoder.amm.bonk_swap` |
| `kb-lib.decoder.amm.fluxbeam` | `ks-lib-decoder.amm.fluxbeam` |
| `kb-lib.decoder.amm.goon_fi` | `ks-lib-decoder.amm.goon_fi` |
| `kb-lib.decoder.amm.goosefx_gamma` | `ks-lib-decoder.amm.goosefx_gamma` |
| `kb-lib.decoder.amm.goosefx_v2` | `ks-lib-decoder.amm.goosefx_v2` |
| `kb-lib.decoder.amm.guac_swap` | `ks-lib-decoder.amm.guac_swap` |
| `kb-lib.decoder.amm.lifinity_swap_v2` | `ks-lib-decoder.amm.lifinity_swap_v2` |
| `kb-lib.decoder.amm.metadao_futarchy_amm` | `ks-lib-decoder.amm.metadao_futarchy_amm` |
| `kb-lib.decoder.amm.metadao_v0_5` | `ks-lib-decoder.amm.metadao_v0_5` |
| `kb-lib.decoder.amm.meteora_damm_v1` | `ks-lib-decoder.amm.meteora_damm_v1` |
| `kb-lib.decoder.amm.meteora_damm_v2` | `ks-lib-decoder.amm.meteora_damm_v2` |
| `kb-lib.decoder.amm.obric_v2` | `ks-lib-decoder.amm.obric_v2` |
| `kb-lib.decoder.amm.one_dex` | `ks-lib-decoder.amm.one_dex` |
| `kb-lib.decoder.amm.pump_swap` | `ks-lib-decoder.amm.pump_swap` |
| `kb-lib.decoder.amm.raydium_lp_v4` | `ks-lib-decoder.amm.raydium_lp_v4` |
| `kb-lib.decoder.amm.solfi` | `ks-lib-decoder.amm.solfi` |
| `kb-lib.decoder.amm.solfi_v2` | `ks-lib-decoder.amm.solfi_v2` |
| `kb-lib.decoder.amm.vertigo` | `ks-lib-decoder.amm.vertigo` |
| `kb-lib.decoder.amm.virtuals` | `ks-lib-decoder.amm.virtuals` |
| `kb-lib.decoder.amm.woofi` | `ks-lib-decoder.amm.woofi` |
| `kb-lib.decoder.amm.zero_fi` | `ks-lib-decoder.amm.zero_fi` |
| `kb-lib.decoder.amm.zora` | `ks-lib-decoder.amm.zora` |
| `kb-lib.decoder.anchor` | `ks-lib-decoder.anchor` |
| `kb-lib.decoder.api` | `ks-lib-decoder.api` |
| `kb-lib.decoder.bridge.circle_cctp_token_messenger_minter` | `ks-lib-decoder.bridge.circle_cctp_token_messenger_minter` |
| `kb-lib.decoder.bridge.circle_cctp_token_messenger_minter_v2` | `ks-lib-decoder.bridge.circle_cctp_token_messenger_minter_v2` |
| `kb-lib.decoder.bridge.layer_zero_endpoint` | `ks-lib-decoder.bridge.layer_zero_endpoint` |
| `kb-lib.decoder.bridge.layer_zero_executor` | `ks-lib-decoder.bridge.layer_zero_executor` |
| `kb-lib.decoder.clmm.byreal` | `ks-lib-decoder.clmm.byreal` |
| `kb-lib.decoder.clmm.fusion` | `ks-lib-decoder.clmm.fusion` |
| `kb-lib.decoder.clmm.orca_whirlpool` | `ks-lib-decoder.clmm.orca_whirlpool` |
| `kb-lib.decoder.clmm.pancake_swap` | `ks-lib-decoder.clmm.pancake_swap` |
| `kb-lib.decoder.clmm.raydium` | `ks-lib-decoder.clmm.raydium` |
| `kb-lib.decoder.clmm.stabble` | `ks-lib-decoder.clmm.stabble` |
| `kb-lib.decoder.cpmm.raydium` | `ks-lib-decoder.cpmm.raydium` |
| `kb-lib.decoder.dlmm.meteora` | `ks-lib-decoder.dlmm.meteora` |
| `kb-lib.decoder.fees.bags_fee_share_v1` | `ks-lib-decoder.fees.bags_fee_share_v1` |
| `kb-lib.decoder.fees.bags_fee_share_v2` | `ks-lib-decoder.fees.bags_fee_share_v2` |
| `kb-lib.decoder.fees.pump_fees` | `ks-lib-decoder.fees.pump_fees` |
| `kb-lib.decoder.governance.metadao_bid_wall` | `ks-lib-decoder.governance.metadao_bid_wall` |
| `kb-lib.decoder.governance.metadao_futarchy` | `ks-lib-decoder.governance.metadao_futarchy` |
| `kb-lib.decoder.governance.squads_multisig` | `ks-lib-decoder.governance.squads_multisig` |
| `kb-lib.decoder.launchpad.boop_fun` | `ks-lib-decoder.launchpad.boop_fun` |
| `kb-lib.decoder.launchpad.metadao_ico` | `ks-lib-decoder.launchpad.metadao_ico` |
| `kb-lib.decoder.launchpad.meteora_dbc` | `ks-lib-decoder.launchpad.meteora_dbc` |
| `kb-lib.decoder.launchpad.moonit` | `ks-lib-decoder.launchpad.moonit` |
| `kb-lib.decoder.launchpad.orca_wavebreak` | `ks-lib-decoder.launchpad.orca_wavebreak` |
| `kb-lib.decoder.launchpad.printr` | `ks-lib-decoder.launchpad.printr` |
| `kb-lib.decoder.launchpad.pump_fun` | `ks-lib-decoder.launchpad.pump_fun` |
| `kb-lib.decoder.launchpad.pump_pumpup_ai` | `ks-lib-decoder.launchpad.pump_pumpup_ai` |
| `kb-lib.decoder.launchpad.raydium_launchlab` | `ks-lib-decoder.launchpad.raydium_launchlab` |
| `kb-lib.decoder.launchpad.virtuals` | `ks-lib-decoder.launchpad.virtuals` |
| `kb-lib.decoder.lending.clone` | `ks-lib-decoder.lending.clone` |
| `kb-lib.decoder.lending.jupiter_lend_borrow` | `ks-lib-decoder.lending.jupiter_lend_borrow` |
| `kb-lib.decoder.lending.jupiter_lend_earn` | `ks-lib-decoder.lending.jupiter_lend_earn` |
| `kb-lib.decoder.lending.jupiter_lend_flash_loan` | `ks-lib-decoder.lending.jupiter_lend_flash_loan` |
| `kb-lib.decoder.lending.jupiter_lend_liquidity` | `ks-lib-decoder.lending.jupiter_lend_liquidity` |
| `kb-lib.decoder.lending.kamino` | `ks-lib-decoder.lending.kamino` |
| `kb-lib.decoder.lending.marginfi_v2` | `ks-lib-decoder.lending.marginfi_v2` |
| `kb-lib.decoder.lock.raydium_lp` | `ks-lib-decoder.lock.raydium_lp` |
| `kb-lib.decoder.metadata.metaplex_token_metadata` | `ks-lib-decoder.metadata.metaplex_token_metadata` |
| `kb-lib.decoder.metadata.solana_program_metadata` | `ks-lib-decoder.metadata.solana_program_metadata` |
| `kb-lib.decoder.metadata.spl_name_service` | `ks-lib-decoder.metadata.spl_name_service` |
| `kb-lib.decoder.nft.metaplex_bubblegum` | `ks-lib-decoder.nft.metaplex_bubblegum` |
| `kb-lib.decoder.nft.tensor_cnft` | `ks-lib-decoder.nft.tensor_cnft` |
| `kb-lib.decoder.orderbook.jupiter_limit_order` | `ks-lib-decoder.orderbook.jupiter_limit_order` |
| `kb-lib.decoder.orderbook.jupiter_limit_order_v2` | `ks-lib-decoder.orderbook.jupiter_limit_order_v2` |
| `kb-lib.decoder.orderbook.openbook_v2` | `ks-lib-decoder.orderbook.openbook_v2` |
| `kb-lib.decoder.perpetuals.drift_v2` | `ks-lib-decoder.perpetuals.drift_v2` |
| `kb-lib.decoder.perpetuals.jupiter` | `ks-lib-decoder.perpetuals.jupiter` |
| `kb-lib.decoder.perpetuals.phoenix_eternal` | `ks-lib-decoder.perpetuals.phoenix_eternal` |
| `kb-lib.decoder.perpetuals.zeta` | `ks-lib-decoder.perpetuals.zeta` |
| `kb-lib.decoder.router.dflow_aggregator_v4` | `ks-lib-decoder.router.dflow_aggregator_v4` |
| `kb-lib.decoder.router.jupiter_aggregator_v4` | `ks-lib-decoder.router.jupiter_aggregator_v4` |
| `kb-lib.decoder.router.jupiter_aggregator_v6` | `ks-lib-decoder.router.jupiter_aggregator_v6` |
| `kb-lib.decoder.router.jupiter_dca` | `ks-lib-decoder.router.jupiter_dca` |
| `kb-lib.decoder.router.okx_labs_v1` | `ks-lib-decoder.router.okx_labs_v1` |
| `kb-lib.decoder.router.okx_labs_v2` | `ks-lib-decoder.router.okx_labs_v2` |
| `kb-lib.decoder.rwa.ondo_global_markets` | `ks-lib-decoder.rwa.ondo_global_markets` |
| `kb-lib.decoder.solana.core` | `ks-lib-decoder.solana.core` |
| `kb-lib.decoder.spl.account_compression` | `ks-lib-decoder.spl.account_compression` |
| `kb-lib.decoder.spl.associated_token_account` | `ks-lib-decoder.spl.associated_token_account` |
| `kb-lib.decoder.spl.elgamal_registry` | `ks-lib-decoder.spl.elgamal_registry` |
| `kb-lib.decoder.spl.memo` | `ks-lib-decoder.spl.memo` |
| `kb-lib.decoder.spl.noop` | `ks-lib-decoder.spl.noop` |
| `kb-lib.decoder.spl.single_pool` | `ks-lib-decoder.spl.single_pool` |
| `kb-lib.decoder.spl.stake_pool` | `ks-lib-decoder.spl.stake_pool` |
| `kb-lib.decoder.spl.token` | `ks-lib-decoder.spl.token` |
| `kb-lib.decoder.spl.token_2022` | `ks-lib-decoder.spl.token_2022` |
| `kb-lib.decoder.stable.swap_hylo_exchange` | `ks-lib-decoder.stable.swap_hylo_exchange` |
| `kb-lib.decoder.stable.swap_jupiter_stable` | `ks-lib-decoder.stable.swap_jupiter_stable` |
| `kb-lib.decoder.stable.swap_numeraire` | `ks-lib-decoder.stable.swap_numeraire` |
| `kb-lib.decoder.stable.swap_stabble` | `ks-lib-decoder.stable.swap_stabble` |
| `kb-lib.decoder.staking.jito_tip_distribution` | `ks-lib-decoder.staking.jito_tip_distribution` |
| `kb-lib.decoder.staking.kamino_farm` | `ks-lib-decoder.staking.kamino_farm` |
| `kb-lib.decoder.staking.marinade_finance` | `ks-lib-decoder.staking.marinade_finance` |
| `kb-lib.decoder.staking.solayer` | `ks-lib-decoder.staking.solayer` |
| `kb-lib.decoder.storage.solana_record` | `ks-lib-decoder.storage.solana_record` |
| `kb-lib.decoder.strategy.jupiter_dca` | `ks-lib-decoder.strategy.jupiter_dca` |
| `kb-lib.decoder.treasury.helium_treasury_management` | `ks-lib-decoder.treasury.helium_treasury_management` |
| `kb-lib.decoder.vault.carrot_defi` | `ks-lib-decoder.vault.carrot_defi` |
| `kb-lib.decoder.vault.hylo_stability_pool` | `ks-lib-decoder.vault.hylo_stability_pool` |
| `kb-lib.decoder.vault.kamino` | `ks-lib-decoder.vault.kamino` |
| `kb-lib.decoder.vault.kamino_v2` | `ks-lib-decoder.vault.kamino_v2` |
| `kb-lib.decoder.vault.kamino_yvaults` | `ks-lib-decoder.vault.kamino_yvaults` |
| `kb-lib.decoder.vault.meteora` | `ks-lib-decoder.vault.meteora` |
| `kb-lib.decoder.vesting.jupiter_lock` | `ks-lib-decoder.vesting.jupiter_lock` |
| `kb-lib.decoder.vesting.streamflow` | `ks-lib-decoder.vesting.streamflow` |
| `kb-lib.decoder.wallet.jupiter_apepro_smart_wallet` | `ks-lib-decoder.wallet.jupiter_apepro_smart_wallet` |
| `kb-lib.decoder.weighted.swap_stabble` | `ks-lib-decoder.weighted.swap_stabble` |
| `kb-lib.executor.adapter.saber_decimal_wrapper` | `ks-lib-executor.adapter.saber_decimal_wrapper` |
| `kb-lib.executor.adapter.spl_token_wrap` | `ks-lib-executor.adapter.spl_token_wrap` |
| `kb-lib.executor.amm.aldrin_v1` | `ks-lib-executor.amm.aldrin_v1` |
| `kb-lib.executor.amm.aldrin_v2` | `ks-lib-executor.amm.aldrin_v2` |
| `kb-lib.executor.amm.alphaq` | `ks-lib-executor.amm.alphaq` |
| `kb-lib.executor.amm.believe` | `ks-lib-executor.amm.believe` |
| `kb-lib.executor.amm.bonk_swap` | `ks-lib-executor.amm.bonk_swap` |
| `kb-lib.executor.amm.fluxbeam` | `ks-lib-executor.amm.fluxbeam` |
| `kb-lib.executor.amm.goon_fi` | `ks-lib-executor.amm.goon_fi` |
| `kb-lib.executor.amm.goosefx_gamma` | `ks-lib-executor.amm.goosefx_gamma` |
| `kb-lib.executor.amm.goosefx_v2` | `ks-lib-executor.amm.goosefx_v2` |
| `kb-lib.executor.amm.guac_swap` | `ks-lib-executor.amm.guac_swap` |
| `kb-lib.executor.amm.lifinity_swap_v2` | `ks-lib-executor.amm.lifinity_swap_v2` |
| `kb-lib.executor.amm.metadao_v0_5` | `ks-lib-executor.amm.metadao_v0_5` |
| `kb-lib.executor.amm.meteora_damm_v1` | `ks-lib-executor.amm.meteora_damm_v1` |
| `kb-lib.executor.amm.meteora_damm_v2` | `ks-lib-executor.amm.meteora_damm_v2` |
| `kb-lib.executor.amm.obric_v2` | `ks-lib-executor.amm.obric_v2` |
| `kb-lib.executor.amm.one_dex` | `ks-lib-executor.amm.one_dex` |
| `kb-lib.executor.amm.pump_swap` | `ks-lib-executor.amm.pump_swap` |
| `kb-lib.executor.amm.raydium_lp_v4` | `ks-lib-executor.amm.raydium_lp_v4` |
| `kb-lib.executor.amm.solfi` | `ks-lib-executor.amm.solfi` |
| `kb-lib.executor.amm.solfi_v2` | `ks-lib-executor.amm.solfi_v2` |
| `kb-lib.executor.amm.vertigo` | `ks-lib-executor.amm.vertigo` |
| `kb-lib.executor.amm.woofi` | `ks-lib-executor.amm.woofi` |
| `kb-lib.executor.amm.zero_fi` | `ks-lib-executor.amm.zero_fi` |
| `kb-lib.executor.amm.zora` | `ks-lib-executor.amm.zora` |
| `kb-lib.executor.bridge.circle_cctp_token_messenger_minter` | `ks-lib-executor.bridge.circle_cctp_token_messenger_minter` |
| `kb-lib.executor.bridge.circle_cctp_token_messenger_minter_v2` | `ks-lib-executor.bridge.circle_cctp_token_messenger_minter_v2` |
| `kb-lib.executor.bridge.layer_zero_endpoint` | `ks-lib-executor.bridge.layer_zero_endpoint` |
| `kb-lib.executor.bridge.layer_zero_executor` | `ks-lib-executor.bridge.layer_zero_executor` |
| `kb-lib.executor.clmm.byreal` | `ks-lib-executor.clmm.byreal` |
| `kb-lib.executor.clmm.fusion` | `ks-lib-executor.clmm.fusion` |
| `kb-lib.executor.clmm.orca_whirlpool` | `ks-lib-executor.clmm.orca_whirlpool` |
| `kb-lib.executor.clmm.pancake_swap` | `ks-lib-executor.clmm.pancake_swap` |
| `kb-lib.executor.clmm.raydium` | `ks-lib-executor.clmm.raydium` |
| `kb-lib.executor.clmm.stabble` | `ks-lib-executor.clmm.stabble` |
| `kb-lib.executor.cpmm.raydium` | `ks-lib-executor.cpmm.raydium` |
| `kb-lib.executor.dlmm.meteora` | `ks-lib-executor.dlmm.meteora` |
| `kb-lib.executor.fees.bags_fee_share_v1` | `ks-lib-executor.fees.bags_fee_share_v1` |
| `kb-lib.executor.fees.bags_fee_share_v2` | `ks-lib-executor.fees.bags_fee_share_v2` |
| `kb-lib.executor.fees.pump_fees` | `ks-lib-executor.fees.pump_fees` |
| `kb-lib.executor.governance.metadao_bid_wall` | `ks-lib-executor.governance.metadao_bid_wall` |
| `kb-lib.executor.governance.metadao_futarchy` | `ks-lib-executor.governance.metadao_futarchy` |
| `kb-lib.executor.governance.squads_multisig` | `ks-lib-executor.governance.squads_multisig` |
| `kb-lib.executor.launchpad.boop_fun` | `ks-lib-executor.launchpad.boop_fun` |
| `kb-lib.executor.launchpad.metadao_ico` | `ks-lib-executor.launchpad.metadao_ico` |
| `kb-lib.executor.launchpad.meteora_dbc` | `ks-lib-executor.launchpad.meteora_dbc` |
| `kb-lib.executor.launchpad.moonit` | `ks-lib-executor.launchpad.moonit` |
| `kb-lib.executor.launchpad.orca_wavebreak` | `ks-lib-executor.launchpad.orca_wavebreak` |
| `kb-lib.executor.launchpad.printr` | `ks-lib-executor.launchpad.printr` |
| `kb-lib.executor.launchpad.pump_fun` | `ks-lib-executor.launchpad.pump_fun` |
| `kb-lib.executor.launchpad.pump_pumpup_ai` | `ks-lib-executor.launchpad.pump_pumpup_ai` |
| `kb-lib.executor.launchpad.raydium_launchlab` | `ks-lib-executor.launchpad.raydium_launchlab` |
| `kb-lib.executor.launchpad.virtuals` | `ks-lib-executor.launchpad.virtuals` |
| `kb-lib.executor.lending.clone` | `ks-lib-executor.lending.clone` |
| `kb-lib.executor.lending.jupiter_lend_borrow` | `ks-lib-executor.lending.jupiter_lend_borrow` |
| `kb-lib.executor.lending.jupiter_lend_earn` | `ks-lib-executor.lending.jupiter_lend_earn` |
| `kb-lib.executor.lending.jupiter_lend_flash_loan` | `ks-lib-executor.lending.jupiter_lend_flash_loan` |
| `kb-lib.executor.lending.jupiter_lend_liquidity` | `ks-lib-executor.lending.jupiter_lend_liquidity` |
| `kb-lib.executor.lending.kamino` | `ks-lib-executor.lending.kamino` |
| `kb-lib.executor.lending.marginfi_v2` | `ks-lib-executor.lending.marginfi_v2` |
| `kb-lib.executor.lock.raydium_lp` | `ks-lib-executor.lock.raydium_lp` |
| `kb-lib.executor.metadata.metaplex_token_metadata` | `ks-lib-executor.metadata.metaplex_token_metadata` |
| `kb-lib.executor.metadata.solana_program_metadata` | `ks-lib-executor.metadata.solana_program_metadata` |
| `kb-lib.executor.metadata.spl_name_service` | `ks-lib-executor.metadata.spl_name_service` |
| `kb-lib.executor.nft.metaplex_bubblegum` | `ks-lib-executor.nft.metaplex_bubblegum` |
| `kb-lib.executor.nft.tensor_cnft` | `ks-lib-executor.nft.tensor_cnft` |
| `kb-lib.executor.orderbook.jupiter_limit_order` | `ks-lib-executor.orderbook.jupiter_limit_order` |
| `kb-lib.executor.orderbook.jupiter_limit_order_v2` | `ks-lib-executor.orderbook.jupiter_limit_order_v2` |
| `kb-lib.executor.orderbook.openbook_v2` | `ks-lib-executor.orderbook.openbook_v2` |
| `kb-lib.executor.perpetuals.drift_v2` | `ks-lib-executor.perpetuals.drift_v2` |
| `kb-lib.executor.perpetuals.jupiter` | `ks-lib-executor.perpetuals.jupiter` |
| `kb-lib.executor.perpetuals.phoenix_eternal` | `ks-lib-executor.perpetuals.phoenix_eternal` |
| `kb-lib.executor.perpetuals.zeta` | `ks-lib-executor.perpetuals.zeta` |
| `kb-lib.executor.router.dflow_aggregator_v4` | `ks-lib-executor.router.dflow_aggregator_v4` |
| `kb-lib.executor.router.jupiter_aggregator_v4` | `ks-lib-executor.router.jupiter_aggregator_v4` |
| `kb-lib.executor.router.jupiter_aggregator_v6` | `ks-lib-executor.router.jupiter_aggregator_v6` |
| `kb-lib.executor.router.okx_labs_v1` | `ks-lib-executor.router.okx_labs_v1` |
| `kb-lib.executor.router.okx_labs_v2` | `ks-lib-executor.router.okx_labs_v2` |
| `kb-lib.executor.rwa.ondo_global_markets` | `ks-lib-executor.rwa.ondo_global_markets` |
| `kb-lib.executor.solana.core` | `ks-lib-executor.solana.core` |
| `kb-lib.executor.solana.transaction` | `ks-lib-executor.solana.transaction` |
| `kb-lib.executor.spl.account_compression` | `ks-lib-executor.spl.account_compression` |
| `kb-lib.executor.spl.associated_token_account` | `ks-lib-executor.spl.associated_token_account` |
| `kb-lib.executor.spl.elgamal_registry` | `ks-lib-executor.spl.elgamal_registry` |
| `kb-lib.executor.spl.memo` | `ks-lib-executor.spl.memo` |
| `kb-lib.executor.spl.noop` | `ks-lib-executor.spl.noop` |
| `kb-lib.executor.spl.single_pool` | `ks-lib-executor.spl.single_pool` |
| `kb-lib.executor.spl.stake_pool` | `ks-lib-executor.spl.stake_pool` |
| `kb-lib.executor.spl.token` | `ks-lib-executor.spl.token` |
| `kb-lib.executor.spl.token-2022` | `ks-lib-executor.spl.token-2022` |
| `kb-lib.executor.spl.token_2022` | `ks-lib-executor.spl.token_2022` |
| `kb-lib.executor.stable.swap_hylo_exchange` | `ks-lib-executor.stable.swap_hylo_exchange` |
| `kb-lib.executor.stable.swap_jupiter_stable` | `ks-lib-executor.stable.swap_jupiter_stable` |
| `kb-lib.executor.stable.swap_numeraire` | `ks-lib-executor.stable.swap_numeraire` |
| `kb-lib.executor.stable.swap_stabble` | `ks-lib-executor.stable.swap_stabble` |
| `kb-lib.executor.staking.jito_tip_distribution` | `ks-lib-executor.staking.jito_tip_distribution` |
| `kb-lib.executor.staking.kamino_farm` | `ks-lib-executor.staking.kamino_farm` |
| `kb-lib.executor.staking.marinade_finance` | `ks-lib-executor.staking.marinade_finance` |
| `kb-lib.executor.staking.solayer` | `ks-lib-executor.staking.solayer` |
| `kb-lib.executor.storage.solana_record` | `ks-lib-executor.storage.solana_record` |
| `kb-lib.executor.strategy.jupiter_dca` | `ks-lib-executor.strategy.jupiter_dca` |
| `kb-lib.executor.treasury.helium_treasury_management` | `ks-lib-executor.treasury.helium_treasury_management` |
| `kb-lib.executor.vault.carrot_defi` | `ks-lib-executor.vault.carrot_defi` |
| `kb-lib.executor.vault.hylo_stability_pool` | `ks-lib-executor.vault.hylo_stability_pool` |
| `kb-lib.executor.vault.kamino` | `ks-lib-executor.vault.kamino` |
| `kb-lib.executor.vault.kamino_v2` | `ks-lib-executor.vault.kamino_v2` |
| `kb-lib.executor.vault.kamino_yvaults` | `ks-lib-executor.vault.kamino_yvaults` |
| `kb-lib.executor.vault.meteora` | `ks-lib-executor.vault.meteora` |
| `kb-lib.executor.vesting.jupiter_lock` | `ks-lib-executor.vesting.jupiter_lock` |
| `kb-lib.executor.vesting.streamflow` | `ks-lib-executor.vesting.streamflow` |
| `kb-lib.executor.wallet.jupiter_apepro_smart_wallet` | `ks-lib-executor.wallet.jupiter_apepro_smart_wallet` |
| `kb-lib.executor.weighted.swap_stabble` | `ks-lib-executor.weighted.swap_stabble` |
| `kb-lib.materializer.admin` | `ks-lib-materializer.admin` |
| `kb-lib.materializer.bridge` | `ks-lib-materializer.bridge` |
| `kb-lib.materializer.compliance.audit` | `ks-lib-materializer.compliance.audit` |
| `kb-lib.materializer.fees` | `ks-lib-materializer.fees` |
| `kb-lib.materializer.governance` | `ks-lib-materializer.governance` |
| `kb-lib.materializer.lending` | `ks-lib-materializer.lending` |
| `kb-lib.materializer.lifecycle` | `ks-lib-materializer.lifecycle` |
| `kb-lib.materializer.liquidity` | `ks-lib-materializer.liquidity` |
| `kb-lib.materializer.metadata.metaplex_token_metadata` | `ks-lib-materializer.metadata.metaplex_token_metadata` |
| `kb-lib.materializer.metadata.solana_program_metadata` | `ks-lib-materializer.metadata.solana_program_metadata` |
| `kb-lib.materializer.metadata.token_2022` | `ks-lib-materializer.metadata.token_2022` |
| `kb-lib.materializer.nft` | `ks-lib-materializer.nft` |
| `kb-lib.materializer.oracle` | `ks-lib-materializer.oracle` |
| `kb-lib.materializer.orderbook` | `ks-lib-materializer.orderbook` |
| `kb-lib.materializer.perpetuals` | `ks-lib-materializer.perpetuals` |
| `kb-lib.materializer.pool.state` | `ks-lib-materializer.pool.state` |
| `kb-lib.materializer.rewards` | `ks-lib-materializer.rewards` |
| `kb-lib.materializer.risk` | `ks-lib-materializer.risk` |
| `kb-lib.materializer.routing` | `ks-lib-materializer.routing` |
| `kb-lib.materializer.staking` | `ks-lib-materializer.staking` |
| `kb-lib.materializer.token.accounts` | `ks-lib-materializer.token.accounts` |
| `kb-lib.materializer.token.metadata_risk` | `ks-lib-materializer.token.metadata_risk` |
| `kb-lib.materializer.trades` | `ks-lib-materializer.trades` |
| `kb-lib.materializer.transaction.annotations` | `ks-lib-materializer.transaction.annotations` |
| `kb-lib.materializer.vault` | `ks-lib-materializer.vault` |
## 7. Inventaire des variables d'environnement
L'audit distingue trois ensembles afin de ne pas transformer des exemples historiques en contrats runtime :
- **82 noms** actuellement utilisés/référencés par le code, les tests, `.env.example` ou `config/example.config.json` ;
- **17 noms supplémentaires** présents uniquement dans le guide opérateur Devnet actif ;
- soit **99 noms historiques actifs à migrer ou consolider**.
Le chiffre `84` mentionné dans un audit `0.5.0` était une estimation antérieure et ne doit plus être utilisé comme contrat.
`KB_DATABASE_URL`, présent uniquement dans un exemple générique de `kb-config/USAGE.md`, est considéré obsolète et doit être supprimé/corrigé plutôt que migré. `KB_LIB_NOMENCLATURE` est un faux positif documentaire et n'est pas une variable d'environnement.
### 7.1 Politique cible
```text
KS_SECRET_* -> secret absolu, jamais exposé, jamais loggé, jamais diagnostic en clair
KS_PUBLIC_* -> publiable uniquement via un DTO/surface explicitement autorisé
KS_* -> interne, non exposé normalement, diagnostic explicite seulement si non sensible
autre -> interdit pour une variable appartenant au workspace
```
La classification par préfixe est une barrière supplémentaire, pas la seule détection de sensibilité. Une URL `KS_*` contenant après substitution une clé API ou des credentials doit rester classée sensible dans son ensemble.
Aucune variable actuelle ne justifie d'être migrée par défaut en `KS_PUBLIC_*`. La migration part donc d'une politique fail-closed : quatre secrets certains deviennent `KS_SECRET_*`, les autres deviennent internes `KS_*`, puis une surface publique pourra être ajoutée plus tard seulement si son utilité est démontrée.
Secrets certains :
```text
HELIUS_API_KEY -> KS_SECRET_HELIUS_API_KEY
KB_POSTGRES_DEVNET_URL -> KS_SECRET_POSTGRES_DEVNET_URL
KB_POSTGRES_MAINNET_URL -> KS_SECRET_POSTGRES_MAINNET_URL
KB_POSTGRES_TEST_URL -> KS_SECRET_POSTGRES_TEST_URL
```
Les treize variables historiques `TOKEN_2022_*` sont des fixtures Devnet et convergent vers `KS_DEVNET_TOKEN_2022_*`. Lorsque cette convergence rencontre déjà une ancienne variable `KB_DEVNET_TOKEN_2022_*`, l'implémentation doit choisir **une seule variable cible** et détecter les conflits pendant la migration ; aucun double alias permanent n'est conservé.
### 7.2 Mapping code/config/tests — 82 noms
| Nom actuel | Nom cible | Classe |
|--------------------------------------------------------------|--------------------------------------------------------------|------------|
| `HELIUS_API_KEY` | `KS_SECRET_HELIUS_API_KEY` | `secret` |
| `KB_CONFIG_PATH` | `KS_CONFIG_PATH` | `internal` |
| `KB_CONFIG_TEST_MISSING` | `KS_CONFIG_TEST_MISSING` | `internal` |
| `KB_DEVNET_AIRDROP_LAMPORTS` | `KS_DEVNET_AIRDROP_LAMPORTS` | `internal` |
| `KB_DEVNET_CONFIG_PATH` | `KS_DEVNET_CONFIG_PATH` | `internal` |
| `KB_DEVNET_EXECUTION_TEST` | `KS_DEVNET_EXECUTION_TEST` | `internal` |
| `KB_DEVNET_MEMO_EXECUTION_TEST` | `KS_DEVNET_MEMO_EXECUTION_TEST` | `internal` |
| `KB_DEVNET_MEMO_SUBMIT` | `KS_DEVNET_MEMO_SUBMIT` | `internal` |
| `KB_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_COLLECTION_VERIFY_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_CREATE_MINT_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_CREATE_MINT_FAMILY` | `KS_DEVNET_METAPLEX_CREATE_MINT_FAMILY` | `internal` |
| `KB_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_ESCROW_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_EXECUTION_TEST` | `KS_DEVNET_METAPLEX_EXECUTION_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_MAINTENANCE_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION` | `KS_DEVNET_METAPLEX_MATERIALIZE_AFTER_CONFIRMATION` | `internal` |
| `KB_DEVNET_METAPLEX_OPERATION_JSON` | `KS_DEVNET_METAPLEX_OPERATION_JSON` | `internal` |
| `KB_DEVNET_METAPLEX_OPERATOR_CONFIRMED` | `KS_DEVNET_METAPLEX_OPERATOR_CONFIRMED` | `internal` |
| `KB_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_PNFT_LIFECYCLE_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_POSTCONDITION_READS_JSON` | `KS_DEVNET_METAPLEX_POSTCONDITION_READS_JSON` | `internal` |
| `KB_DEVNET_METAPLEX_PREFLIGHT_READS_JSON` | `KS_DEVNET_METAPLEX_PREFLIGHT_READS_JSON` | `internal` |
| `KB_DEVNET_METAPLEX_PRINT_BURN_CAMPAIGN_TEST` | `KS_DEVNET_METAPLEX_PRINT_BURN_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_METAPLEX_SUBMIT` | `KS_DEVNET_METAPLEX_SUBMIT` | `internal` |
| `KB_DEVNET_METAPLEX_USE_PROBE_TEST` | `KS_DEVNET_METAPLEX_USE_PROBE_TEST` | `internal` |
| `KB_DEVNET_PROFILE` | `KS_DEVNET_PROFILE` | `internal` |
| `KB_DEVNET_RPC_URL` | `KS_DEVNET_RPC_URL` | `internal` |
| `KB_DEVNET_SPL_ATA_EXECUTION_TEST` | `KS_DEVNET_SPL_ATA_EXECUTION_TEST` | `internal` |
| `KB_DEVNET_SPL_ATA_MINT` | `KS_DEVNET_SPL_ATA_MINT` | `internal` |
| `KB_DEVNET_SPL_ATA_NESTED_MINT` | `KS_DEVNET_SPL_ATA_NESTED_MINT` | `internal` |
| `KB_DEVNET_SPL_ATA_OPERATION` | `KS_DEVNET_SPL_ATA_OPERATION` | `internal` |
| `KB_DEVNET_SPL_ATA_OWNER_MINT` | `KS_DEVNET_SPL_ATA_OWNER_MINT` | `internal` |
| `KB_DEVNET_SPL_ATA_SUBMIT` | `KS_DEVNET_SPL_ATA_SUBMIT` | `internal` |
| `KB_DEVNET_SPL_ATA_TOKEN_PROGRAM` | `KS_DEVNET_SPL_ATA_TOKEN_PROGRAM` | `internal` |
| `KB_DEVNET_SPL_TOKEN_AMOUNT` | `KS_DEVNET_SPL_TOKEN_AMOUNT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_AUTHORITY` | `KS_DEVNET_SPL_TOKEN_AUTHORITY` | `internal` |
| `KB_DEVNET_SPL_TOKEN_DECIMALS` | `KS_DEVNET_SPL_TOKEN_DECIMALS` | `internal` |
| `KB_DEVNET_SPL_TOKEN_DESTINATION` | `KS_DEVNET_SPL_TOKEN_DESTINATION` | `internal` |
| `KB_DEVNET_SPL_TOKEN_EXECUTION_TEST` | `KS_DEVNET_SPL_TOKEN_EXECUTION_TEST` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_APPROVE_AMOUNT` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_APPROVE_AMOUNT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_AUTHORITY` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_AUTHORITY` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_DECIMALS` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_DECIMALS` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_DELEGATE` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_DELEGATE` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_DESTINATION` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_DESTINATION` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_FIRST_STEP_INDEX` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_FIRST_STEP_INDEX` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_INTER_STEP_DELAY_MS` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_INTER_STEP_DELAY_MS` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_MINT` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_MINT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_MINT_AMOUNT` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_MINT_AMOUNT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARATION_SETTLE_DELAY_MS` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARATION_SETTLE_DELAY_MS` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARE` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_PREPARE` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_RESUME_PREDECESSOR_SIGNATURE` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_RESUME_PREDECESSOR_SIGNATURE` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_SOURCE` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_SOURCE` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_SUBMIT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_TEST` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_TEST` | `internal` |
| `KB_DEVNET_SPL_TOKEN_LIFECYCLE_TRANSFER_AMOUNT` | `KS_DEVNET_SPL_TOKEN_LIFECYCLE_TRANSFER_AMOUNT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_MINT` | `KS_DEVNET_SPL_TOKEN_MINT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_NATIVE_ACCOUNT` | `KS_DEVNET_SPL_TOKEN_NATIVE_ACCOUNT` | `internal` |
| `KB_DEVNET_SPL_TOKEN_PREFLIGHT_TEST` | `KS_DEVNET_SPL_TOKEN_PREFLIGHT_TEST` | `internal` |
| `KB_DEVNET_SPL_TOKEN_RECENT_PROBE_TEST` | `KS_DEVNET_SPL_TOKEN_RECENT_PROBE_TEST` | `internal` |
| `KB_DEVNET_SPL_TOKEN_SOURCE` | `KS_DEVNET_SPL_TOKEN_SOURCE` | `internal` |
| `KB_DEVNET_SPL_TOKEN_SUBMIT` | `KS_DEVNET_SPL_TOKEN_SUBMIT` | `internal` |
| `KB_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST` | `KS_DEVNET_TOKEN_2022_METADATA_CAMPAIGN_TEST` | `internal` |
| `KB_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED` | `KS_DEVNET_TOKEN_2022_METADATA_OPERATOR_CONFIRMED` | `internal` |
| `KB_DEVNET_TRANSFER_LAMPORTS` | `KS_DEVNET_TRANSFER_LAMPORTS` | `internal` |
| `KB_DEVNET_WALLET` | `KS_DEVNET_WALLET` | `internal` |
| `KB_DEVNET_WALLET_ADDRESS` | `KS_DEVNET_WALLET_ADDRESS` | `internal` |
| `KB_DEVNET_WALLET_DIR` | `KS_DEVNET_WALLET_DIR` | `internal` |
| `KB_ENV_FILE` | `KS_ENV_FILE` | `internal` |
| `KB_POSTGRES_DEVNET_URL` | `KS_SECRET_POSTGRES_DEVNET_URL` | `secret` |
| `KB_POSTGRES_MAINNET_URL` | `KS_SECRET_POSTGRES_MAINNET_URL` | `secret` |
| `KB_POSTGRES_TEST_URL` | `KS_SECRET_POSTGRES_TEST_URL` | `secret` |
| `TOKEN_2022_APPROVE_AMOUNT_RAW` | `KS_DEVNET_TOKEN_2022_APPROVE_AMOUNT_RAW` | `internal` |
| `TOKEN_2022_AUTHORITY` | `KS_DEVNET_TOKEN_2022_AUTHORITY` | `internal` |
| `TOKEN_2022_BURN_AMOUNT_RAW` | `KS_DEVNET_TOKEN_2022_BURN_AMOUNT_RAW` | `internal` |
| `TOKEN_2022_CLOSE_ACCOUNT` | `KS_DEVNET_TOKEN_2022_CLOSE_ACCOUNT` | `internal` |
| `TOKEN_2022_DECIMALS` | `KS_DEVNET_TOKEN_2022_DECIMALS` | `internal` |
| `TOKEN_2022_DELEGATE` | `KS_DEVNET_TOKEN_2022_DELEGATE` | `internal` |
| `TOKEN_2022_DESTINATION` | `KS_DEVNET_TOKEN_2022_DESTINATION` | `internal` |
| `TOKEN_2022_FREEZE_AUTHORITY` | `KS_DEVNET_TOKEN_2022_FREEZE_AUTHORITY` | `internal` |
| `TOKEN_2022_MINT` | `KS_DEVNET_TOKEN_2022_MINT` | `internal` |
| `TOKEN_2022_MINT_AMOUNT_RAW` | `KS_DEVNET_TOKEN_2022_MINT_AMOUNT_RAW` | `internal` |
| `TOKEN_2022_PROGRAM` | `KS_DEVNET_TOKEN_2022_PROGRAM` | `internal` |
| `TOKEN_2022_SOURCE` | `KS_DEVNET_TOKEN_2022_SOURCE` | `internal` |
| `TOKEN_2022_TRANSFER_AMOUNT_RAW` | `KS_DEVNET_TOKEN_2022_TRANSFER_AMOUNT_RAW` | `internal` |
### 7.3 Mapping guide opérateur Devnet — 17 noms
| Nom actuel | Nom cible | Classe |
|---------------------------------------|---------------------------------------|------------|
| `KB_CONFIRM_DEVNET_DATABASE_RESET` | `KS_CONFIRM_DEVNET_DATABASE_RESET` | `internal` |
| `KB_DEVNET_CLASSIC_DESTINATION_ATA` | `KS_DEVNET_CLASSIC_DESTINATION_ATA` | `internal` |
| `KB_DEVNET_CLASSIC_MINT` | `KS_DEVNET_CLASSIC_MINT` | `internal` |
| `KB_DEVNET_CLASSIC_MINT_KEYPAIR` | `KS_DEVNET_CLASSIC_MINT_KEYPAIR` | `internal` |
| `KB_DEVNET_CLASSIC_RECIPIENT` | `KS_DEVNET_CLASSIC_RECIPIENT` | `internal` |
| `KB_DEVNET_CLASSIC_RECIPIENT_KEYPAIR` | `KS_DEVNET_CLASSIC_RECIPIENT_KEYPAIR` | `internal` |
| `KB_DEVNET_CLASSIC_SOURCE_ATA` | `KS_DEVNET_CLASSIC_SOURCE_ATA` | `internal` |
| `KB_DEVNET_RECIPIENT` | `KS_DEVNET_RECIPIENT` | `internal` |
| `KB_DEVNET_SCENARIO` | `KS_DEVNET_SCENARIO` | `internal` |
| `KB_DEVNET_SIGNATURE` | `KS_DEVNET_SIGNATURE` | `internal` |
| `KB_DEVNET_TOKEN_2022_FIXTURE` | `KS_DEVNET_TOKEN_2022_FIXTURE` | `internal` |
| `KB_DEVNET_TOKEN_2022_MINT` | `KS_DEVNET_TOKEN_2022_MINT` | `internal` |
| `KB_DEVNET_TOKEN_2022_MINT_KEYPAIR` | `KS_DEVNET_TOKEN_2022_MINT_KEYPAIR` | `internal` |
| `KB_DEVNET_VALIDATION_DIR` | `KS_DEVNET_VALIDATION_DIR` | `internal` |
| `KB_DEVNET_WALLET_PUBKEY` | `KS_DEVNET_WALLET_PUBKEY` | `internal` |
| `KB_SPL_TOKEN_2022_PROGRAM_ID` | `KS_SPL_TOKEN_2022_PROGRAM_ID` | `internal` |
| `KB_SPL_TOKEN_PROGRAM_ID` | `KS_SPL_TOKEN_PROGRAM_ID` | `internal` |
## 8. Split configuration / logging
L'audit `0.5.0` a confirmé une duplication importante : chaque profil généraliste transporte un bloc logging volumineux. La cible minimale devient :
```text
config/example.config.json
config/example.logging.json
config/schema.config.json
config/schema.logging.json
```
Les profils applicatifs/réseau et les profils logging sont sélectionnables indépendamment. Un profil `devnet` n'impose donc pas un profil logging `debug`, et `mainnet` n'impose pas mécaniquement un profil logging `release`.
Le code duplique actuellement dans `kb-config` et `kb-logging` les concepts :
- `LoggingConfig` ;
- `LogTargetConfig` ;
- `LogTargetFilterConfig`.
`kb-app-demo-desktop` contient en plus une conversion manuelle de `kb_config::LoggingConfig` vers `kb_logging::LoggingConfig`. `0.5.1` doit supprimer cette duplication en donnant au logging un contrat possédé par `ks-logging`, tout en laissant `ks-config` charger/valider/composer les documents sans réinventer les types runtime du logging.
Aucun troisième document spécialisé n'est créé dans `0.5.1` sans bénéfice de découplage démontré.
## 9. Source, runtime, public et diagnostic
La configuration doit distinguer explicitement :
1. **source** : valeurs du fichier, références `${KS_*}`, informations nécessaires à la validation ;
2. **runtime** : valeurs résolues utilisées par le backend, éventuellement secrètes ;
3. **public** : DTO explicitement construit et strictement borné pour Tauri/TS-RS/UI ;
4. **diagnostic** : surface explicitement demandée, pouvant montrer des valeurs `KS_*` internes non sensibles mais jamais une valeur `KS_SECRET_*`.
### 9.1 Fuite actuelle à éliminer
`kb-app-demo-desktop/src/demo_config.rs` transporte actuellement dans `DemoConfigPayload` :
```text
AppConfig complet
ProfileConfig actif complet
schema_json
```
La configuration est déjà résolue avant la construction du payload, puis le frontend affiche les objets via JsonViewer. Cette frontière permet donc à un secret résolu d'atteindre Tauri/UI.
La correction ne doit jamais suivre le modèle :
```text
serialize(runtime_config) -> supprimer quelques champs -> exposer
```
La seule direction admise est :
```text
runtime_config -> construction explicite d'un PublicConfig / ConfigDiagnostics
```
Les types contenant des secrets ne doivent pas être exportés en TS-RS simplement parce qu'ils sont sérialisables côté backend.
## 10. Tests de caractérisation avant et pendant migration
Avant chaque changement structurel correspondant, conserver ou ajouter des tests qui vérifient :
- la topologie des dix crates et leurs dépendances attendues ;
- les 13 tests d'API externe et leurs imports par crate root ;
- l'inventaire exact des identités runtime ;
- l'absence de `kb-*` / `kb_*` résiduel dans les dix crates après leur prerelease de renommage, hors exceptions explicitement listées ;
- le maintien de `khadhroony-bot3` comme nom racine ;
- la cohérence entre targets de tracing et routes de logging ;
- la résolution des anciennes fixtures/env pendant la phase de migration uniquement, puis leur suppression ;
- l'interdiction des variables de configuration workspace hors `KS_*` ;
- la propagation de sensibilité depuis `KS_SECRET_*` vers les valeurs composées ;
- l'impossibilité pour une sentinelle secrète d'apparaître dans `Debug`, logs, erreurs, payloads Tauri, sérialisation publique ou diagnostic ;
- la validation indépendante de `schema.config.json` et `schema.logging.json` ;
- l'indépendance des profils généralistes et logging ;
- l'absence de duplication structurelle des types logging entre `ks-config` et `ks-logging` ;
- le maintien des contrats publics réellement nécessaires après remplacement des types de configuration exposés.
Les tests ne doivent pas figer comme comportement légitime la fuite actuelle de configuration résolue.
## 11. Découpage borné des prereleases `0.5.1`
### `0.5.1-pre.001` — plan et inventaire
- présent document ;
- version d'ouverture ;
- aucune migration physique de crate ;
- validation du mapping avant renommage massif.
### `0.5.1-pre.002` — packages et identifiants Rust `ks-*` / `ks_*`
- renommer physiquement les dix crates selon l'ordre de dépendance ;
- migrer packages, paths, imports, exports, tests externes, scripts et CLI ;
- adapter `kb-app-demo-desktop` sans le renommer ;
- conserver encore les changements sémantiques de config hors de ce delta.
### `0.5.1-pre.003` — identités techniques et tracing
- migrer les 256 identités `kb-lib.*` vers `ks-lib-*` ;
- migrer targets de tracing génériques vers `ks-*` ;
- synchroniser routes de logging, matrices, diagnostics, tests et provenance/replay ;
- ne pas renommer encore les tables SQL `kb_sol_*`.
### `0.5.1-pre.004` — environnement `KS_*` et classification
- migrer code, tests, `.env.example`, configuration et guides vers `KS_*` ;
- consolider les aliases historiques Token-2022 ;
- introduire classification secret/public/internal et propagation de sensibilité ;
- supprimer les anciens noms une fois la migration vérifiée ;
- ajouter les canaris de non-divulgation.
### `0.5.1-pre.005` — split config/logging
- extraire `example.logging.json` et `schema.logging.json` ;
- rendre profils logging et généralistes indépendants ;
- supprimer les structures logging dupliquées et la conversion desktop manuelle ;
- maintenir schémas, exemples et documentation synchronisés.
### `0.5.1-pre.006` — surfaces publiques sûres
- séparer types source/runtime/public/diagnostic ;
- retirer `AppConfig`/`ProfileConfig` résolus du payload Tauri public ;
- borner les DTO TS-RS et diagnostics ;
- valider qu'aucun secret ne traverse logs/UI/erreurs/sérialisation.
### `0.5.1-pre.007` — clôture
- réconciliation complète des namespaces et docs ;
- audits finaux ;
- suppression des TODO terminés ;
- archivage de ce plan et du prompt `030` ;
- préparation du prompt `0.5.2` pour `ks-wallet` ;
- aucune nouvelle fonctionnalité structurelle majeure.
Un correctif `fix-XXX` n'avance jamais cette séquence ; sa numérotation repart à `fix-001` pour chaque prerelease.
## 12. Hors périmètre de `0.5.1`
- renommage du workspace/repository/répertoire racine `khadhroony-bot3` ;
- restructuration fonctionnelle profonde de `ks-wallet` (`0.5.2`) ;
- renommage des tables `kb_sol_*` -> `k_sol_*` et refonte temporelle/store (`0.5.3`) ;
- centralisation finale des scénarios et audit de complétude exécuteurs (`0.5.4`) ;
- programmes Anchor/DEX (`0.6.x+`) ;
- nouvelle tentative de qualification réseau ElGamal sans nouvelle possibilité technique.
## 13. Contrôles de référence
À chaque delta Rust ou contractuel :
```bash
cargo fmt --all
cargo check --workspace
cargo clippy --all-targets
python3 scripts/audit_rust_workspace_rules.py
cargo test --workspace
```
Le desktop n'est lancé avec `cargo tauri dev` que lorsqu'une frontière runtime/UI qu'il couvre change. Les scripts npm de build/dev ne sont jamais lancés directement.
## 14. Critères de sortie de `0.5.1`
`0.5.1` n'est clôturable que lorsque :
- les dix bibliothèques Solana utilisent `ks-*` / `ks_*` ;
- le workspace racine s'appelle toujours `khadhroony-bot3` ;
- les variables propres au workspace ont migré vers `KS_*` avec classification sûre ;
- les identités techniques `kb-lib.*` ciblées ont disparu au profit de `ks-lib-*` ;
- la configuration généraliste et logging sont séparées et validées indépendamment ;
- aucune configuration runtime résolue complète ne traverse Tauri ;
- aucun secret canari n'apparaît dans les surfaces publiques ou diagnostiques ;
- les tests d'API externe, audits et tests workspace sont propres ;
- les décisions durables ont quitté ce plan temporaire pour les documents normatifs avant archivage.

View File

@@ -1,8 +1,15 @@
<!-- file: kb-app-demo-desktop/CHANGELOG.md --> <!-- file: kb-app-demo-desktop/CHANGELOG.md -->
<!-- version: 41 --> <!-- version: 42 -->
# CHANGELOG — kb-app-demo-desktop # CHANGELOG — kb-app-demo-desktop
## `0.5.1-pre.001`
### Documentation
- aligne les versions frontend/Tauri sur `0.5.1` pour ouvrir la version de fondation sans modifier le runtime desktop ;
- confirme que `kb-app-demo-desktop` conserve son nom pendant la migration des bibliothèques généralistes vers `ks-*` et que le workspace racine reste `khadhroony-bot3`.
## `0.5.0-pre.003` ## `0.5.0-pre.003`
### Documentation ### Documentation

View File

@@ -1,7 +1,7 @@
{ {
"name": "kb-app-demo-desktop", "name": "kb-app-demo-desktop",
"private": true, "private": true,
"version": "0.5.0", "version": "0.5.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "Khadhroony Bot3 Demo Desktop", "productName": "Khadhroony Bot3 Demo Desktop",
"version": "0.5.0", "version": "0.5.1",
"identifier": "com.sasedev.kb-app-demo-desktop", "identifier": "com.sasedev.kb-app-demo-desktop",
"build": { "build": {
"beforeDevCommand": "npm run dev", "beforeDevCommand": "npm run dev",

View File

@@ -1,5 +1,5 @@
<!-- file: prompts/030_v0_5_1_khadhroony_solana_namespace_and_config.md --> <!-- file: prompts/030_v0_5_1_khadhroony_solana_namespace_and_config.md -->
<!-- version: 1 --> <!-- version: 2 -->
# Khadhroony Bot3 — `0.5.1` — migration Khadhroony Solana et configuration sûre # Khadhroony Bot3 — `0.5.1` — migration Khadhroony Solana et configuration sûre
@@ -47,6 +47,8 @@ Elle doit être lue avant toute proposition de code.
`kb-app-demo-desktop` reste dans le domaine Bot. Il sert actuellement surtout de banc de validation des composants Solana généralistes, mais pourra aussi accueillir des démonstrations spécifiques au bot. `kb-app-demo-desktop` reste dans le domaine Bot. Il sert actuellement surtout de banc de validation des composants Solana généralistes, mais pourra aussi accueillir des démonstrations spécifiques au bot.
Le workspace, le dépôt et le répertoire racine restent nommés `khadhroony-bot3` pendant toute la migration `0.5.1` et plus généralement jusqu'à `1.0` ou une version ultérieure explicitement dédiée. Renommer des crates vers `ks-*` ne doit jamais être interprété comme une autorisation de renommer le workspace racine.
## Lectures obligatoires avant toute proposition ## Lectures obligatoires avant toute proposition
1. `README.md`, `ROADMAP.md`, `CHANGELOG.md`, `RULES.md` et ce prompt ; 1. `README.md`, `ROADMAP.md`, `CHANGELOG.md`, `RULES.md` et ce prompt ;