diff --git a/README.md b/README.md index 9d2593f..cd0557a 100644 --- a/README.md +++ b/README.md @@ -90,12 +90,12 @@ Documents de référence : docs/reports/METEORA_DLMM_EVENT_COVERAGE_REPORT.md docs/VALIDATION_STATUS_0_7_57_FINAL.md validation_sql/SQL_VALIDATION_METEORA_DLMM_0_7_57.sql -docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md -docs/prompts/PROMPT_0_7_59_SQLITE_DB_TRANSACTION_MERGER_BINARY.md +docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md +docs/prompts/PROMPT_0_7_59_DEMO4_PROGRAM_SURFACE_DISCOVERY.md docs/prompts/PROMPT_0_7_60_METEORA_DAMM_NEXT_DEX.md ``` -Prochaine étape recommandée : `0.7.58 demo4 / program surface discovery`, une fonctionnalité d'affichage et de scoring des contenus non encore pris en compte (`program_id`, discriminators, Anchor logs/events, upstream fallback), sans matérialisation automatique et sans promotion automatique dans les decoders. +Prochaine étape recommandée : `0.7.58 sqlite_db_transaction_merger`, un binaire de fusion de bases SQLite transactionnelles pour construire `final.db`/`final.next.db` et lancer des replays anti-régression cross-DEX Pump/Raydium/Meteora. `demo4 / program surface discovery` est déplacé en `0.7.59` et exploitera cette base consolidée sans matérialisation automatique ni promotion automatique. @@ -183,7 +183,7 @@ validation_sql/SQL_VALIDATION_METEORA_DBC_0_7_56.sql docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md ``` -La tranche suivante `0.7.57 meteora_dlmm` est désormais clôturée. La prochaine étape recommandée est `0.7.58 demo4 / program surface discovery`, puis `0.7.59` pour le binaire de consolidation de bases SQLite. +La tranche suivante `0.7.57 meteora_dlmm` est désormais clôturée. La prochaine étape recommandée est `0.7.58 sqlite_db_transaction_merger`, afin de construire `final.db`/`final.next.db` par merge de bases dédiées et de rejouer la base consolidée pour détecter les régressions cross-DEX. `0.7.59` est réservé à `demo4 / program surface discovery`. ## État final validé `0.7.55` — `pump_fees` diff --git a/ROADMAP.md b/ROADMAP.md index a14422e..e462863 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ # Roadmap — khadhroony-bobobot -## État courant — clôture `0.7.57 meteora_dlmm` et plan intermédiaire `demo4` / consolidation DB +## État courant — clôture `0.7.57 meteora_dlmm` et plan intermédiaire consolidation DB / demo4 ### `0.7.57 meteora_dlmm` — clos @@ -18,7 +18,7 @@ ### Politique de découverte automatique future -La suite ne doit pas matérialiser automatiquement des contenus inconnus. La future `demo4` doit seulement afficher, scorer et regrouper les surfaces non encore prises en compte pour permettre une programmation manuelle ou semi-automatique contrôlée. +La suite ajoute d'abord le binaire de fusion SQLite en `0.7.58`, puis `demo4` en `0.7.59`. La future `demo4` ne doit pas matérialiser automatiquement des contenus inconnus : elle doit seulement afficher, scorer et regrouper les surfaces non encore prises en compte pour permettre une programmation manuelle ou semi-automatique contrôlée. À observer sans promotion automatique : @@ -34,14 +34,16 @@ La suite ne doit pas matérialiser automatiquement des contenus inconnus. La fut | Priorité | Tranche | Surface | Objectif | |---:|---|---|---| -| 1 | `0.7.58` | `demo4_program_surface_discovery` | UI/queries de découverte des contenus non pris en compte : aucun auto-decode métier, aucune auto-materialization, aucune auto-promotion. | -| 2 | `0.7.59` | `sqlite_db_transaction_merger` | Nouveau module binaire utilisant `kb_lib` pour fusionner plusieurs bases SQLite de corpus existants dans une base output, sans rescanner/backfill les signatures déjà disponibles. | +| 1 | `0.7.58` | `sqlite_db_transaction_merger` | Binaire de fusion de bases SQLite transactionnelles vers `final.db` / `final.next.db`, sans RPC/backfill/décodage pendant le merge, puis replay anti-régression cross-DEX Pump/Raydium/Meteora. | +| 2 | `0.7.59` | `demo4_program_surface_discovery` | UI/queries de découverte des contenus non pris en compte depuis la base consolidée : aucun auto-decode métier, aucune auto-materialization, aucune auto-promotion. | | 3 | `0.7.60` | `meteora_damm_v1` | Clôture séparée DAMM v1 : pools, swaps, liquidity, lock, fees/admin, coverage et matérialisation complète. | | 4 | `0.7.61` | `meteora_damm_v2` | Clôture séparée DAMM v2 : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | | 5 | `0.7.62` | `meteora_vault` | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | Décision de planification : ne pas fusionner DAMM v1 et DAMM v2 dans une seule tranche. Ils peuvent partager des helpers, des tests et des conventions de matérialisation, mais les `program_id`, IDL, discriminants et corpus doivent rester séparés afin de garder les validations SQL lisibles et de réduire les risques de faux positif. +Décision anti-régression : pour les futurs développements de décodeurs/materializers, travailler d'abord sur une base vide dédiée au DEX, puis fusionner cette base dans une copie de `final.db` avec le binaire `0.7.58`. La clôture d'une tranche DEX doit inclure un replay de la base fusionnée afin de détecter les régressions cross-surface, par exemple un decoder PumpFees qui interrompt une matérialisation PumpSwap dans la même transaction. + ## 0.7.47-1FE5 — Décision de planification : ne plus viser “tous les events en une session” La phase `0.7.47` a montré que l’objectif “réimplémenter tous les décodeurs Carbon et toutes les sources en un seul bloc” est trop large. Le plan est donc redécoupé en **un DEX/version par tranche**, avec une matrice documentaire dédiée : `docs/DEX_DECODER_MATRIX.md`. @@ -82,8 +84,8 @@ Les comptes non-programmes (`platform_config`, token authority, comptes de confi | `0.7.55` | `pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | Pump / fee | **Clos** : `29` instructions, `20` events Anchor, fee/reward/admin/lifecycle, `get_fees` decoded-only, failed tx audit-only, aucun trade/candle direct. | | `0.7.56` | `meteora_dbc` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | Meteora / DBC | Clos : `28` instructions et `23` events Anchor couverts, swaps `swap/swap2`, lifecycle/admin/fees, `k_sol_fee_event_amounts`, validations SQL propres. | | `0.7.57` | `meteora_dlmm` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | Meteora / DLMM | **Clos** : full decode + full materialization ; `76` instructions IDL, `30` events Anchor, swaps, bins, positions, liquidity, fees/rewards/admin/limit-order, sans double-count. | -| `0.7.58` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | -| `0.7.59` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner plusieurs `.db` de corpus existants vers une base output sans RPC/backfill. | +| `0.7.58` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner des bases `.db` transactionnelles vers `final.db`/`final.next.db`, puis rejouer la base consolidée pour détecter les régressions cross-DEX Pump/Raydium/Meteora. | +| `0.7.59` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher depuis la base consolidée les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | | `0.7.60` | `meteora_damm_v1` | `Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB` | Meteora / DAMM v1 | Parité upstream finale : pools, swaps, liquidity, lock, fees/admin. | | `0.7.61` | `meteora_damm_v2` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | Meteora / DAMM v2 | Couverture complète : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | | `0.7.62` | `meteora_vault` | `24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi` | Meteora / vault | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | @@ -1437,8 +1439,8 @@ Objectif : maintenir un phasage lisible après la clôture `0.7.57 meteora_dlmm` Décisions actives : -- `0.7.58` est réservé à `demo4_program_surface_discovery` : affichage et revue de surfaces non prises en compte, sans matérialisation automatique. -- `0.7.59` est réservé au binaire de consolidation de bases SQLite : fusion de corpus transactionnels déjà présents, sans RPC/backfill. +- `0.7.58` est réservé au binaire de consolidation de bases SQLite : fusion de corpus transactionnels déjà présents, sans RPC/backfill, puis replay `final.db`/`final.next.db` pour non-régression cross-DEX. +- `0.7.59` est réservé à `demo4_program_surface_discovery` : affichage et revue de surfaces non prises en compte depuis la base consolidée, sans matérialisation automatique. - `0.7.60` reprend le travail DEX avec `meteora_damm_v1`. - `0.7.61` cible `meteora_damm_v2`. - `0.7.62` cible `meteora_vault`. @@ -1451,8 +1453,8 @@ Décisions actives : | `0.7.55` | `pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | Pump / fee | **Clos** : `29` instructions, `20` events Anchor, fee/reward/admin/lifecycle, `get_fees` decoded-only, failed tx audit-only, aucun trade/candle direct. | | `0.7.56` | `meteora_dbc` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | Meteora / DBC | Clos : `28` instructions et `23` events Anchor couverts, swaps `swap/swap2`, lifecycle/admin/fees, `k_sol_fee_event_amounts`, validations SQL propres. | | `0.7.57` | `meteora_dlmm` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | Meteora / DLMM | **Clos** : full decode + full materialization ; `76` instructions IDL, `30` events Anchor, swaps, bins, positions, liquidity, fees/rewards/admin/limit-order, sans double-count. | -| `0.7.58` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | -| `0.7.59` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner plusieurs `.db` de corpus existants vers une base output sans RPC/backfill. | +| `0.7.58` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner des bases `.db` transactionnelles vers `final.db`/`final.next.db`, puis rejouer la base consolidée pour détecter les régressions cross-DEX Pump/Raydium/Meteora. | +| `0.7.59` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher depuis la base consolidée les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | | `0.7.60` | `meteora_damm_v1` | `Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB` | Meteora / DAMM v1 | Parité upstream finale : pools, swaps, liquidity, lock, fees/admin. | | `0.7.61` | `meteora_damm_v2` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | Meteora / DAMM v2 | Couverture complète : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | | `0.7.62` | `meteora_vault` | `24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi` | Meteora / vault | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | @@ -1738,8 +1740,8 @@ Ordre de travail recommandé pour la suite : 13. `0.7.55` : `pump_fees` — clos ; 14. `0.7.56` : `meteora_dbc` — clos ; 15. `0.7.57` : `meteora_dlmm` — clos ; -16. `0.7.58` : `demo4_program_surface_discovery` — à faire ; -17. `0.7.59` : `sqlite_db_transaction_merger` — à faire ; +16. `0.7.58` : `sqlite_db_transaction_merger` + validation anti-régression Pump/Raydium/Meteora — à faire ; +17. `0.7.59` : `demo4_program_surface_discovery` — à faire ; 18. `0.7.60` : `meteora_damm_v1` — prochaine tranche DEX ; 19. `0.7.61` : `meteora_damm_v2` — après DAMM v1 ; 20. `0.7.62+` : appliquer le phasage actif défini en section `6.085`. diff --git a/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md b/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md index cc1fa27..72fd97a 100644 --- a/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md +++ b/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md @@ -1,245 +1,18 @@ - + -# Prompt — 0.7.58 Demo4 Program Surface Discovery +# OBSOLETE — Prompt déplacé -## Contexte +Ce prompt n'est plus la cible `0.7.58`. -Nous reprenons le workspace Rust/Tauri `khadhroony-bobobot` après la clôture de `0.7.57 meteora_dlmm`. - -État validé : +Nouvel ordre validé : ```text -0.7.57 meteora_dlmm clos -cargo test -p kb_lib -> 460 passed -cargo clippy -p kb_lib --all-targets -- -D warnings -> OK -replay -> 769 replayed, 106 trades, 664 liquidity, 1107 lifecycle, 424 candles -instructionObservations = 8062 -catalogue = 169 tokens / 218 pools / 218 pairs +0.7.58 -> sqlite_db_transaction_merger +0.7.59 -> demo4_program_surface_discovery ``` -Contraintes projet à respecter : - -- Rust 2024. -- Code async-first. -- Pas de `?`, `unwrap`, `expect` dans le code applicatif. -- Pas de `anyhow`, pas de `thiserror`. -- Pas de `mod.rs`. -- Pas de `pub mod` ; utiliser `mod` privé + `pub use`. -- Imports uniquement pour les traits quand c’est possible. -- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]` doivent rester propres. -- Tests offline. -- Les nouvelles requêtes DB doivent mettre à jour les re-exports dans `kb_lib/src/db.rs` puis `kb_lib/src/lib.rs`. -- Les structs DB doivent aller dans `kb_lib/src/db/entities/*.rs` et `kb_lib/src/db/dtos/*.rs`, pas dans les fichiers de requêtes. - -## Objectif - -Ajouter `Demo4` dans `kb_demo_app` et les fonctions de lecture associées dans `kb_lib` pour afficher les surfaces de programmes non encore prises en compte par le système. - -Cette fonctionnalité est strictement un cockpit de découverte et de revue. - -Elle ne doit pas : - -- matérialiser automatiquement des contenus inconnus ; -- promouvoir automatiquement des discriminators inconnus dans les décodeurs officiels ; -- marquer automatiquement un `program_id` comme supporté ; -- créer automatiquement des lignes `trade`, `candle`, `fee`, `liquidity`, `reward`, `admin` ou `orderbook` depuis un contenu inconnu. - -Elle doit : - -- afficher les surfaces inconnues ou non supportées ; -- les regrouper de manière exploitable ; -- montrer les preuves et signatures samples ; -- aider à produire des prompts/patchs futurs validés manuellement. - -## Comportement attendu côté utilisateur - -Créer une nouvelle page ou fenêtre, selon le pattern existant : +Utiliser : ```text -kb_demo_app/src/demo4.html -kb_demo_app/src/demo4.ts +docs/prompts/PROMPT_0_7_59_demo4_program_surface_discovery.md ``` - -ou l’équivalent si l’application utilise un autre routage. - -Demo4 doit proposer des vues pour : - -1. discriminators inconnus sur des decoders connus ; -2. `program_id` connus contenant des instructions non mappées par le decoder spécialisé ; -3. `upstream_git.instruction_match` groupés par `upstreamDecoderCode`, `upstreamEntryName`, `upstreamDiscriminatorHex` ; -4. `program_id` observés dans les transactions mais absents de la matrice de support ; -5. logs Anchor `Program log: Instruction: ...` non mappés localement ; -6. events Anchor `Program data:` non mappés localement ; -7. layouts de comptes récurrents sur instructions inconnues ; -8. répartition success/failed pour chaque surface candidate. - -Filtres souhaités : - -```text -program_id -candidate_decoder_code -discriminator_hex -instruction_name / nom log Anchor -upstream decoder -upstream entry name -success only / failed only / both -minimum observation count -minimum tx count -from slot / to slot -signature contains -show only unknown -show only upstream fallback -show only high-confidence candidates -``` - -Colonnes souhaitées : - -```text -candidate_kind -program_id -candidate_decoder -known/unknown status -discriminator_hex -log_instruction_name -anchor_event_discriminator -account_count -layout_hash -observed_count -tx_count -success_count -failed_count -first_slot -last_slot -sample_signature -confidence_score -confidence_reason -status -``` - -Le panneau de détail doit afficher : - -```text -sample signatures -accounts_json -data_json / data prefix -logs de transaction -inner instructions -parsed_json si disponible -decoded_payload_json si disponible -entrées upstream registry correspondantes -preuve de hash Anchor si un nom d’instruction est disponible -``` - -## Design `kb_lib` - -Ajouter des requêtes read-only et des DTOs. Fichiers suggérés : - -```text -kb_lib/src/program_surface_discovery.rs -kb_lib/src/db/dtos/program_surface_candidate_summary.rs -kb_lib/src/db/dtos/program_surface_candidate_sample.rs -kb_lib/src/db/queries/program_surface_discovery.rs -``` - -Si un statut persistant est nécessaire, ajouter : - -```text -kb_lib/src/db/entities/program_surface_candidate.rs -kb_lib/src/db/queries/program_surface_candidates.rs -``` - -Ne pas placer les DTO/entities dans les fichiers de requêtes. - -Statuts candidats suggérés : - -```text -new -reviewed -accepted -rejected -promoted -ignored -``` - -Si une table persistante est ajoutée, la migration doit être explicite, idempotente et testée. - -## Scoring de découverte - -Le scoring est indicatif uniquement. Il ne doit jamais déclencher une matérialisation. - -Signaux de confiance possibles : - -| Signal | Effet | -|---|---:| -| `program_id` connu, discriminator inconnu | +20 | -| log Anchor `Instruction: X` trouvé | +30 | -| `sha256("global:x")` correspond au discriminator | +50 | -| observations success répétées | +10 | -| account count/layout stable | +10 | -| inner instruction family cohérente avec l’action | +10 | -| uniquement des transactions failed | -20 | -| nom très générique comme `swap`, `claim`, `initialize` sans autre preuve | -15 | -| `program_id` inconnu et observation unique | -25 | - -## Helper Anchor - -Ajouter un helper qui normalise les noms d’instructions Anchor depuis les logs : - -```text -Program log: Instruction: InitializePresetParameterV2 --> initialize_preset_parameter_v2 --> sha256("global:initialize_preset_parameter_v2")[0..8] -``` - -Ce helper doit seulement produire une preuve/candidate record. Il ne doit pas modifier les mappings de decoder. - -## Export Markdown - -Demo4 doit permettre d’exporter un groupe candidat en Markdown pour une future session d’implémentation. - -L’export doit inclure : - -```text -candidate decoder -program_id -discriminator_hex -candidate name -confidence score -preuves/evidence -sample signatures -account layout -logs -inner instruction summary -proposed target table éventuelle -warning explicite : non implémenté, non matérialisé -``` - -## Tests - -Ajouter des tests offline pour : - -- normalisation des noms Anchor depuis logs ; -- calcul de discriminators Anchor pour des noms samples ; -- groupement par program/discriminator/layout ; -- ordre de score ; -- sérialisation/désérialisation des DTOs si utilisés ; -- validation des paramètres de commandes UI. - -Aucun test ne doit dépendre de RPC ou du réseau. - -## Validation - -```bash -cargo fmt -cargo test -p kb_lib program_surface -cargo test -p kb_lib -cargo clippy -p kb_lib --all-targets -- -D warnings -``` - -Pour Tauri/frontend, lancer la commande de build/test existante du projet si elle existe. - -## Résultat attendu - -L’utilisateur peut ouvrir Demo4 et voir immédiatement les surfaces unsupported/upstream/unknown présentes dans la base SQLite courante, sans rescanner la blockchain. - -Demo4 est un cockpit de découverte uniquement. Il ne change pas la matérialisation métier. diff --git a/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md b/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md new file mode 100644 index 0000000..c2a7381 --- /dev/null +++ b/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md @@ -0,0 +1,447 @@ + + +# Prompt — 0.7.58 Binaire de fusion de bases SQLite transactionnelles + validation anti-régression inter-DEX + +## Contexte + +Nous reprenons le workspace Rust `khadhroony-bobobot` après : + +```text +0.7.57 -> meteora_dlmm clos +0.7.57-pre.015..023 -> nettoyage PumpSwap / guard PumpFees après régression cross-surface +``` + +Décision de planification mise à jour : + +```text +0.7.58 -> sqlite_db_transaction_merger +0.7.59 -> demo4_program_surface_discovery +0.7.60 -> meteora_damm_v1 +0.7.61 -> meteora_damm_v2 +``` + +Le binaire de fusion passe avant `demo4`, car il devient un outil de non-régression indispensable pour les futurs décodeurs/materializers. + +## Objectif principal + +Créer un outil binaire de fusion de bases SQLite transactionnelles permettant de construire une base consolidée de corpus, par exemple `final.db`, à partir : + +```text +final.db existante ++ base dédiée pump_swap.db ++ base dédiée pump_fun.db ++ base dédiée pump_fees.db ++ base dédiée raydium_*.db ++ base dédiée meteora_*.db +``` + +Le binaire doit fusionner les transactions/instructions déjà backfillées sans RPC, sans redécoder et sans matérialiser pendant le merge. + +Ensuite, la base consolidée doit être rejouable localement avec : + +```text +metadata=no +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +But : détecter les régressions inter-DEX comme celle observée où un décodage `pump_fees` tronqué interrompait la matérialisation `pump_swap.buy_exact_quote_in` dans la même transaction. + +## Règle de workflow future + +Pour chaque nouveau DEX ou nouvelle surface : + +1. Créer une base vide dédiée au DEX en cours. +2. Backfiller uniquement les signatures/pools nécessaires pour ce DEX. +3. Développer le decoder/materializer sur cette base dédiée. +4. Clore avec les SQL propres du DEX. +5. Fusionner la base dédiée dans `final.db` ou dans une copie `final.next.db`. +6. Rejouer `final.next.db` avec `forceDexDecode=yes`. +7. Lancer les validations globales anti-régression sur Pump/Raydium/Meteora et sur les surfaces closes. +8. Promouvoir `final.next.db` en `final.db` seulement si les gates sont propres. + +Commande conceptuelle : + +```bash +cargo run -p kb_tools --bin kb_db_merge -- --output ./final.next.db --input ./final.db --input ./corpus/pump_swap.db --input ./corpus/pump_fees.db --mode raw-corpus --dry-run +``` + +Puis, après validation dry-run : + +```bash +cargo run -p kb_tools --bin kb_db_merge -- --output ./final.next.db --input ./final.db --input ./corpus/new_dex.db --mode raw-corpus --replace-output +``` + +## Emplacement recommandé + +Créer un package outil séparé : + +```text +kb_tools/ + Cargo.toml + src/bin/kb_db_merge.rs +``` + +Ajouter `kb_tools` dans le workspace principal. + +Alternative acceptable si la structure workspace rend cela plus simple : + +```text +kb_lib/src/bin/kb_db_merge.rs +``` + +Mais privilégier `kb_tools` pour éviter de mélanger outil CLI et librairie métier. + +## Contraintes de code + +Respecter les contraintes projet : + +- Rust 2024 ; +- async-first si accès DB async ; +- tracing obligatoire ; +- pas de `?` dans le code applicatif ; +- pas de `unwrap` / `expect` hors tests ; +- pas de `anyhow` / `thiserror` ; +- pas de `mod.rs` ; +- pas de `pub mod`, utiliser `mod` + `pub use` ; +- imports directs seulement pour les traits ; +- tests offline ; +- types DB sous `kb_lib/src/db/entities/` et `kb_lib/src/db/dtos/`, pas sous `queries/` ; +- si des requêtes DB sont ajoutées/modifiées : mettre à jour les re-exports dans `kb_lib/src/db.rs` puis `kb_lib/src/lib.rs`. + +## Modes CLI + +Modes initiaux : + +```text +raw-corpus +signatures-only +full-copy-safe +``` + +Le mode par défaut doit être : + +```text +raw-corpus +``` + +### `raw-corpus` + +Copier uniquement les données nécessaires à un replay local fiable : + +```text +k_sol_chain_transactions +k_sol_chain_instructions +``` + +Ne pas copier les tables matérialisées par défaut : + +```text +k_sol_dex_decoded_events +k_sol_trade_events +k_sol_liquidity_events +k_sol_pool_lifecycle_events +k_sol_pair_candles +k_sol_fee_events +k_sol_reward_events +k_sol_pool_admin_events +k_sol_orderbook_events +k_sol_token_account_events +k_sol_instruction_observations +k_sol_dex_event_coverage_entries +``` + +Raison : ces tables dépendent de la version de decoder/materializer et doivent être reconstruites par replay local. + +### `signatures-only` + +Créer une table de staging de signatures/slots/source, sans copier les transactions complètes. Ce mode est utile pour audit ou pour préparer des backfills contrôlés. + +### `full-copy-safe` + +Mode optionnel, non prioritaire. + +Copier aussi des lignes décodées/matérialisées uniquement si : + +- le schema version est compatible ; +- la version logique de decoder est identique ; +- toutes les foreign keys peuvent être remappées ; +- le mode est explicitement demandé. + +Ne jamais en faire le mode par défaut. + +## Options CLI minimales + +```text +--output +--input répétable +--mode +--dry-run +--replace-output +--source-label