v0.1.0-pre.061

This commit is contained in:
2026-07-28 18:41:30 +02:00
parent c7bad46f50
commit f40fb78817
527 changed files with 4598 additions and 4114 deletions

View File

@@ -1,10 +1,20 @@
# file: .env.example
# Copy to .env at the workspace root. Never commit the real file.
# Copy this file to .env at the workspace root and replace every local value.
# Never commit the real .env file.
# Helius HTTP and WebSocket endpoint interpolation used by config/example.config.json.
# Shared Helius credential used by the configured HTTP and WebSocket endpoints.
HELIUS_API_KEY=replace-with-your-helius-api-key
# Optional configuration override.
# PostgreSQL database used by the mainnet_research and mainnet profiles.
KB_POSTGRES_MAINNET_URL=postgres://solana:solana@localhost:5432/khadhroony_mainnet
# PostgreSQL database dedicated to the local_devnet profile and Devnet validation.
KB_POSTGRES_DEVNET_URL=postgres://solana:solana@localhost:5432/khadhroony_devnet
# PostgreSQL database reserved for automated integration tests.
KB_POSTGRES_TEST_URL=postgres://solana:solana@localhost:5432/khadhroony_test
# Optional configuration-file override.
# KB_CONFIG_PATH=config/example.config.json
# Optional Token-2022 Devnet validation fixtures.
@@ -19,5 +29,6 @@ TOKEN_2022_FREEZE_AUTHORITY=
TOKEN_2022_DECIMALS=9
TOKEN_2022_TRANSFER_AMOUNT_RAW=1
# Optional explicit environment file selection. Relative paths use the workspace root.
# Optional explicit environment-file selection. Relative paths use the workspace root.
# Define this variable in the process environment when the selected file is not .env.
# KB_ENV_FILE=.env.local

1
.gitignore vendored
View File

@@ -40,7 +40,6 @@ var/
# env
.env
.env.*
!.env.dev
!.env.example
config.json

View File

@@ -1,394 +1,389 @@
<!-- file: KHADHROONY_BOT3_MIGRATION_CLOSURE_TODO.md -->
<!-- version: 9 -->
<!-- version: 19 -->
# Checklist détaillée de clôture de la migration `khadhroony-bot3`
# Clôture de la migration `khadhroony-bot3`
## Base et principe de validation
Ce fichier est temporaire. Il doit disparaître lorsque la migration est close, que la documentation active décrit uniquement `khadhroony-bot3`, et que la version du workspace est alignée sur `0.4.7`.
- Base de travail : `khadhroony-bot3_v0.1.0-pre.055-full.zip`.
- Références fonctionnelles : Bot2 `v0.4.6` puis Bot2 `v0.4.7-pre.035-tofix07`.
- Prompt actif : `prompts/KHADHROONY_BOT3_MIGRATION_CONTINUATION_PROMPT_REORDERED.md`.
- Une case nest cochée quaprès preuve explicite : audit, compilation, test, requête SQL, contrôle runtime ou comparaison documentée.
- Lordre est obligatoire : règles, contrôles rapides, retour au niveau `0.4.6`, Metaplex `0.4.7`, Clippy/Tauri, documentation, versionnement.
## Principes de clôture
## 0. Revalidation des règles et des archives
- Une case nest cochée quaprès preuve par recherche, compilation, test, audit, requête SQL ou validation runtime.
- Les noms, modules et documents actifs doivent décrire Bot3 comme le produit courant, sans récit permanent de migration depuis Bot2.
- Les protocoles applicatifs Pump.fun, Raydium, Meteora, Jupiter, autres AMM et launchpads restent hors périmètre tant que Solana Core, SPL, Metaplex Token Metadata et Anchor ne sont pas clôturés.
- Les rappels damélioration non bloquants doivent être déplacés vers `docs/IDEA_REMINDERS.md`, pas conservés dans cette checklist.
- La documentation finale décrit létat courant. Elle ne doit pas accumuler un journal de changements par version dans les README.
- [x] Inventorier larchive Bot3 `pre.055`.
- [x] Inventorier larchive Bot2 `0.4.6` issue de Git.
- [x] Inventorier larchive Bot2 `0.4.7-pre.035-tofix07`.
- [x] Vérifier la présence de lIDL Metaplex local dans Bot3.
- [x] Constater que Bot3 utilisait encore `RULES.md` et `RUST_RULES.md`.
- [x] Créer `RULES_GENERAL.md`.
- [x] Créer `RULES_RUST.md`.
- [x] Créer `RULES_SPECIFIC_KHADHROONY.md`.
- [x] Transformer `RULES.md` en index normatif.
- [x] Corriger `docs/DELTA_WORKFLOW.md` pour Bot3, `-delta`, `delta-fix-XXX`, exclusion de `Cargo.lock` et absence de SHA256.
- [x] Adapter le script daudit aux nouveaux fichiers de règles.
- [x] Relire intégralement les quatre fichiers de règles après application du delta.
- [ ] Comparer ligne par ligne les règles Bot2 encore applicables avec les règles Bot3.
- [ ] Documenter chaque règle Bot2 écartée et sa justification.
- [ ] Vérifier labsence de contradiction sur les imports, réexports, façades, Tauri, TS-RS, logging, versionnement et archives.
- [x] Exécuter `cargo fmt --all`.
- [x] Exécuter `python3 scripts/audit_rust_workspace_rules.py`.
## État validé de `0.1.0-pre.061`
## 0.1 Classification des matrices de contrat
- [x] Suite ciblée complète : toutes les crates principales réussissent leurs tests.
- [x] `kb-app-demo-desktop` : 116 tests réussis.
- [x] `kb-config` : 45 tests réussis.
- [x] `kb-core` : 2 tests réussis.
- [x] `kb-lib` : 625 tests réussis.
- [x] `kb-onchain-transport` : 113 tests réussis.
- [x] `kb-pipeline` : 89 tests réussis.
- [x] `kb-pipeline-demo-scenarios` : 35 tests réussis.
- [x] `kb-store` : 84 tests réussis.
- [x] `cargo check --workspace` réussi.
- [x] Audit général Rust propre.
- [x] Audit des exports Rust propre.
- [x] Audit spécifique Khadhroony propre.
- [x] `cargo clippy --all-targets` propre.
- [x] Démarrage Tauri, splash, PostgreSQL et fenêtres principales validés.
- [x] Extraction Core complète de 4 574 transactions raw : 4 574 extraites, 0 échec.
- [x] Replay complet de 11 880 instructions exécuté.
- [x] Les 6 faux échecs Metaplex ont été corrigés et rejoués avec succès.
- [x] Les 76 tentatives Loader malformées de transactions échouées sont désormais décodées comme observations non engagées.
- [x] Les 4 tags Loader v4 inconnus restent correctement classés `Unsupported`.
- [x] Aucune erreur de matérialisation observée pendant la campagne propre.
- [x] Les trois erreurs supplémentaires du replay ont été identifiées comme timeouts transitoires du pool PostgreSQL, distincts des échecs fonctionnels de décodage.
- [x] Revalider les suites après les correctifs `pre.061-delta-fix-004` et `pre.061-delta-fix-005` : 116 tests desktop, 625 tests `kb-lib`, suites consolidées et replay propre.
- [x] Inventorier les fichiers JSON machine auparavant placés sous `docs/`.
- [x] Créer `test-fixtures/contract-matrices/` pour les matrices de contrat partagées.
- [x] Déplacer les dix matrices JSON hors de `docs/`.
- [x] Mettre à jour les dix-sept fichiers Rust contenant les `include_str!` concernés.
- [x] Conserver le déplacement et les mises à jour de chemins dans une même livraison atomique.
- [x] Lister chaque ancien fichier avec une commande `rm --` dans `delta.md`.
- [x] Exécuter les tests des crates consommatrices dans le workspace réel (`kb-lib`, `kb-onchain-transport`, `kb-pipeline-demo-scenarios`).
- [x] Vérifier quaucune référence résiduelle ne pointe vers les anciens chemins `docs/*.json`.
# 1. Nettoyage structurel et nomenclature
## 1. Contrôles rapides avant code fonctionnel
## 1.1 Règles
### 1.1 TS-RS
- [x] Reprendre dans les règles Bot3 toutes les règles Bot2 encore applicables.
- [x] Remplacer les anciens fichiers de règles par `RULES_GENERAL.md`, `RULES_RUST.md`, `RULES_SPECIFIC_KHADHROONY.md` et un index `RULES.md`.
- [x] Adapter le workflow des deltas à Bot3.
- [ ] Effectuer une dernière lecture croisée des règles portant sur imports, réexports, façades, Tauri, TS-RS, logging, versionnement et archives.
- [ ] Supprimer de cette checklist toute demande de justification historique sans valeur normative.
- [x] Rechercher `export_to` uniquement dans les fichiers `.rs` de `kb-config`, `kb-lib` et `kb-app-demo-desktop`.
- [x] Vérifier les sorties `kb_config`.
- [x] Vérifier les sorties `kb_lib` dans `kb-lib/frontend/ts/bindings/kb_lib`.
- [x] Vérifier les sorties `kb_app_demo_desktop`.
- [ ] Supprimer les chemins historiques `kb_executor_*`.
- [ ] Supprimer les chemins historiques `kb_decoder_*`.
- [ ] Supprimer les chemins historiques `kb_materializer_*`.
- [ ] Supprimer les chemins historiques `kb_model`.
- [ ] Supprimer les chemins historiques `kb_store_pg` et `kb_store_core`.
- [x] Régénérer les bindings via les tests TS-RS exécutés pendant les tests complets des crates.
- [x] Vérifier que les fichiers générés correspondent aux chemins déclarés pour `kb_config`, `kb_lib` et `kb_app_demo_desktop`.
## 1.2 Anciennes crates, imports et chemins
### 1.2 Anciens chemins et nomenclature
- [x] Confirmer labsence dimport, réexport ou dépendance active vers les anciennes crates `kb_executor_*`.
- [x] Confirmer labsence dimport, réexport ou dépendance active vers les anciennes crates `kb_decoder_*`.
- [x] Confirmer labsence dimport, réexport ou dépendance active vers les anciennes crates `kb_materializer_*`.
- [x] Confirmer labsence dimport, réexport ou dépendance active vers lancienne crate `kb_model`.
- [x] Confirmer labsence de dépendance ou de crate `kb_store_pg`.
- [x] Confirmer labsence de dépendance ou de crate `kb_store_core`.
- [x] Confirmer quaucune ancienne crate supprimée na été recréée sous un autre chemin.
- [x] Auditer `kb-app-demo-desktop/**/*.rs` pour les anciens chemins structurels actifs.
- [x] Vérifier les bindings TS-RS générés : aucun ancien chemin de crate actif nest exporté.
- [x] Classer les anciennes chaînes runtime et les remplacer par les identités consolidées `kb-lib.decoder.*`, `kb-lib.executor.*` et `kb-lib.materializer.*`.
- [ ] Réécrire lors de la refonte documentaire finale les commentaires et documents qui racontent encore la consolidation depuis les anciennes crates.
- [ ] Auditer `kb-app-demo-desktop/**/*.rs` pour les anciens noms Bot2.
- [ ] Auditer tout le workspace pour `token_2022` interne.
- [ ] Justifier séparément chaque contrat externe `TOKEN_2022_*` conservé.
- [ ] Vérifier que `kb-lib` et `kb-store` sont les seules façades consolidées concernées.
- [ ] Vérifier quaucune ancienne crate na été recréée.
Contrôles exécutés : aucune correspondance structurelle `ancienne_crate::`, aucune dépendance Cargo correspondante et aucun répertoire de crate supprimée.
### 1.3 Frontend et menu
## 1.3 Convention Token-2022
- [x] Auditer les occurrences `Copier` et `Effacer` dans tous les HTML et TypeScript.
- [ ] Garantir une seule paire de contrôles par sortie.
- [x] Vérifier et corriger lordre du menu : Configuration, Transport et collecte, Pipeline, SQL, Exécution.
- [ ] Vérifier les séparateurs.
- [ ] Supprimer les entrées mortes.
- [x] Identifier les modules SPL backend comme composants de la fenêtre consolidée `demo_execution_spl`, et non comme fenêtres autonomes oubliées.
Convention arrêtée :
## 2. Corrections UI rapides
- symboles, modules, fichiers, fonctions et variables internes : `token_2022` / `TOKEN_2022` ;
- types et variantes Rust en PascalCase : `Token2022` ;
- valeurs JSON/TS explicitement concernées : `token_2022` avec attributs Serde et TS-RS ;
- codes persistés : `spl_token_2022` ;
- noms officiels externes : conserver leur orthographe publiée ;
- exceptions contractuelles Metaplex conservées : `token2022EmbeddedMetadata` et `token2022_embedded_metadata`.
### 2.1 HTTP JSON-RPC
- [x] Inventorier les occurrences actives `token2022`, `TOKEN2022`, `token_2022`, `TOKEN_2022`.
- [x] Classer les occurrences entre symboles internes, contrats externes, valeurs persistées, API, tests, IDL et documentation historique.
- [x] Renommer les symboles et modules internes vers `token_2022` / `TOKEN_2022`.
- [x] Conserver `Token2022` pour les types et variantes Rust.
- [x] Aligner Serde et TS-RS sur `token_2022` lorsque cette valeur appartient au contrat applicatif.
- [x] Renommer les identités persistées et runtime vers `spl_token_2022` et `kb-lib.*.token_2022`.
- [x] Purger les données dérivées puis reconstruire Core, Decode et Materialize depuis les 4 574 raws.
- [x] Valider 55 instructions Token-2022 décodées, 0 échec fonctionnel.
- [x] Vérifier les matrices actives ; corriger la dernière commande historique dans `SPL_TOKEN_2022_MATRIX.json`.
- [x] Découpler les assertions structurelles des matrices des compteurs globaux et volatils de `cargo test`.
- [ ] Réauditer progressivement chaque matrice active lors de la reprise de sa surface ; les preuves opérateur restent informatives et les invariants doivent être dérivés des lignes de matrice et des registres compilés.
- [ ] Refaire laudit Python de nomenclature lors de la stabilisation finale des helpers de migration.
- [x] Remplacer le viewer JSON du résultat par un `textarea readonly`.
- [x] Fixer la hauteur.
- [x] Activer le scroll interne.
- [x] Garantir exactement un bouton Copier pour la sortie principale.
- [x] Garantir exactement un bouton Effacer pour la sortie principale.
- [x] Vider le buffer TypeScript lors de leffacement.
- [ ] Tester JSON, scalaire, texte, erreur et résultat vide.
- [x] Restaurer le gabarit desktop à deux colonnes : requête à gauche, endpoints et résultat à droite.
# 2. Frontend et application desktop
### 2.2 WebSocket
## 2.1 Menu, contrôles et HTML
- [x] Afficher les messages dans un composant texte/log.
- [x] Fixer la hauteur et le scroll interne.
- [x] Garantir une seule paire Copier/Effacer pour la sortie Messages.
- [x] Borner le débit et la taille des notifications envoyées à lUI pour éviter les freezes.
- [x] Conserver le payload complet sous forme JSON compacte dans les logs de debug avant formatage et troncage UI.
- [x] Conserver les messages pendant la session active.
- [x] Restaurer laffichage après fermeture/réouverture de la fenêtre.
- [x] Restaurer le gabarit desktop à deux colonnes : souscription à gauche, statut/endpoints/messages à droite.
- [x] Appliquer `base64` par défaut aux souscriptions `accountSubscribe` et `programSubscribe` lorsque lencodage est absent, sans écraser un encodage explicite.
- [ ] Décider après test runtime si Statut et Endpoints WebSocket restent textuels ou deviennent des viewers JSON structurés ; supprimer alors tout bouton Copier redondant fourni par le viewer.
- [x] Ordre principal du menu corrigé : Configuration, Transport et collecte, Pipeline, SQL, Exécution.
- [ ] Vérifier une dernière fois les séparateurs du menu.
- [ ] Supprimer les entrées de menu, boutons, onglets et liens sans backend accessible.
- [ ] Vérifier quune sortie ne possède quune seule paire de contrôles Copier/Effacer.
- [x] Vérifier toutes les balises HTML après les derniers remaniements ; les quatre conteneurs finaux manquants ont été refermés et le parseur HTML local ne signale plus de déséquilibre.
- [ ] Vérifier que chaque option HTML correspond à une commande Tauri et à un scénario backend réellement accessible.
### 2.3 Backfill et autocomplétion
## 2.2 Viewers et journaux
- [x] Garder Program ID librement éditable.
- [x] Ajouter un autocomplétion non bloquant depuis le registre public `kb-program-ids`.
- [ ] Ajouter le même autocomplétion Program ID au filtre « programme déjà indexé » dExtraction core.
- [ ] Ajouter ultérieurement les autocomplétions Token et Pool lorsque leurs tables de référence existeront.
- [x] HTTP utilise un composant texte borné pour le résultat brut.
- [x] WebSocket utilise un composant texte/log borné et persistant pendant la session.
- [x] Extraction Core place paramètres, journaux et résultats dans une structure cohérente.
- [x] Réserver les viewers JSON au JSON structuré nécessitant exploration ou formatage ; HTTP endpoints/résultat et WebSocket statut/endpoints utilisent désormais `@andypf/json-viewer`.
- [x] Utiliser des textareas pour texte brut, logs et diagnostics concaténés ; les messages WebSocket restent textuels avec Copier/Effacer.
- [ ] Vérifier ce contrat dans Decode replay, Exécution Solana Core et Exécution SPL.
- [x] Convertir Statut et Endpoints WebSocket en viewers JSON structurés après contrôle runtime.
### 2.4 Journaux généraux et viewers
## 2.3 Fenêtres SQL
- [x] Vérifier Backfill HTTP en runtime.
- [x] Vérifier Extraction core en runtime après correction du gabarit pleine largeur.
- [ ] Vérifier Exécution Solana Core.
- [ ] Vérifier Exécution SPL.
- [x] Vérifier Decode replay en runtime et conserver les échecs Loader/Metaplex comme anomalies fonctionnelles à corriger.
- [x] Vérifier HTTP en runtime.
- [x] Vérifier WebSocket en runtime.
- [x] Placer les paramètres dExtraction core dans les accordéons.
- [x] Placer les journaux et résultats globaux dExtraction core sous les accordéons.
- [ ] Réserver le viewer JSON au JSON structuré.
- [ ] Utiliser des textareas pour texte brut, logs et diagnostics concaténés.
- [x] Fixer la hauteur du viewer JSON dExtraction core.
- [ ] Étendre la vérification des journaux/viewers aux fenêtres Exécution Solana Core, Exécution SPL et Decode replay.
### 2.5 Fenêtres SQL
- [x] Relever temporairement le plafond de résultats de 5 000 à 100 000 pour les campagnes de migration.
- [ ] Ajouter ultérieurement une pagination SQL/IPC serveur avant les volumes massifs.
- [x] Écrire les CSV dans `<workspace>/data/exports_csv`, indépendamment du répertoire courant Tauri.
- [ ] Corriger la valeur de repli TypeScript `maximumReplayCandidateLimit = 5_000` vers `100_000`.
- [x] Valider quun export produit `data/exports_csv/replay_transactions.csv`.
- [ ] Mettre toutes les fenêtres SQL, sauf Replay Candidates, sur une seule colonne pleine largeur.
- [ ] Mettre les tables sur toute la largeur.
- [x] Replay Candidates accepte temporairement jusquà 100 000 résultats.
- [x] Les CSV sont écrits dans `<workspace>/data/exports_csv`.
- [x] Export `replay_transactions.csv` validé.
- [ ] Mettre les autres fenêtres SQL sur une seule colonne pleine largeur lorsque ce nest pas déjà le cas.
- [x] Rendre le journal des annotations responsive avec DataTables, pagination, recherche et scroll horizontal borné au wrapper.
- [ ] Limiter le scroll horizontal au wrapper de table.
- [ ] Vérifier toutes les balises HTML.
- [ ] Vérifier boutons, onglets et liens.
## 3. Configuration et environnement
## 2.4 Rappels non bloquants
- [x] Déplacer les autocomplétions futures, la pagination SQL/IPC et la résolution configurable du chemin `kb-store` vers `docs/IDEA_REMINDERS.md`.
# 3. Configuration, environnement et secrets
Préparation engagée avant la campagne Devnet `0.1.0-pre.062`; la validation runtime complète reste à effectuer pendant cette campagne.
- [x] Conserver `HELIUS_API_KEY` comme variable Helius canonique déjà utilisée par la configuration.
- [x] Séparer les bases runtime avec `KB_POSTGRES_MAINNET_URL` et `KB_POSTGRES_DEVNET_URL`.
- [x] Conserver `KB_POSTGRES_TEST_URL` comme contrat existant des tests dintégration PostgreSQL.
- [x] Faire de `.env.example` lunique modèle dotenv versionné et ignorer tous les `.env*` réels.
- [x] Faire pointer `local_devnet` vers la variable Devnet et les deux profils Mainnet vers la variable Mainnet.
- [ ] Confirmer que seul `kb-config` charge `.env`.
- [ ] Confirmer la priorité environnement du processus.
- [ ] Confirmer `KB_ENV_FILE`.
- [ ] Confirmer le `.env` racine par défaut.
- [ ] Confirmer `${VAR}`.
- [ ] Confirmer `${VAR:-fallback}`.
- [ ] Confirmer labsence non fatale pour les services optionnels.
- [ ] Vérifier que les diagnostics ne révèlent aucun secret.
- [ ] Vérifier que `kb-pipeline-demo-scenarios` ne dépend pas directement de `dotenvy`.
- [ ] Valider réellement `HELIUS_API_KEY` depuis `.env`.
- [ ] Garder la résolution de chemin de base `kb-store` dans le backlog documenté.
- [ ] Confirmer lordre de priorité des variables du processus, de `KB_ENV_FILE`, du `.env` racine et des valeurs de configuration.
- [ ] Confirmer le comportement de `${VAR}`.
- [ ] Confirmer le comportement de `${VAR:-fallback}`.
- [ ] Confirmer que labsence de secrets pour les services optionnels reste non fatale.
- [ ] Vérifier que les diagnostics et logs ne révèlent aucun secret.
- [ ] Confirmer que `kb-pipeline-demo-scenarios` ne dépend pas directement de `dotenvy`.
- [ ] Valider réellement la résolution de `HELIUS_API_KEY` depuis `.env`.
## 4. Logging
# 4. Logging
- [ ] Maintenir la console active pour `local_devnet`.
- [ ] Maintenir la console active pour `mainnet_research`.
- [ ] Maintenir la console active pour `mainnet`.
- [ ] Supprimer les routes Bot2 obsolètes.
- [ ] Vérifier les cibles `kb-lib.decoder.*`.
- [ ] Vérifier les cibles `kb-lib.executor.*`.
- [ ] Vérifier les cibles `kb-lib.materializer.*`.
- [ ] Vérifier `kb-store`, `kb-config`, `kb-logging`, `kb-onchain-transport`, `kb-pipeline`, `kb-wallet` et `kb-app-demo-desktop`.
- [ ] Vérifier quaucun ancien répertoire de logs de crate supprimée nest recréé.
- [x] Console runtime observée sur le profil `mainnet_research`.
- [ ] Confirmer la console active pour `local_devnet`.
- [ ] Confirmer la console active pour `mainnet`.
- [ ] Vérifier labsence de routes Bot2 réellement obsolètes.
- [ ] Vérifier les targets `kb-lib.decoder.*`.
- [ ] Vérifier les targets `kb-lib.executor.*`.
- [ ] Vérifier les targets `kb-lib.materializer.*`.
- [ ] Vérifier quaucun ancien répertoire de logs correspondant à une crate supprimée nest recréé.
## 5. Options SPL et Token-2022
# 5. Tauri et séparation des responsabilités
- [ ] Comparer chaque option de `demo_execution_spl.html` aux scénarios réellement supportés.
- [ ] Comparer les options aux branches de `tauri.rs`.
- [x] Les principales commandes Tauri ont été déplacées vers leurs modules fonctionnels.
- [ ] Auditer `tauri.rs` et vérifier quil ne conserve que lenregistrement et des wrappers minces.
- [ ] Déplacer toute logique Decode replay, Backfill, SQL replay ou Exécution encore substantielle hors de `tauri.rs`.
- [ ] Vérifier les wrappers restants après ce dernier déplacement.
- [ ] Garantir que les tests unitaires résident dans les modules fonctionnels, pas dans les wrappers Tauri.
- [x] Fermeture explicite et Clippy propres sur létat `pre.061`.
- [ ] Revalider timeout HTTP et arrêt global de lapplication lors de la campagne finale runtime.
# 6. PostgreSQL et reconstruction
- [x] Tables raw et dérivées classées.
- [x] Script `reset_derived_store_keep_raw.sql` corrigé avec `TRUNCATE ... RESTART IDENTITY`.
- [x] `kb_sol_raw_transactions` conservée.
- [x] `kb_sol_obs_transaction_observations` classée comme acquisition à conserver lors des futurs resets.
- [x] La perte des anciennes observations de la base de démonstration actuelle est acceptée ; aucune restauration nest requise.
- [x] Extraction Core complète des 4 574 raws validée.
- [x] Replay complet des décodeurs enregistrés validé.
- [x] Matérialisation sans erreur de ledger validée.
- [x] Compteurs et anomalies du replay analysés.
- [ ] Créer `kb-store/maintenance/README.md`.
- [ ] Documenter précisément les tables conservées, les tables dérivées et lordre de reconstruction.
- [ ] Documenter le contrôle des index et contraintes après recréation du schéma.
- [ ] Documenter la future transition vers une nouvelle base alimentée en temps réel par worker, complétée par backfills ciblés ou automatisés.
# 7. Parité fonctionnelle avant Metaplex Executor
Lobjectif nest pas de produire un rapport historique Bot2 permanent. Il faut confirmer que le périmètre requis est présent et utilisable dans Bot3.
## 7.1 Décodage et matérialisation
- [x] Solana Core : replay réel validé sur la base de démonstration.
- [x] SPL Memo : replay réel validé.
- [x] SPL Token classique : replay réel validé.
- [x] SPL ATA : replay réel validé.
- [x] SPL Token-2022 : replay réel validé.
- [ ] ElGamal Registry : obtenir une fixture ou campagne réelle de décodage dinstruction et détat.
- [x] Extraction Core : campagne complète validée.
- [x] Replay : campagne complète validée.
- [x] Matérialisation : aucune erreur de matérialiseur observée.
- [x] PostgreSQL : reconstruction et persistance validées.
- [x] Identifier les 3 erreurs de campagne résiduelles comme timeouts transitoires du pool PostgreSQL, sans échec final de décodeur persisté.
- [x] Séparer dans le résumé `failedInputs` des erreurs dorchestration ou de stockage via `processingErrorInputs`.
- [ ] Dimensionner le pool et ajouter un retry borné pour les timeouts transitoires avant la campagne finale.
## 7.2 Transport et infrastructure
- [x] Backfill HTTP validé en runtime.
- [x] HTTP JSON-RPC validé en runtime.
- [x] WebSocket validé en runtime.
- [x] Logging validé sur `mainnet_research`.
- [x] Configuration principale chargée et utilisée en runtime.
- [ ] Valider les profils `local_devnet` et `mainnet` lors de la campagne finale.
### 7.2.1 Stabilisation frontend avant `0.1.0-pre.062`
- [x] Corriger les quatre conteneurs HTML finaux signalés par RustRover.
- [x] Remplacer les favicons absentes par `imgs/logo.png`.
- [x] Valider visuellement les fenêtres Config, HTTP, WebSocket, Backfill, Core extraction, Decode replay et SQL.
- [x] Séparer les JSON viewers des sorties textuelles et conserver Copier/Effacer sur les sorties sans viewer selon leur volatilité.
- [x] Rendre le journal des annotations responsive et paginé avec DataTables.
- [x] Étendre DataTables aux tableaux de diagnostic SQL.
- [x] Corriger les avertissements frontend connus : API Rollup `names`, exception locale, initialiseur redondant et sélecteur de custom element.
- [ ] Revalider le frontend en runtime après application du dernier correctif.
# 7.3 Exécution
- [ ] Vérifier Exécution Solana Core via la fenêtre desktop et les scénarios Devnet.
- [ ] Vérifier Exécution SPL via la fenêtre desktop et les scénarios Devnet.
- [ ] Comparer les options de `demo_execution_spl.html` aux scénarios réellement supportés.
- [ ] Supprimer les options mortes.
- [ ] Remplacer les valeurs internes `token_2022` par `token2022`.
- [ ] Inventorier chaque variable `TOKEN_2022_*`.
- [ ] Marquer les variables conservées pour compatibilité externe.
- [ ] Marquer les variables limitées aux scénarios de démonstration.
- [ ] Documenter les futurs remplacements par configuration ou structure typée.
- [ ] Raccorder ou documenter `execute_devnet_spl_token_lifecycle` sil reste non exposé par lapplication.
- [ ] Vérifier simulation, envoi, progression, résumé et diagnostics.
- [ ] Vérifier replay post-exécution et matérialisation pour chaque famille supportée.
## 5.1 Wrappers Tauri
# 8. Guide Devnet des exécuteurs
- [x] Déplacer la logique complète de `splash_frontend_ready` dans `splash.rs` et conserver un wrapper privé mince dans `tauri.rs`.
- [x] Inventorier toutes les fonctions `#[tauri::command]` de `tauri.rs` et mesurer les blocs de 20 lignes ou plus.
- [x] Déplacer options, exécution et annulation dExtraction core dans `demo_core_extraction.rs`.
- [x] Mutualiser les ouvertures de fenêtres via un helper privé strictement Tauri dans `tauri.rs`.
- [ ] Déplacer progressivement la logique Decode replay, Backfill, SQL replay et Exécution hors de `tauri.rs`.
- [x] Vérifier les wrappers Extraction core et Splash.
- [ ] Vérifier les autres wrappers Tauri après leur migration progressive.
- [ ] Ajouter ou conserver les tests unitaires dans les modules fonctionnels, pas dans les wrappers.
Créer une documentation dédiée, distincte des README généraux :
## 5.2 Câblage des scénarios Devnet
- [x] Créer la première version de `docs/DEVNET_EXECUTION_GUIDE.md` avant les tests ; la compléter et la corriger pendant les campagnes Devnet.
- [ ] Documenter la création en ligne de commande dun wallet de démonstration.
- [ ] Documenter la récupération de la pubkey.
- [x] Imposer lutilisation dun faucet Web pour financer le wallet Devnet ; ne pas dépendre de `solana airdrop`, non fonctionnel dans lenvironnement de validation.
- [ ] Documenter les champs à saisir dans linterface desktop.
- [ ] Documenter chaque scénario Solana Core étape par étape.
- [ ] Documenter chaque scénario SPL étape par étape.
- [ ] Documenter les préconditions, comptes, signers, frais estimés et résultats attendus.
- [ ] Documenter le replay et les projections à vérifier après chaque exécution.
- [ ] Ajouter ensuite les scénarios Metaplex Token Metadata.
- [x] Confirmer que `kb-app-demo-desktop` appelle `kb-pipeline-demo-scenarios` pour System transfer.
- [x] Confirmer le câblage Memo.
- [x] Confirmer le câblage SPL Token classique.
- [x] Confirmer le câblage SPL ATA.
- [x] Confirmer le câblage SPL Token-2022.
- [x] Confirmer que ces workflows ne sont pas dupliqués dans `kb-pipeline`.
- [ ] Vérifier que chaque option HTML correspond à un scénario backend accessible.
- [ ] Vérifier simulation, envoi, progression, résumé et diagnostics en runtime Devnet.
- [ ] Vérifier le replay post-exécution et la matérialisation pour chaque famille.
- [ ] Raccorder ou documenter le workflow `execute_devnet_spl_token_lifecycle`, présent dans la crate mais non exposé par lapplication desktop.
# 8.1 Convention et admission des IDL
## 6. Cycle de vie WebSocket
- [x] Documenter la convention `<PROGRAM_ID>.<protocol_type>.<protocol_code>[.<version>].json` dans `idls/001.README.md`.
- [x] Renommer lIDL active Metaplex Token Metadata avec le segment `metadata`.
- [x] Conserver le contenu JSON des IDL strictement inchangé.
- [x] Décider que la classification et le renommage des autres IDL seront effectués au moment où leur décodeur ou exécuteur devient actif.
- [ ] Maintenir progressivement un inventaire des sources, versions ou commits des IDL actives.
- [x] Vérifier quaucun pool WebSocket nest créé au démarrage.
- [x] Vérifier la création paresseuse au premier accès.
- [x] Vérifier le stockage du pool dans `AppState`.
- [x] Vérifier la survie de la session après fermeture de `demo_ws`.
- [x] Vérifier la récupération de létat à la réouverture.
- [ ] Vérifier la fermeture explicite.
- [ ] Vérifier le timeout.
- [ ] Vérifier larrêt global de lapplication.
- [x] Vérifier que la fermeture de la fenêtre nappelle jamais la déconnexion globale.
# 8.1 Ordre metadata après validation des exécuteurs existants
## 7. Initialisation PostgreSQL et splash
- [ ] Créer le pipeline metadata général et la fenêtre desktop spécialisée `demo_execution_metadata`.
- [ ] Traiter dabord SPL Token Metadata incorporé à Token-2022.
- [ ] Traiter ensuite le programme Metaplex Token Metadata et son exécuteur.
- [ ] Décider ensuite de la création de `kb-offchain-transport` comme transport off-chain général : metadata HTTP(S)/IPFS/Arweave, prix et taux, APIs Jupiter et autres fournisseurs ; évaluer séparément les opérations off-chain mutables.
- [x] Charger lenvironnement.
- [x] Charger et valider la configuration.
- [x] Initialiser le logging.
- [x] Initialiser le pool HTTP.
- [x] Se connecter à PostgreSQL et confirmer la disponibilité du profil `mainnet_research`.
- [x] Appeler `initialize_postgres_schema_for_startup` après disponibilité du frontend splash.
- [x] Appeler `emit_sql_startup_table_report`.
- [x] Relier `emit_sql_startup_error`.
- [x] Relier `emit_sql_startup_splash`.
- [x] Ouvrir `main` seulement après le rapport PostgreSQL et le fade-out.
- [x] Fermer le splash après le statut final.
- [x] Ne pas initialiser WebSocket dans cette séquence.
- [x] Rendre les zones du splash scrollables sans afficher leurs barres de défilement.
- [x] Garder automatiquement le dernier log et le dernier message visibles.
- [x] Afficher connexion, schéma, nombre de tables, tables manquantes et statut final.
- [ ] Supprimer lécrasement artificiel de `auto_initialize_schema` à `false` dans le chemin du splash et respecter la valeur du profil actif.
- [x] Valider visuellement les messages intermédiaires, louverture de `main`, labsence de scrollbar visible et lauto-scroll ; conserver le fade CSS Tauri/Linux comme limitation visuelle non bloquante.
# 9. Metaplex Token Metadata — décodeur
## 8. Purge contrôlée des données dérivées
- [x] IDL JSON local présent et renommé selon `<PROGRAM_ID>.<protocol_type>.<protocol_code>.json`.
- [x] Six erreurs réelles isolées : 5 `create_metadata_account_v3`, 1 `transfer`.
- [x] Cause des faux échecs identifiée : comparaison stricte incorrecte des privilèges globaux avec les metas CPI.
- [x] Validation corrigée pour exiger les privilèges nécessaires sans refuser les privilèges supplémentaires.
- [x] Replay ciblé : 6 décodées, 0 échec.
- [x] Loader : transactions échouées, payloads tronqués et variantes inconnues distingués.
- [ ] Comparer systématiquement runtime, IDL local, builders et interface officielle pour les variantes couvertes.
- [ ] Vérifier les comptes optionnels et variantes legacy.
- [ ] Ajouter des fixtures issues des six transactions réelles sans dépendre de la base runtime.
- [ ] Étendre le replay Metaplex à un corpus plus large que les six signatures de correction.
- [ ] Vérifier les comptes Metaplex et leurs rôles sur instructions externes et CPI.
- [ ] Fermer explicitement la matrice du décodeur Metaplex avant de commencer son exécuteur.
- [x] Inventorier les tables via les migrations `kb-store` 0001 à 0004.
- [x] Classer `kb_sol_raw_transactions` et `kb_sol_obs_transaction_observations` comme acquisition raw ; classer core, ledger, decode, coverage et matérialisation comme dérivés reconstructibles.
- [x] Confirmer quaucune table actuellement définie par `kb-store` ne reste ambiguë pour cette reconstruction.
- [x] Confirmer que le schéma courant est initialisé par les listes SQL idempotentes de `kb-store` et non par une table `_sqlx_migrations` active.
- [ ] Corriger `kb-store/maintenance/reset_derived_store_keep_raw.sql` pour conserver explicitement les deux tables dacquisition et utiliser une stratégie `TRUNCATE ... RESTART IDENTITY` pour les tables dérivées.
- [x] Conserver `kb_sol_raw_transactions` avec 4 574 transactions et remettre tous les `processing_state` à `received`.
- [ ] Restaurer ou accepter explicitement la perte des anciennes lignes de `kb_sol_obs_transaction_observations` supprimées pendant la reconstruction manuelle.
- [x] Recréer manuellement toutes les tables manquantes depuis les scripts SQL de `kb-store`.
- [x] Vérifier avant reprise que toutes les tables Core contiennent zéro ligne.
- [x] Vérifier avant reprise que `kb_sol_ops_processing_ledger` est vide.
- [x] Vérifier avant reprise que les 4 574 raws sont sélectionnables avec létat `received`.
- [x] Purger les tables core, ledger, decode, coverage et matérialisation dérivées.
- [x] Encadrer la reconstruction manuelle par une démarche contrôlée sans toucher aux transactions raw.
- [x] Ajouter des vérifications avant reprise : compteurs raw, Core et ledger.
- [ ] Documenter précisément les tables conservées et la politique de reconstruction dans `kb-store/maintenance/README.md`.
- [ ] Relancer lextraction core sur les 4 574 raws.
- [ ] Relancer tous les décodeurs.
- [ ] Relancer la matérialisation.
- [ ] Valider les compteurs et erreurs.
- [ ] Contrôler la reconstruction de chaque projection attendue.
# 10. Metaplex Token Metadata — exécuteur et Devnet
### 8.1 Anomalies observées avant reconstruction
- [ ] Auditer les instructions Loader immuables/v4 dun octet qui échouent actuellement comme `*_tag_truncated`, notamment lorsque la transaction porte `UnsupportedProgramId`.
- [ ] Décider, signature réelle à lappui, si ces formes doivent être `Unsupported`/`Ignored` plutôt que `Failed`.
- [ ] Auditer les flags signer/writable Metaplex réels avant dassouplir les contrats de comptes.
- [ ] Comparer les signatures Metaplex en échec avec Bot2 `0.4.7-pre.035` et le contrat officiel.
## 9. Jalon fonctionnel Bot2 `0.4.6`
- [ ] Solana Core équivalent et validé.
- [ ] SPL Memo équivalent et validé.
- [ ] SPL Token classique équivalent et validé.
- [ ] SPL ATA équivalent et validé.
- [ ] SPL Token-2022 équivalent et validé.
- [ ] ElGamal Registry équivalent et validé.
- [ ] Backfill équivalent et validé.
- [ ] Extraction core équivalente et validée.
- [ ] Replay équivalent et validé.
- [ ] Matérialisation équivalente et validée.
- [ ] Exécution supportée équivalente et validée.
- [ ] Scénarios devnet historiques validés.
- [ ] HTTP et WebSocket validés.
- [ ] PostgreSQL validé.
- [ ] Logging validé.
- [ ] Configuration validée.
- [ ] Produire un rapport explicite de parité `0.4.6` avant toute clôture Metaplex.
## 10. Inventaire IDL
- [ ] Créer `docs/IDL_SOURCES.md`.
- [ ] Inventorier chaque IDL local.
- [ ] Indiquer protocole et program ID.
- [ ] Indiquer source officielle.
- [ ] Indiquer version ou commit lorsquils sont connus.
- [ ] Indiquer chemin local, statut et usage.
- [ ] Documenter les notes de compatibilité.
- [ ] Ne pas inventer dIDL absent.
- [ ] Référencer lIDL Metaplex existant sans le retélécharger.
## 11. Metaplex Token Metadata — décodeur
- [ ] Extraire toutes les erreurs Metaplex réelles.
- [ ] Regrouper par instruction et type déchec.
- [ ] Isoler `create_metadata_account_v3`.
- [ ] Isoler `transfer`.
- [ ] Comparer runtime, IDL local, builders et interface officielle.
- [ ] Corriger signer et writable flags.
- [ ] Gérer comptes optionnels et variantes legacy.
- [ ] Distinguer transactions échouées, payloads tronqués et variantes inconnues.
- [ ] Ajouter des fixtures issues de transactions réelles.
- [ ] Relancer le replay complet Metaplex.
- [ ] Obtenir zéro faux échec de metas.
## 12. Metaplex Token Metadata — exécuteur et devnet
Étape fonctionnelle suivante.
- [ ] Définir les opérations exécutables et celles restant decode-only.
- [ ] Compléter les intents typés.
- [ ] Compléter les builders.
- [ ] Valider lordre des comptes.
- [ ] Valider signers et writable flags.
- [ ] Borner explicitement les variantes supportées.
- [ ] Comparer chaque builder aux builders officiels.
- [ ] Valider lordre exact des comptes.
- [ ] Valider signer et writable flags.
- [ ] Gérer les comptes optionnels et variantes supportées.
- [ ] Ajouter les politiques de sécurité.
- [ ] Imposer simulation-first.
- [ ] Ajouter lestimation des coûts.
- [ ] Ajouter la validation post-exécution.
- [ ] Ajouter les tests unitaires.
- [ ] Comparer aux builders officiels.
- [ ] Compléter la matrice de couverture.
- [ ] Ajouter des scénarios devnet explicites.
- [ ] Interdire lexécution par défaut sur mainnet.
- [ ] Afficher plan, signers, simulation et résultat.
- [ ] Effectuer un replay post-exécution.
- [ ] Interdire lenvoi mainnet par défaut.
- [ ] Ajouter limites de coût, estimation des frais et plafond de dépense.
- [ ] Ajouter validation post-exécution.
- [ ] Ajouter tests unitaires et matrice de couverture.
- [ ] Ajouter scénarios Devnet explicites dans `kb-pipeline-demo-scenarios`.
- [ ] Exposer les scénarios supportés dans lapplication desktop.
- [ ] Afficher plan, signers, simulation, envoi et résultat.
- [ ] Effectuer le replay post-exécution.
- [ ] Vérifier décodage et matérialisation.
- [ ] Afficher les diagnostics.
- [ ] Afficher des diagnostics bornés.
## 13. Clippy et Tauri
# 11. Anchor
- [ ] Traiter Clippy seulement après le fonctionnel Metaplex.
- [ ] Identifier précisément les expansions de macros Tauri concernées par `question_mark_used`.
- [ ] Éviter un `allow` global.
- [ ] Documenter toute exception locale et sa portée.
- [ ] Obtenir un Clippy propre ou un écart borné et reproductible.
À traiter après clôture complète de Metaplex Token Metadata et avant les protocoles applicatifs.
## 14. Documentation finale et versionnement
- [ ] Définir la stratégie dexploitation des IDL Anchor locaux.
- [ ] Définir les contrats génériques de discriminants, comptes et événements.
- [ ] Définir les limites entre décodage générique Anchor et décodeurs spécialisés par protocole.
- [ ] Ajouter tests et documentation avant intégration de Pump.fun, Raydium, Meteora, Jupiter ou autres protocoles Anchor.
- [ ] Rendre les README génériques et indépendants de la migration.
- [ ] Retirer les numéros de version des README.
- [ ] Retirer le récit Bot2 vers Bot3 des README actifs.
- [ ] Créer `USAGES.md` pour chaque crate publique.
- [ ] Documenter API, types, traits, fonctions, builders, exemples, invariants, erreurs, limites et intégrations.
- [ ] Ajouter des roadmaps par crate uniquement lorsquelles apportent une valeur réelle.
- [ ] Conserver au plus une courte note historique.
- [ ] Ne passer à `0.4.7` quaprès parité `0.4.6`, Metaplex complet, replay validé et documentation terminée.
- [ ] Mettre à jour `CHANGELOG.md` uniquement lors de cette validation explicite.
# 12. Documentation finale
## 15. Validation finale
Cette section ne commence quaprès validation des exécuteurs actuels et clôture fonctionnelle Metaplex.
## 12.1 README
- [ ] Réécrire le README racine pour décrire uniquement Bot3 et son architecture actuelle.
- [ ] Réécrire le README de chaque crate pour expliquer son rôle, ses responsabilités et ses limites.
- [ ] Ajouter des liens vers les documents spécialisés pertinents.
- [ ] Retirer le récit de migration Bot2 → Bot3 des documents actifs.
- [ ] Retirer les listes dévolution par version des README.
- [ ] Lorsquune fonctionnalité évolue, modifier le paragraphe fonctionnel correspondant au lieu dajouter une entrée chronologique.
## 12.2 Usage des APIs et binaires
- [ ] Créer un `USAGE.md` dans chaque crate publique ou binaire pertinent.
- [ ] Lister les APIs publiques réellement destinées aux consommateurs.
- [ ] Fournir des exemples Rust compilables ou quasi compilables.
- [ ] Documenter les types, traits, fonctions, builders, erreurs, invariants et limites.
- [ ] Documenter les commandes et options des binaires.
- [ ] Documenter les workflows dintégration entre crates.
- [ ] Éviter de recopier mécaniquement toute lAPI interne.
## 12.3 Documentation issue de Bot2
- [ ] Inventorier les documents Bot2 encore fonctionnellement pertinents.
- [ ] Réécrire leur contenu pour larchitecture, les noms et les règles Bot3.
- [ ] Ne conserver aucune formulation laissant penser que Bot3 dépend conceptuellement de Bot2.
- [ ] Supprimer les documents de migration devenus inutiles, dont cette checklist.
## 12.4 IDL
Lancien bloc `docs/IDL_SOURCES.md` nest pas un prérequis autonome puisque les IDL sont déjà stockés localement.
- [ ] Ajouter dans la documentation technique existante un inventaire léger des IDL réellement présents sous `idls/`.
- [ ] Pour chaque IDL utilisé, indiquer protocole, Program ID, source, version/commit connu, chemin local et usage.
- [ ] Ne pas inventer de source ou de version absente.
# 13. Versionnement final
- [ ] Clôturer toutes les tâches fonctionnelles de cette checklist.
- [ ] Terminer la documentation finale.
- [ ] Vérifier quaucun document actif ne présente Bot2 comme dépendance historique nécessaire.
- [ ] Aligner les versions du workspace Bot3 sur `0.4.7`.
- [ ] Mettre à jour `CHANGELOG.md` avec létat fonctionnel final, sans dupliquer les README.
- [ ] Produire larchive finale selon `docs/DELTA_WORKFLOW.md`.
- [ ] Supprimer `KHADHROONY_BOT3_MIGRATION_CLOSURE_TODO.md` après validation explicite de la clôture.
# 14. Validation finale
- [ ] `cargo fmt --all`.
- [ ] `cargo check -p kb-config`.
- [ ] `cargo test -p kb-config` (44/45 passaient ; contrat de route groupée `kb-pipeline` corrigé dans la prochaine prerelease).
- [ ] `cargo check -p kb-pipeline-demo-scenarios`.
- [ ] `cargo test -p kb-pipeline-demo-scenarios`.
- [ ] `cargo check -p kb-store`.
- [ ] `cargo test -p kb-store`.
- [ ] `cargo check -p kb-lib`.
- [ ] `cargo test -p kb-lib`.
- [x] `cargo check -p kb-app-demo-desktop`.
- [x] `cargo test -p kb-app-demo-desktop` : 115 tests réussis.
- [x] `cargo check --workspace`.
- [ ] `cargo test --workspace`.
- [x] `python3 scripts/audit_rust_workspace_rules.py` après `pre.058-fix-002`.
- [x] `cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json` : démarrage, splash, PostgreSQL, fenêtres et export CSV validés.
- [ ] `cargo clippy --all-targets` en dernier.
- [ ] `cargo check --workspace`.
- [ ] `cargo clippy --all-targets`.
- [ ] `python3 scripts/audit_rust_workspace_rules.py`.
- [ ] Vérifier les bindings TS-RS régénérés.
- [ ] Vérifier labsence de secrets dans larchive.
- [ ] Vérifier labsence de `target`, `node_modules`, `dist`, logs, bases, `.env`, `Cargo.lock`, `package-lock.json` et bindings générés exclus par les règles de livraison.
- [ ] Valider toutes les fenêtres desktop.
- [ ] Valider HTTP, WebSocket, Backfill, Core extraction, Decode replay et SQL.
- [ ] Valider Exécution Solana Core et Exécution SPL sur Devnet.
- [ ] Valider Metaplex Executor et replay post-exécution sur Devnet.
- [ ] Valider configuration, logging et PostgreSQL sur les profils requis.
- [ ] Vérifier que les protocoles applicatifs différés sont documentés hors de cette checklist.
## 16. Critères de clôture
# 15. Critères de clôture
- [ ] Toutes les crates compilent.
- [ ] Tous les tests workspace passent.
- [ ] Audit Rust propre.
- [ ] Audit TS-RS propre.
- [ ] Aucun chemin Bot2 supprimé encore actif.
- [ ] Toutes les fenêtres fonctionnent.
- [ ] WebSocket persistant validé.
- [ ] `.env` et Helius validés.
- [ ] PostgreSQL et splash validés.
- [ ] Données dérivées purgées et reconstruites.
- [ ] Niveau `0.4.6` restauré.
- [ ] UI JSON/texte cohérente.
- [ ] Aucun contrôle Copier/Effacer dupliqué.
- [ ] Journaux hors accordéon.
- [ ] Fenêtres SQL dimensionnées.
- [ ] Routes de logs obsolètes supprimées.
- [ ] Console active.
- [ ] Inventaire IDL terminé.
- [ ] Zéro faux échec Metaplex de metas.
- [ ] Exécuteur et démos Metaplex validés.
- [ ] Clippy/Tauri finalisés.
- [ ] Documentation et `USAGES.md` terminés.
- [ ] Passage à `0.4.7` justifié.
- [ ] Aucun import ou chemin dancienne crate ne subsiste.
- [ ] Convention Token-2022 définitivement appliquée et, si nécessaire, données dérivées migrées ou rejouées.
- [ ] Tauri ne contient plus de logique métier substantielle.
- [ ] UI sans contrôle mort ou dupliqué.
- [ ] Configuration et secrets validés.
- [ ] Logging propre sur tous les profils requis.
- [ ] Reconstruction PostgreSQL documentée et reproductible.
- [ ] Solana Core, SPL, Metaplex Token Metadata et Anchor au niveau requis avant protocoles applicatifs.
- [ ] Exécuteurs supportés validés sur Devnet.
- [ ] Documentation active entièrement réécrite pour Bot3.
- [ ] `USAGE.md` disponibles pour les surfaces publiques et binaires.
- [ ] Workspace aligné sur `0.4.7`.
- [ ] Cette checklist est supprimée.

View File

@@ -1,8 +1,59 @@
<!-- file: ROADMAP.md -->
<!-- version: 17 -->
<!-- version: 19 -->
# ROADMAP — khadhroony-bot3
## Séquence fonctionnelle après clôture de la migration
Cette séquence reprend la logique du roadmap historique tout en ladaptant aux frontières Bot3. Elle prévaut sur les formulations anciennes encore présentes plus bas.
### A. Clôture desktop et guide opérateur
- [ ] Terminer laudit HTML, JSON viewers, textareas, tables responsives et contrôles Copier/Effacer.
- [ ] Créer le guide Devnet avant la campagne de tests, puis le corriger pendant chaque validation réelle.
- [ ] Valider les exécuteurs déjà disponibles : Solana Core, Memo v4, SPL Token classique, ATA, Token-2022 et registre ElGamal.
- [ ] Vérifier simulation, envoi, confirmation, replay post-exécution et matérialisation depuis les fenêtres desktop.
### B. Socle metadata général
- [ ] Créer un pipeline metadata générique commun aux metadata on-chain SPL et Metaplex.
- [ ] Définir les contrats de lecture détat, préflight, exécution, validation post-exécution et replay.
- [ ] Ajouter une fenêtre desktop spécialisée `demo_execution_metadata` pour sélectionner la famille metadata, le scénario, les comptes et le mode simulation/envoi.
- [ ] Garder les adapters Tauri minces et placer les scénarios Devnet dans `kb-pipeline-demo-scenarios`.
### C. SPL Token Metadata incorporées à Token-2022
Cette étape précède le programme Metaplex Token Metadata, conformément à la progression SPL du roadmap historique.
- [ ] Fermer la couverture de `spl-token-metadata-interface` et des metadata TLV incorporées à Token-2022.
- [ ] Compléter lexécuteur des opérations metadata incorporées supportées.
- [ ] Ajouter préflight, sécurité, simulation-first, validation post-exécution et matérialisation.
- [ ] Ajouter les scénarios Devnet dans la fenêtre `demo_execution_metadata`.
- [ ] Vérifier la coexistence sans confusion avec Metaplex Token Metadata.
### D. Programme Metaplex Token Metadata
- [ ] Fermer définitivement le décodeur et les matérialisateurs à partir de lIDL locale, des interfaces officielles et de fixtures réelles.
- [ ] Implémenter les intents et builders exécutables, avec inventaire explicite des variantes decode-only.
- [ ] Raccorder lexécuteur au pipeline metadata général.
- [ ] Ajouter les scénarios Devnet Metaplex dans `demo_execution_metadata`.
- [ ] Valider replay et matérialisation après chaque transaction.
### E. Transport off-chain général
- [ ] Décider après le socle metadata de la création de `kb-offchain-transport`.
- [ ] Définir cette crate comme une façade générale des lectures réseau non Solana RPC, et non comme une crate limitée aux metadata.
- [ ] Prévoir des modules séparés pour les URI de metadata HTTP(S)/IPFS/Arweave, les prix et taux de référence SOL/USD, SOL/EUR et SOL/CHF, les APIs Jupiter et les futurs fournisseurs off-chain.
- [ ] Définir des contrats communs de timeout, retry borné, cache, validation de taille/type, provenance, fraîcheur et diagnostics.
- [ ] Décider séparément si certaines actions off-chain mutables ou authentifiées sont admises ; ne pas mélanger lecture publique, exécution distante et exécution on-chain.
- [ ] Ne jamais intégrer les lectures off-chain dans les décodeurs déterministes ni dans le replay canonique on-chain.
### F. Reprise protocolaire
- [ ] Stabiliser ensuite le socle Anchor/IDL.
- [ ] Reprendre Pump.fun, puis Raydium, Meteora, Jupiter et les autres AMM/launchpads selon les priorités du roadmap historique.
## 0.1.0 — Consolidation du workspace
- [x] Créer les dix crates initiales du workspace avec le nom canonique `kb-wallet`.
@@ -25,7 +76,7 @@
- [ ] Porter simulation, envoi et confirmation réseau complets.
- [ ] Adapter `kb-pipeline` aux nouveaux chemins publics.
- [ ] Adapter `kb-app-demo` et rétablir les validations fonctionnelles.
- [ ] Créer ultérieurement une crate off-chain dédiée au fetch borné HTTP/IPFS/Arweave des URI de metadata, séparée des décodeurs, matérialisateurs et du replay canonique on-chain.
- [ ] Créer ultérieurement une crate off-chain générale pour les lectures HTTP/IPFS/Arweave, prix, APIs de protocoles et autres sources non Solana RPC, séparée des décodeurs, matérialisateurs et du replay canonique on-chain.
- [ ] Réorganiser les chemins dexport TSRS de `kb-lib` dans une tranche dédiée, en conservant `../frontend/ts/bindings/` comme préfixe de base.
- [ ] Auditer rétrospectivement la couverture historique des décodeurs et matérialisateurs.

View File

@@ -1,5 +1,5 @@
<!-- file: config/README.md -->
<!-- version: 14 -->
<!-- version: 15 -->
# Configuration locale
@@ -21,6 +21,20 @@ Ce dossier contient les exemples et le schéma de configuration JSON.
- `example.config.json` : exemple complet avec profils `local_devnet`, `mainnet_research` et `mainnet`.
- `schema.config.json` : JSON Schema de validation du fichier de configuration.
## Variables denvironnement de lexemple
`example.config.json` conserve la topologie des profils et référence les valeurs locales avec des placeholders :
```text
HELIUS_API_KEY
KB_POSTGRES_MAINNET_URL
KB_POSTGRES_DEVNET_URL
```
`KB_POSTGRES_TEST_URL` nest pas utilisé par un profil runtime : il reste réservé aux tests dintégration PostgreSQL. Le profil `local_devnet` utilise `KB_POSTGRES_DEVNET_URL`; les profils `mainnet_research` et `mainnet` utilisent `KB_POSTGRES_MAINNET_URL`. Les trois bases doivent être distinctes.
Le fichier réel `.env` reste local et ignoré par Git. `.env.example` est le seul modèle dotenv versionné.
## Phase `0.3.x`
`0.3.x` utilise les endpoints HTTP des profils de recherche existants pour :

View File

@@ -977,42 +977,42 @@
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_debug",
"name": "file_kb-lib_decoder_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/devnet/kb-lib/decoder/spl/token2022/debug.log",
"path": "logs/devnet/kb-lib/decoder/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_info",
"name": "file_kb-lib_decoder_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/devnet/kb-lib/decoder/spl/token2022/info.log",
"path": "logs/devnet/kb-lib/decoder/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_error",
"name": "file_kb-lib_decoder_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/devnet/kb-lib/decoder/spl/token2022/error.jsonl",
"path": "logs/devnet/kb-lib/decoder/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
@@ -1133,42 +1133,42 @@
]
},
{
"name": "file_kb-lib_executor_spl_token2022_debug",
"name": "file_kb-lib_executor_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/devnet/kb-lib/executor/spl/token2022/debug.log",
"path": "logs/devnet/kb-lib/executor/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_info",
"name": "file_kb-lib_executor_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/devnet/kb-lib/executor/spl/token2022/info.log",
"path": "logs/devnet/kb-lib/executor/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_error",
"name": "file_kb-lib_executor_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/devnet/kb-lib/executor/spl/token2022/error.jsonl",
"path": "logs/devnet/kb-lib/executor/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
}
],
@@ -1195,7 +1195,7 @@
"enabled": true,
"backend": "postgres",
"postgres": {
"url": "postgres://solana:solana@localhost:5432/solana",
"url": "${KB_POSTGRES_DEVNET_URL}",
"max_connections": 8,
"connect_timeout_ms": 5000,
"auto_initialize_schema": true
@@ -2395,42 +2395,42 @@
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_debug",
"name": "file_kb-lib_decoder_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token2022/debug.log",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_info",
"name": "file_kb-lib_decoder_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token2022/info.log",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_error",
"name": "file_kb-lib_decoder_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token2022/error.jsonl",
"path": "logs/mainnet_research/kb-lib/decoder/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
@@ -2551,42 +2551,42 @@
]
},
{
"name": "file_kb-lib_executor_spl_token2022_debug",
"name": "file_kb-lib_executor_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/mainnet_research/kb-lib/executor/spl/token2022/debug.log",
"path": "logs/mainnet_research/kb-lib/executor/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_info",
"name": "file_kb-lib_executor_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/mainnet_research/kb-lib/executor/spl/token2022/info.log",
"path": "logs/mainnet_research/kb-lib/executor/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_error",
"name": "file_kb-lib_executor_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/mainnet_research/kb-lib/executor/spl/token2022/error.jsonl",
"path": "logs/mainnet_research/kb-lib/executor/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
}
],
@@ -2613,7 +2613,7 @@
"enabled": true,
"backend": "postgres",
"postgres": {
"url": "postgres://solana:solana@localhost:5432/solana",
"url": "${KB_POSTGRES_MAINNET_URL}",
"max_connections": 16,
"connect_timeout_ms": 5000,
"auto_initialize_schema": true
@@ -4013,42 +4013,42 @@
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_debug",
"name": "file_kb-lib_decoder_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/mainnet/kb-lib/decoder/spl/token2022/debug.log",
"path": "logs/mainnet/kb-lib/decoder/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_info",
"name": "file_kb-lib_decoder_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/mainnet/kb-lib/decoder/spl/token2022/info.log",
"path": "logs/mainnet/kb-lib/decoder/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
"name": "file_kb-lib_decoder_spl_token2022_error",
"name": "file_kb-lib_decoder_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/mainnet/kb-lib/decoder/spl/token2022/error.jsonl",
"path": "logs/mainnet/kb-lib/decoder/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.decoder.spl.token2022"
"kb-lib.decoder.spl.token_2022"
]
},
{
@@ -4169,42 +4169,42 @@
]
},
{
"name": "file_kb-lib_executor_spl_token2022_debug",
"name": "file_kb-lib_executor_spl_token_2022_debug",
"enabled": true,
"sink": "file",
"level": "debug",
"path": "logs/mainnet/kb-lib/executor/spl/token2022/debug.log",
"path": "logs/mainnet/kb-lib/executor/spl/token_2022/debug.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_info",
"name": "file_kb-lib_executor_spl_token_2022_info",
"enabled": true,
"sink": "file",
"level": "info",
"path": "logs/mainnet/kb-lib/executor/spl/token2022/info.log",
"path": "logs/mainnet/kb-lib/executor/spl/token_2022/info.log",
"rotation": "daily",
"format": "human",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
},
{
"name": "file_kb-lib_executor_spl_token2022_error",
"name": "file_kb-lib_executor_spl_token_2022_error",
"enabled": true,
"sink": "file",
"level": "error",
"path": "logs/mainnet/kb-lib/executor/spl/token2022/error.jsonl",
"path": "logs/mainnet/kb-lib/executor/spl/token_2022/error.jsonl",
"rotation": "daily",
"format": "json",
"ansi": false,
"targets": [
"kb-lib.executor.spl.token2022"
"kb-lib.executor.spl.token_2022"
]
}
],
@@ -4231,7 +4231,7 @@
"enabled": true,
"backend": "postgres",
"postgres": {
"url": "postgres://solana:solana@localhost:5432/solana",
"url": "${KB_POSTGRES_MAINNET_URL}",
"max_connections": 16,
"connect_timeout_ms": 5000,
"auto_initialize_schema": true

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://khadhroony.local/schema/config.schema.json",
"title": "Khadhroony Bot2 configuration",
"title": "Khadhroony Bot3 configuration",
"type": "object",
"additionalProperties": false,
"required": [

View File

@@ -0,0 +1,110 @@
<!-- file: docs/DEVNET_EXECUTION_GUIDE.md -->
<!-- version: 3 -->
# Guide dexécution Devnet
## 1. Objet
Ce guide est créé avant la campagne Devnet puis corrigé pendant les essais réels. Il décrit uniquement les scénarios exposés par `kb-app-demo-desktop` et `kb-pipeline-demo-scenarios`.
## 2. Préparation du profil
1. Copier `.env.example` vers `.env` et renseigner au minimum `KB_POSTGRES_DEVNET_URL`.
2. Vérifier que `KB_POSTGRES_DEVNET_URL`, `KB_POSTGRES_MAINNET_URL` et `KB_POSTGRES_TEST_URL` désignent trois bases distinctes.
3. Sélectionner le profil `local_devnet` ou le profil Devnet explicitement autorisé dans `example.config.json`.
4. Vérifier que lenvoi mainnet reste désactivé.
5. Vérifier les plafonds de frais, de dépense et les politiques `simulation-first`.
6. Démarrer lapplication avec la configuration de développement attendue.
7. Contrôler dans la fenêtre Configuration que `local_devnet` utilise bien la base Devnet et non la base Mainnet.
## 3. Wallet de démonstration
Créer un wallet dédié avec les outils Solana installés localement, conserver le fichier hors du dépôt et vérifier ses permissions privées. Relever la pubkey sans copier la clé privée dans linterface ou les logs.
Champs à consigner pendant les tests :
- alias du wallet ;
- pubkey ;
- cluster ;
- solde initial ;
- source de financement Devnet ;
- date du test.
## 4. Financement Devnet
Le financement doit être réalisé avec un faucet Web Devnet. La commande `solana airdrop` nest pas considérée comme une procédure valide dans lenvironnement de validation. Fournir uniquement la pubkey au faucet, ne jamais transmettre le fichier du wallet ni sa clé privée, puis vérifier le solde via la fenêtre HTTP ou une lecture RPC non mutable.
## 5. Ordre des tests existants
### 5.1 Solana Core
- génération dun destinataire ;
- transfert System en simulation ;
- envoi après confirmation opérateur ;
- confirmation réseau ;
- extraction Core ciblée ;
- Decode replay ciblé ;
- vérification des projections.
### 5.2 SPL Memo v4
- saisir un texte borné ;
- vérifier le plan et les signers ;
- simuler ;
- envoyer ;
- confirmer ;
- vérifier lannotation de transaction et lidempotence du replay.
### 5.3 SPL Token classique
- préparer mint et comptes contrôlés ;
- exécuter les scénarios non destructifs avant le lifecycle complet ;
- documenter chaque signature et chaque solde brut avant/après ;
- vérifier replay et matérialisation.
### 5.4 ATA
- dériver lATA classique et Token-2022 ;
- simuler la création idempotente ;
- envoyer uniquement après contrôle du payer et du plafond de rent ;
- vérifier la projection lifecycle.
### 5.5 Token-2022 et registre ElGamal
- utiliser uniquement les scénarios explicitement disponibles dans linterface ;
- conserver les preuves de préflight, comptes, extensions et signers ;
- distinguer registre ElGamal et programme Token-2022 ;
- vérifier les projections admin, token, fee, metadata et risk attendues.
## 6. Future fenêtre Metadata
La fenêtre `demo_execution_metadata` sera ajoutée avec le pipeline metadata général. Lordre prévu est :
1. SPL Token Metadata incorporé à Token-2022 ;
2. programme Metaplex Token Metadata ;
3. éventuel enrichissement off-chain via `kb-offchain-transport`, sans couplage au replay canonique.
## 7. Preuves à conserver par scénario
- profil et cluster ;
- paramètres saisis ;
- plan exact ;
- signers requis ;
- estimation des frais ;
- résultat de simulation ;
- signature denvoi ;
- confirmation ;
- résumé dextraction/replay ;
- projections matérialisées ;
- diagnostics et écarts observés.
## 8. Critères de validation
Un scénario nest validé que si :
- la simulation réussit ;
- lenvoi est explicitement confirmé ;
- la confirmation réseau correspond à la signature ;
- le replay post-exécution ne produit ni échec fonctionnel ni erreur de traitement ;
- les projections attendues sont présentes et idempotentes ;
- le guide est corrigé lorsque le comportement réel diffère des étapes écrites.

32
docs/IDEA_REMINDERS.md Normal file
View File

@@ -0,0 +1,32 @@
<!-- file: docs/IDEA_REMINDERS.md -->
<!-- version: 2 -->
# Rappels didées
Ce document regroupe les améliorations utiles mais non bloquantes pour la clôture de la migration et pour la reprise du développement fonctionnel.
## Application desktop
- Ajouter une autocomplétion Token lorsque des tables de référence fiables existeront.
- Ajouter une autocomplétion Pool lorsque des tables de référence fiables existeront.
- Introduire une pagination SQL/IPC côté serveur avant lexploitation de volumes massifs.
- Étudier une résolution configurable du chemin de base utilisé par `kb-store`.
## Pipeline et PostgreSQL
- Dimensionner dynamiquement la concurrence Decode replay en fonction du pool PostgreSQL disponible.
- Ajouter un retry borné et observable pour les erreurs transitoires de pool PostgreSQL.
- Conserver dans les résumés des compteurs distincts pour les échecs fonctionnels, les erreurs de traitement ou de stockage, les entrées récupérées après retry et les échecs finaux.
- Étudier une persistance dédiée des erreurs transitoires qui surviennent avant quune ligne de ledger puisse être écrite.
## Documentation et outils
- Refaire les scripts Python daudit après stabilisation définitive de la structure, des targets et de la nomenclature.
- Maintenir un inventaire des IDL actives avec leur source, leur version ou commit, leur Program ID et les surfaces qui les utilisent.
## Transport off-chain des metadata
- Évaluer une crate `kb-offchain-transport` générale après le pipeline metadata : fetch HTTP(S)/IPFS/Arweave, prix SOL/USD-EUR-CHF, APIs Jupiter et autres fournisseurs non Solana RPC.
- Décider séparément si cette crate accepte uniquement des lectures ou aussi des opérations off-chain authentifiées/mutables, avec contrats de sécurité distincts.
- Borner tailles, types MIME, redirections, délais et schémas HTTP(S)/IPFS/Arweave.
- Ne pas coupler le fetch off-chain au décodage déterministe ni au replay canonique on-chain.

View File

@@ -1,39 +0,0 @@
# Classification des fixtures de test
## Objet
Ce document inventorie les données structurées actuellement stockées sous `docs/` alors qu'elles sont consommées par le code ou les tests. Le répertoire `docs/` reste réservé à la documentation destinée à une lecture humaine.
## Destination retenue
Les matrices partagées doivent être déplacées sous :
```text
test-fixtures/contract-matrices/
```
Le déplacement sera effectué dans une tranche fonctionnelle atomique avec la mise à jour de tous les chemins `include_str!`, des références documentaires et des tests concernés.
## Inventaire
| Fichier actuel | Consommateurs Rust détectés | Classification cible |
|---|---:|---|
| `docs/METAPLEX_TOKEN_METADATA_MATRIX.json` | 2 | fixture contractuelle partagée |
| `docs/NATIVE_SOLANA_DECODER_MATRIX.json` | 1 | fixture contractuelle partagée |
| `docs/NATIVE_SOLANA_EXECUTION_MATRIX.json` | 1 | fixture contractuelle partagée |
| `docs/SOLANA_STANDARD_RPC_MATRIX.json` | 1 | fixture contractuelle partagée |
| `docs/SPL_ASSOCIATED_TOKEN_ACCOUNT_MATRIX.json` | 4 | fixture contractuelle partagée |
| `docs/SPL_ELGAMAL_REGISTRY_MATRIX.json` | 0 | usage à confirmer avant déplacement |
| `docs/SPL_MEMO_MATRIX.json` | 3 | fixture contractuelle partagée |
| `docs/SPL_TOKEN2022_MATRIX.json` | 2 | fixture contractuelle partagée |
| `docs/SPL_TOKEN2022_VALIDATION_MATRIX.json` | 1 | fixture contractuelle partagée |
| `docs/SPL_TOKEN_MATRIX.json` | 2 | fixture contractuelle partagée |
## Contraintes de migration
- Ne pas déplacer un fichier sans mettre à jour tous ses consommateurs dans le même delta.
- Ne pas laisser une copie durable sous `docs/`.
- Conserver les noms actuels sauf justification explicite.
- Ajouter les suppressions sous forme de commandes `rm -- ...` dans `delta.md`.
- Exécuter les tests de chaque crate consommatrice après le déplacement.
- Les helpers d'audit restent en lecture seule et signalent uniquement les emplacements suspects.

View File

@@ -1,8 +1,62 @@
<!-- file: idls/001.README.md -->
<!-- version: 1 -->
<!-- version: 2 -->
# IDL locales
Ce répertoire contient les IDL locales utilisées comme sources de connaissance pour les décodeurs.
Ce répertoire contient les IDL téléchargées depuis des sources officielles ou de référence et utilisées pour auditer les décodeurs, matérialiseurs et exécuteurs.
Les fichiers JSON ne doivent pas être modifiés pour ajouter des commentaires, car le format JSON standard ne les supporte pas.
## Règle dadmission
Une IDL devient une source locale active lorsquun décodeur ou un exécuteur correspondant est développé. À ce moment-là, il faut :
1. télécharger lIDL utilisée ;
2. vérifier son Program ID et sa provenance ;
3. conserver son contenu JSON inchangé ;
4. la renommer selon la convention canonique ;
5. documenter sa version ou son commit lorsquils sont connus ;
6. ajouter des tests comparant, selon le périmètre disponible, lIDL, le runtime, les builders et linterface officielle.
Les fichiers JSON ne doivent pas recevoir de commentaires ni être reformattés uniquement pour satisfaire la documentation.
## Convention de nommage
Forme principale :
```text
<PROGRAM_ID>.<protocol_type>.<protocol_code>.json
```
Exemple actif :
```text
metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.metadata.metaplex_token_metadata.json
```
Lorsquil faut conserver plusieurs versions réellement distinctes dune même IDL :
```text
<PROGRAM_ID>.<protocol_type>.<protocol_code>.<version>.json
```
Suffixes admis, par ordre de préférence :
```text
v<semver>
commit-<short_hash>
slot-<deployment_slot>
date-YYYY-MM-DD
```
La version ne doit jamais être inventée. Tant quune seule IDL est conservée pour un programme, le suffixe de version reste facultatif.
## Classification
- `protocol_type` représente la famille fonctionnelle stable, par exemple `metadata`, `launchpad`, `amm`, `clmm`, `lending`, `router`, `vault` ou `orderbook`.
- `protocol_code` représente le protocole ou la surface exacte, par exemple `metaplex_token_metadata`.
- La classification est validée lors de limplémentation du décodeur ou de lexécuteur ; les IDL de référence non encore utilisées ne doivent pas être renommées massivement sur une classification incertaine.
## Intégrité
Le renommage du fichier est autorisé. Le contenu de lIDL doit rester identique à la source téléchargée.
Les graphies externes telles que `token2022`, les noms de types Anchor et les identifiants publiés dans lIDL ne doivent pas être adaptés à la nomenclature interne du workspace.

View File

@@ -1,13 +0,0 @@
# Metaplex Token Metadata IDL source
- Repository: `metaplex-foundation/mpl-token-metadata`
- Path: `idls/token_metadata.json`
- Branch used for this snapshot: `main`
- Program ID: `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`
- Git blob SHA observed during retrieval: `5df4a24f62c2743125be096cc174680790c92c18`
Refresh with:
```bash
scripts/fetch_metaplex_token_metadata_idl.sh
```

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_backfill.html -->
<!-- version: 6 -->
<!-- version: 7 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Backfill HTTP</title>
</head>
@@ -163,14 +163,14 @@
<textarea class="form-control font-monospace app-log-output mb-4" id="backfillLogOutput" readonly="">Aucune campagne exécutée.</textarea>
<div class="d-flex justify-content-between align-items-center mb-2">
<h2 class="h5 mb-0">Résumé JSON</h2>
<button class="btn btn-sm btn-outline-primary" id="copyBackfillSummaryButton" type="button">Copier</button>
</div>
<div class="app-json-viewer" id="backfillSummaryOutput"></div>
<div class="app-json-viewer" id="backfillSummaryOutput">{"status":"idle","message":"Aucune campagne exécutée."}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<footer class="app-footer bg-dark text-light">

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_config.html -->
<!-- version: 4 -->
<!-- version: 5 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Configuration</title>
</head>
@@ -47,7 +47,7 @@
<div class="card shadow-sm border-0 h-100">
<div class="card-body">
<h2 class="h5 card-title mb-3">Configuration active</h2>
<div id="activeProfileJson" class="app-json-viewer" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="activeProfileJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
</div>
</div>
</div>
@@ -56,7 +56,7 @@
<div class="card shadow-sm border-0 h-100">
<div class="card-body">
<h2 class="h5 card-title mb-3">Configuration complète</h2>
<div id="fullConfigJson" class="app-json-viewer" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="fullConfigJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
</div>
</div>
</div>
@@ -65,7 +65,7 @@
<div class="card shadow-sm border-0">
<div class="card-body">
<h2 class="h5 card-title mb-3">Schéma JSON embarqué</h2>
<div id="schemaJson" class="app-json-viewer" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="schemaJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_core_extraction.html -->
<!-- version: 8 -->
<!-- version: 10 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Extraction canonical vers core</title>
</head>
@@ -122,7 +122,8 @@
<div class="accordion-body">
<p class="text-body-secondary">Sélectionne les transactions raw ayant déjà au moins une instruction core résolue pour ce programme. Ce mode sert aux replays après changement de version ou de hash.</p>
<label class="form-label" for="coreExtractionProgramIdInput">Program ID</label>
<input class="form-control font-monospace mb-3" id="coreExtractionProgramIdInput" />
<input class="form-control font-monospace mb-3" id="coreExtractionProgramIdInput" list="coreExtractionProgramIdOptions" />
<datalist id="coreExtractionProgramIdOptions"></datalist>
<button class="btn btn-primary core-extraction-start-button" data-core-extraction-mode="program_id" type="button">Extraire par programme</button>
</div>
</div>
@@ -141,7 +142,7 @@
</div>
<div class="col-12 col-xl-5">
<h3 class="h6">Résumé JSON</h3>
<textarea class="form-control font-monospace" data-json-viewer="true" id="coreExtractionSummaryOutput" readonly="" style="height: 28rem; overflow-y: auto;">Aucun résultat.</textarea>
<textarea class="form-control font-monospace" data-json-viewer="true" id="coreExtractionSummaryOutput" readonly="" style="height: 28rem; overflow-y: auto;">{"status":"idle","message":"Aucun résultat."}</textarea>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb_app_demo/frontend/demo_decode_replay.html -->
<!-- version: 6 -->
<!-- version: 7 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Décodage et matérialisation</title>
</head>
@@ -117,9 +117,9 @@
<h2 class="h5">Journal</h2>
<textarea id="decodeReplayLogOutput" class="form-control font-monospace mb-3" rows="14" readonly>Aucune campagne exécutée.</textarea>
<h2 class="h5">Résumé</h2>
<textarea id="decodeReplaySummaryOutput" class="form-control font-monospace mb-3" rows="15" readonly data-json-viewer="true">Aucun résultat.</textarea>
<textarea id="decodeReplaySummaryOutput" class="form-control font-monospace mb-3" rows="15" readonly data-json-viewer="true">{"status":"idle","message":"Aucun résultat."}</textarea>
<h2 class="h5">Diagnostics</h2>
<textarea id="decodeReplayDiagnosticsOutput" class="form-control font-monospace" rows="18" readonly data-json-viewer="true">Diagnostics non chargés.</textarea>
<textarea id="decodeReplayDiagnosticsOutput" class="form-control font-monospace" rows="18" readonly data-json-viewer="true">{"status":"idle","message":"Diagnostics non chargés."}</textarea>
</div>
</div>
</div>
@@ -139,7 +139,7 @@
</div>
<p id="annotationJournalStatus" class="text-body-secondary mb-3">Annotations non chargées.</p>
<div class="table-responsive">
<table class="table table-sm table-hover align-middle mb-0">
<table id="annotationJournalTable" class="table table-sm table-hover align-middle mb-0 w-100">
<thead>
<tr>
<th>Slot</th>

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_execution_solana_core.html -->
<!-- version: 9 -->
<!-- version: 10 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Exécution Solana Core Devnet</title>
</head>
@@ -72,14 +72,14 @@
<div class="col-12 col-xl-7">
<div class="card shadow-sm border-0">
<div class="card-body">
<h2 class="h5 mb-3">Résumé</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionSummaryOutput" readonly="" rows="14">Aucun résultat.</textarea>
<h2 class="h5 mb-3">Résumé</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionSummaryOutput" readonly="" rows="14">{"status":"idle","message":"Aucun résultat."}</textarea>
</div>
</div>
<div class="card shadow-sm border-0 mt-4">
<div class="card-body">
<h2 class="h5">Plan exact</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionPlanOutput" readonly="" rows="12">Aucun plan.</textarea>
<h2 class="h5 mt-3">Simulation exacte</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionSimulationOutput" readonly="" rows="12">Aucune simulation.</textarea>
<h2 class="h5 mt-3">Confirmation et replay</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionDiagnosticsOutput" readonly="" rows="12">Aucun diagnostic.</textarea>
<h2 class="h5">Plan exact</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionPlanOutput" readonly="" rows="12">{"status":"idle","message":"Aucun plan."}</textarea>
<h2 class="h5 mt-3">Simulation exacte</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionSimulationOutput" readonly="" rows="12">{"status":"idle","message":"Aucune simulation."}</textarea>
<h2 class="h5 mt-3">Confirmation et replay</h2><textarea class="form-control font-monospace" data-json-viewer="true" id="executionDiagnosticsOutput" readonly="" rows="12">{"status":"idle","message":"Aucun diagnostic."}</textarea>
</div>
</div>
</div>
@@ -87,6 +87,7 @@
</div>
</div>
</div>
</div>
</main>
<footer class="app-footer bg-dark text-light">

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_execution_spl.html -->
<!-- version: 11 -->
<!-- version: 14 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Exécution SPL Devnet</title>
</head>
@@ -101,7 +101,7 @@
<div class="accordion-body">
<div class="mb-3">
<label class="form-label" for="memoMessageInput">Annotation UTF-8 exacte</label>
<textarea class="form-control" id="memoMessageInput" maxlength="566" rows="5">khadhroony-bot2 Memo v4 validation</textarea>
<textarea class="form-control" id="memoMessageInput" maxlength="566" rows="5">khadhroony-bot3 Memo v4 validation</textarea>
<div class="form-text">566 octets UTF-8 maximum. La matérialisation `transaction_annotation` et le second replay didempotence sont obligatoires après envoi.</div>
</div>
<div class="form-check form-switch mb-3">
@@ -168,7 +168,7 @@
<label class="form-label" for="ataTokenProgramSelect">Token Program cible</label>
<select class="form-select" id="ataTokenProgramSelect">
<option value="classic">SPL Token classique</option>
<option value="token2022">Token-2022</option>
<option value="token_2022">Token-2022</option>
</select>
</div>
<div class="col-12 col-md-6">
@@ -205,31 +205,31 @@
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="splToken2022DecoderHeading"><button aria-controls="splToken2022DecoderCollapse" aria-expanded="false" class="accordion-button collapsed" data-bs-target="#splToken2022DecoderCollapse" data-bs-toggle="collapse" type="button"><span class="d-flex flex-wrap align-items-center justify-content-between gap-2 w-100 me-2"><span>Exécution spl_token2022 — scénarios publics</span><span class="badge text-bg-success">Exécutable</span></span></button></h2>
<h2 class="accordion-header" id="splToken2022DecoderHeading"><button aria-controls="splToken2022DecoderCollapse" aria-expanded="false" class="accordion-button collapsed" data-bs-target="#splToken2022DecoderCollapse" data-bs-toggle="collapse" type="button"><span class="d-flex flex-wrap align-items-center justify-content-between gap-2 w-100 me-2"><span>Exécution spl_token_2022 — scénarios publics</span><span class="badge text-bg-success">Exécutable</span></span></button></h2>
<div aria-labelledby="splToken2022DecoderHeading" class="accordion-collapse collapse" data-bs-parent="#decoderExecutionAccordion" id="splToken2022DecoderCollapse">
<div class="accordion-body">
<div class="alert alert-info">Chaque opération est simulée sur le message exact avant toute signature. Les scénarios sont indépendants et réutilisent la fixture chargée dans les deux terminaux.</div>
<div class="d-grid mb-3"><button class="btn btn-outline-secondary" id="loadToken2022FixtureButton" type="button">Charger la fixture Token-2022</button></div>
<div class="form-text mb-3" id="token2022FixtureHelp">Aucune fixture chargée.</div>
<div class="mb-3"><label class="form-label" for="token2022ScenarioSelect">Scénario</label><select class="form-select" id="token2022ScenarioSelect">
<option value="token2022_mint_to_checked">MintToChecked</option>
<option value="token2022_transfer_checked">TransferChecked</option>
<option value="token2022_approve_checked">ApproveChecked</option>
<option value="token2022_revoke">Revoke</option>
<option value="token2022_burn_checked">BurnChecked</option>
<option value="token2022_freeze_account">FreezeAccount</option>
<option value="token2022_thaw_account">ThawAccount</option>
<option value="token2022_close_destination">CloseAccount</option>
<div class="form-text mb-3" id="token_2022FixtureHelp">Aucune fixture chargée.</div>
<div class="mb-3"><label class="form-label" for="token_2022ScenarioSelect">Scénario</label><select class="form-select" id="token_2022ScenarioSelect">
<option value="token_2022_mint_to_checked">MintToChecked</option>
<option value="token_2022_transfer_checked">TransferChecked</option>
<option value="token_2022_approve_checked">ApproveChecked</option>
<option value="token_2022_revoke">Revoke</option>
<option value="token_2022_burn_checked">BurnChecked</option>
<option value="token_2022_freeze_account">FreezeAccount</option>
<option value="token_2022_thaw_account">ThawAccount</option>
<option value="token_2022_close_destination">CloseAccount</option>
</select></div>
<div class="mb-3"><label class="form-label" for="token2022SourceInput">Compte source / compte cible</label><input class="form-control font-monospace" id="token2022SourceInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token2022MintInput">Mint Token-2022</label><input class="form-control font-monospace" id="token2022MintInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token2022DestinationInput">Compte destination / destination lamports</label><input class="form-control font-monospace" id="token2022DestinationInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token2022DelegateInput">Delegate</label><input class="form-control font-monospace" id="token2022DelegateInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token2022AuthorityInput">Autorité</label><input class="form-control font-monospace" id="token2022AuthorityInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token2022FreezeAuthorityInput">Freeze authority</label><input class="form-control font-monospace" id="token2022FreezeAuthorityInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022SourceInput">Compte source / compte cible</label><input class="form-control font-monospace" id="token_2022SourceInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022MintInput">Mint Token-2022</label><input class="form-control font-monospace" id="token_2022MintInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022DestinationInput">Compte destination / destination lamports</label><input class="form-control font-monospace" id="token_2022DestinationInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022DelegateInput">Delegate</label><input class="form-control font-monospace" id="token_2022DelegateInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022AuthorityInput">Autorité</label><input class="form-control font-monospace" id="token_2022AuthorityInput" type="text" /></div>
<div class="mb-3"><label class="form-label" for="token_2022FreezeAuthorityInput">Freeze authority</label><input class="form-control font-monospace" id="token_2022FreezeAuthorityInput" type="text" /></div>
<div class="row g-3 mb-3">
<div class="col-8"><label class="form-label" for="token2022AmountInput">Montant brut</label><input class="form-control" id="token2022AmountInput" type="text" value="1" /></div>
<div class="col-4"><label class="form-label" for="token2022DecimalsInput">Décimales</label><input class="form-control" id="token2022DecimalsInput" max="255" min="0" type="number" value="9" /></div>
<div class="col-8"><label class="form-label" for="token_2022AmountInput">Montant brut</label><input class="form-control" id="token_2022AmountInput" type="text" value="1" /></div>
<div class="col-4"><label class="form-label" for="token_2022DecimalsInput">Décimales</label><input class="form-control" id="token_2022DecimalsInput" max="255" min="0" type="number" value="9" /></div>
</div>
<div class="d-grid gap-2 d-md-flex">
<button class="btn btn-outline-primary flex-fill" id="simulateToken2022Button" type="button">Préflight et simuler</button>
@@ -269,7 +269,7 @@
</h2>
<div class="accordion-collapse collapse" data-bs-parent="#executionDetailsAccordion" id="executionPlanCollapse">
<div class="accordion-body">
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionPlanOutput" readonly="" rows="16">Aucun plan.</textarea>
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionPlanOutput" readonly="" rows="16">{"status":"idle","message":"Aucun plan."}</textarea>
</div>
</div>
</div>
@@ -279,7 +279,7 @@
</h2>
<div class="accordion-collapse collapse" data-bs-parent="#executionDetailsAccordion" id="executionSimulationCollapse">
<div class="accordion-body">
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionSimulationOutput" readonly="" rows="16">Aucune simulation.</textarea>
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionSimulationOutput" readonly="" rows="16">{"status":"idle","message":"Aucune simulation."}</textarea>
</div>
</div>
</div>
@@ -289,7 +289,7 @@
</h2>
<div class="accordion-collapse collapse" data-bs-parent="#executionDetailsAccordion" id="executionDiagnosticsCollapse">
<div class="accordion-body">
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionDiagnosticsOutput" readonly="" rows="16">Aucun diagnostic.</textarea>
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionDiagnosticsOutput" readonly="" rows="16">{"status":"idle","message":"Aucun diagnostic."}</textarea>
</div>
</div>
</div>
@@ -411,7 +411,7 @@
<div class="card shadow-sm border-0 mt-4">
<div class="card-body">
<h2 class="h5 mb-3">Résumé</h2>
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionSummaryOutput" readonly="" rows="14">Aucun résultat.</textarea>
<textarea class="form-control font-monospace" data-json-viewer="true" id="executionSummaryOutput" readonly="" rows="14">{"status":"idle","message":"Aucun résultat."}</textarea>
</div>
</div>
<div class="card shadow-sm border-0 mt-4">
@@ -427,6 +427,7 @@
</div>
</div>
</div>
</main>
<footer class="app-footer bg-dark text-light">

View File

@@ -1,12 +1,12 @@
<!-- file: kb-app-demo-desktop/frontend/demo_http.html -->
<!-- version: 6 -->
<!-- version: 7 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — HTTP JSON-RPC</title>
</head>
@@ -61,23 +61,17 @@
<div class="col-12 col-xl-7">
<div class="card shadow-sm border-0 mb-4">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-2">
<h2 class="h5 card-title mb-0">Endpoints HTTP</h2>
<button id="copyHttpPoolButton" class="btn btn-sm btn-outline-secondary">Copier</button>
</div>
<textarea id="httpPoolOutput" class="form-control font-monospace" rows="10" readonly>Chargement...</textarea>
<h2 class="h5 card-title">Endpoints HTTP</h2>
<div id="httpPoolOutput" class="app-json-viewer">{"status":"loading","message":"Chargement des endpoints HTTP."}</div>
</div>
</div>
<div class="card shadow-sm border-0">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-2">
<h2 class="h5 card-title mb-0">Résultat</h2>
<div class="d-flex gap-2">
<button id="copyHttpResultButton" class="btn btn-sm btn-outline-secondary" type="button">Copier</button>
<button id="clearHttpResultButton" class="btn btn-sm btn-outline-secondary" type="button">Effacer</button>
</div>
<button id="clearHttpResultButton" class="btn btn-sm btn-outline-secondary" type="button">Effacer</button>
</div>
<textarea id="httpResultOutput" class="form-control font-monospace" style="height: 24rem; overflow-y: auto;" readonly>Aucune requête exécutée.</textarea>
<div id="httpResultOutput" class="app-json-viewer">{"status":"idle","message":"Aucune requête exécutée."}</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb_app_demo/frontend/demo_sql_diag.html -->
<!-- version: 3 -->
<!-- version: 4 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — SQL diagnostics</title>
</head>
@@ -64,7 +64,7 @@
<div class="card-body">
<h2 class="h5 card-title mb-3">Tables raw/core connues</h2>
<div class="table-responsive app-table-full-width">
<table class="table table-sm align-middle mb-0">
<table class="table table-sm align-middle mb-0" id="sqlDiagTable">
<thead>
<tr>
<th>Table</th>
@@ -88,7 +88,7 @@
<div class="card shadow-sm border-0">
<div class="card-body">
<h2 class="h5 card-title mb-3">Payload JSON</h2>
<div id="sqlDiagJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="sqlDiagJson" class="app-config-box app-json-viewer mb-0">{"status":"loading","message":"Chargement des données SQL."}</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb_app_demo/frontend/demo_sql_pg_core.html -->
<!-- version: 4 -->
<!-- version: 5 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — PostgreSQL core store</title>
</head>
@@ -51,7 +51,7 @@
<div class="card-body">
<h2 class="h5 card-title mb-3">Tables core</h2>
<div class="table-responsive app-table-full-width">
<table class="table table-sm align-middle mb-0">
<table class="table table-sm align-middle mb-0" id="sqlCoreTable">
<thead>
<tr>
<th>Table</th>
@@ -75,7 +75,7 @@
<div class="card shadow-sm border-0">
<div class="card-body">
<h2 class="h5 card-title mb-3">Payload JSON</h2>
<div id="sqlCoreJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="sqlCoreJson" class="app-config-box app-json-viewer mb-0">{"status":"loading","message":"Chargement des données SQL."}</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb_app_demo/frontend/demo_sql_pg_raw.html -->
<!-- version: 5 -->
<!-- version: 6 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — PostgreSQL canonical acquisition</title>
</head>
@@ -51,7 +51,7 @@
<div class="card-body">
<h2 class="h5 card-title mb-3">Transactions canoniques et observations</h2>
<div class="table-responsive app-table-full-width">
<table class="table table-sm align-middle mb-0">
<table class="table table-sm align-middle mb-0" id="sqlRawTable">
<thead>
<tr>
<th>Table</th>
@@ -75,7 +75,7 @@
<div class="card shadow-sm border-0">
<div class="card-body">
<h2 class="h5 card-title mb-3">Payload JSON</h2>
<div id="sqlRawJson" class="app-config-box app-json-viewer mb-0">Chargement...</div>
<div id="sqlRawJson" class="app-config-box app-json-viewer mb-0">{"status":"loading","message":"Chargement des données SQL."}</div>
</div>
</div>
</div>

View File

@@ -1,12 +1,12 @@
<!-- file: kb_app_demo/frontend/demo_sql_replay_candidates.html -->
<!-- version: 8 -->
<!-- version: 9 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/favicon.png">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Khadhroony Bot3 — Candidats de replay SQL</title>
</head>
@@ -431,6 +431,7 @@
</div>
</div>
</div>
</div>
</main>
<footer class="app-footer bg-dark text-light">

Some files were not shown because too many files have changed in this diff Show More