v0.1.0-pre.060

This commit is contained in:
2026-07-27 15:13:11 +02:00
parent 626385f9b6
commit c7bad46f50
12 changed files with 124 additions and 63 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: KHADHROONY_BOT3_MIGRATION_CLOSURE_TODO.md --> <!-- file: KHADHROONY_BOT3_MIGRATION_CLOSURE_TODO.md -->
<!-- version: 8 --> <!-- version: 9 -->
# Checklist détaillée de clôture de la migration `khadhroony-bot3` # Checklist détaillée de clôture de la migration `khadhroony-bot3`
@@ -105,15 +105,16 @@
- [x] Garder Program ID librement éditable. - [x] Garder Program ID librement éditable.
- [x] Ajouter un autocomplétion non bloquant depuis le registre public `kb-program-ids`. - [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. - [ ] Ajouter ultérieurement les autocomplétions Token et Pool lorsque leurs tables de référence existeront.
### 2.4 Journaux généraux et viewers ### 2.4 Journaux généraux et viewers
- [x] Vérifier Backfill HTTP en runtime. - [x] Vérifier Backfill HTTP en runtime.
- [ ] Vérifier Extraction core en runtime après correction du gabarit pleine largeur. - [x] Vérifier Extraction core en runtime après correction du gabarit pleine largeur.
- [ ] Vérifier Exécution Solana Core. - [ ] Vérifier Exécution Solana Core.
- [ ] Vérifier Exécution SPL. - [ ] Vérifier Exécution SPL.
- [ ] Vérifier Decode replay. - [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 HTTP en runtime.
- [x] Vérifier WebSocket en runtime. - [x] Vérifier WebSocket en runtime.
- [x] Placer les paramètres dExtraction core dans les accordéons. - [x] Placer les paramètres dExtraction core dans les accordéons.
@@ -125,6 +126,12 @@
### 2.5 Fenêtres SQL ### 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 toutes les fenêtres SQL, sauf Replay Candidates, sur une seule colonne pleine largeur.
- [ ] Mettre les tables sur toute la largeur. - [ ] Mettre les tables sur toute la largeur.
- [ ] Limiter le scroll horizontal au wrapper de table. - [ ] Limiter le scroll horizontal au wrapper de table.
@@ -210,7 +217,7 @@
- [x] Charger et valider la configuration. - [x] Charger et valider la configuration.
- [x] Initialiser le logging. - [x] Initialiser le logging.
- [x] Initialiser le pool HTTP. - [x] Initialiser le pool HTTP.
- [ ] Se connecter à PostgreSQL. - [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 `initialize_postgres_schema_for_startup` après disponibilité du frontend splash.
- [x] Appeler `emit_sql_startup_table_report`. - [x] Appeler `emit_sql_startup_table_report`.
- [x] Relier `emit_sql_startup_error`. - [x] Relier `emit_sql_startup_error`.
@@ -221,27 +228,39 @@
- [x] Rendre les zones du splash scrollables sans afficher leurs barres de défilement. - [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] Garder automatiquement le dernier log et le dernier message visibles.
- [x] Afficher connexion, schéma, nombre de tables, tables manquantes et statut final. - [x] Afficher connexion, schéma, nombre de tables, tables manquantes et statut final.
- [ ] Valider visuellement le fade-in, les messages intermédiaires, le fade-out et louverture de `main` sur le workspace réel. - [ ] 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.
## 8. Purge contrôlée des données dérivées ## 8. Purge contrôlée des données dérivées
- [ ] Inventorier les tables via `kb-store`. - [x] Inventorier les tables via les migrations `kb-store` 0001 à 0004.
- [ ] Classer chaque table en raw, nécessaire au replay, dérivée ou ambiguë. - [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.
- [ ] Bloquer la purge tant quune table reste ambiguë. - [x] Confirmer quaucune table actuellement définie par `kb-store` ne reste ambiguë pour cette reconstruction.
- [ ] Créer un script SQL versionné et idempotent. - [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.
- [ ] Conserver transactions, signatures et payloads RPC raw. - [ ] 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.
- [ ] Conserver toutes les données nécessaires à lextraction et au replay. - [x] Conserver `kb_sol_raw_transactions` avec 4 574 transactions et remettre tous les `processing_state` à `received`.
- [ ] Purger core dérivé, décodage, observations, coverage, diagnostics et états de replay dérivés. - [ ] Restaurer ou accepter explicitement la perte des anciennes lignes de `kb_sol_obs_transaction_observations` supprimées pendant la reconstruction manuelle.
- [ ] Purger annotations, événements matérialisés, token accounts, lifecycle, admin, fees, risk, compliance et staking dérivés. - [x] Recréer manuellement toutes les tables manquantes depuis les scripts SQL de `kb-store`.
- [ ] Exécuter la purge dans une transaction. - [x] Vérifier avant reprise que toutes les tables Core contiennent zéro ligne.
- [ ] Ajouter des vérifications avant/après. - [x] Vérifier avant reprise que `kb_sol_ops_processing_ledger` est vide.
- [ ] Documenter précisément les tables conservées. - [x] Vérifier avant reprise que les 4 574 raws sont sélectionnables avec létat `received`.
- [ ] Relancer lextraction core. - [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 tous les décodeurs.
- [ ] Relancer la matérialisation. - [ ] Relancer la matérialisation.
- [ ] Valider les compteurs et erreurs. - [ ] Valider les compteurs et erreurs.
- [ ] Contrôler la reconstruction de chaque projection attendue. - [ ] Contrôler la reconstruction de chaque projection attendue.
### 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` ## 9. Jalon fonctionnel Bot2 `0.4.6`
- [ ] Solana Core équivalent et validé. - [ ] Solana Core équivalent et validé.
@@ -345,7 +364,7 @@
- [x] `cargo check --workspace`. - [x] `cargo check --workspace`.
- [ ] `cargo test --workspace`. - [ ] `cargo test --workspace`.
- [x] `python3 scripts/audit_rust_workspace_rules.py` après `pre.058-fix-002`. - [x] `python3 scripts/audit_rust_workspace_rules.py` après `pre.058-fix-002`.
- [ ] `cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json`. - [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 clippy --all-targets` en dernier.
## 16. Critères de clôture ## 16. Critères de clôture

View File

@@ -1,5 +1,5 @@
<!-- file: kb_app_demo/frontend/demo_decode_replay.html --> <!-- file: kb_app_demo/frontend/demo_decode_replay.html -->
<!-- version: 5 --> <!-- version: 6 -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
@@ -39,7 +39,8 @@
<div class="row g-3"> <div class="row g-3">
<div class="col-12 col-lg-6"> <div class="col-12 col-lg-6">
<label class="form-label" for="decodeReplayProgramIdInput">Program ID exact</label> <label class="form-label" for="decodeReplayProgramIdInput">Program ID exact</label>
<input id="decodeReplayProgramIdInput" class="form-control font-monospace" placeholder="Vide = tous les programmes des décodeurs sélectionnés" /> <input id="decodeReplayProgramIdInput" class="form-control font-monospace" list="decodeReplayProgramIdOptions" placeholder="Vide = tous les programmes des décodeurs sélectionnés" />
<datalist id="decodeReplayProgramIdOptions"></datalist>
</div> </div>
<div class="col-12 col-lg-3"> <div class="col-12 col-lg-3">
<label class="form-label" for="decodeReplayStateSelect">État instruction</label> <label class="form-label" for="decodeReplayStateSelect">État instruction</label>

View File

@@ -1,5 +1,5 @@
<!-- file: kb_app_demo/frontend/demo_sql_replay_candidates.html --> <!-- file: kb_app_demo/frontend/demo_sql_replay_candidates.html -->
<!-- version: 7 --> <!-- version: 8 -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="fr"> <html lang="fr">
@@ -131,7 +131,7 @@
</div> </div>
<div class="col-6 col-md-3 col-xl-1"> <div class="col-6 col-md-3 col-xl-1">
<label for="transactionLimitInput" class="form-label">Limite</label> <label for="transactionLimitInput" class="form-label">Limite</label>
<input id="transactionLimitInput" class="form-control" type="number" min="1" max="5000" step="1" value="500" /> <input id="transactionLimitInput" class="form-control" type="number" min="1" max="100000" step="1" value="500" />
</div> </div>
<div class="col-6 col-md-3 col-xl-2"> <div class="col-6 col-md-3 col-xl-2">
<div class="form-check form-switch mb-2"> <div class="form-check form-switch mb-2">
@@ -206,7 +206,7 @@
</div> </div>
<div class="col-6 col-lg-1"> <div class="col-6 col-lg-1">
<label for="programLimitInput" class="form-label">Limite</label> <label for="programLimitInput" class="form-label">Limite</label>
<input id="programLimitInput" class="form-control" type="number" min="1" max="5000" step="1" value="500" /> <input id="programLimitInput" class="form-control" type="number" min="1" max="100000" step="1" value="500" />
</div> </div>
<div class="col-12 col-lg-2"> <div class="col-12 col-lg-2">
<div class="d-grid gap-2"> <div class="d-grid gap-2">
@@ -264,7 +264,7 @@
</div> </div>
<div class="col-6 col-lg-2"> <div class="col-6 col-lg-2">
<label for="mintLimitInput" class="form-label">Limite</label> <label for="mintLimitInput" class="form-label">Limite</label>
<input id="mintLimitInput" class="form-control" type="number" min="1" max="5000" step="1" value="500" /> <input id="mintLimitInput" class="form-control" type="number" min="1" max="100000" step="1" value="500" />
</div> </div>
<div class="col-12 col-lg-3"> <div class="col-12 col-lg-3">
<div class="d-grid d-sm-flex gap-2"> <div class="d-grid d-sm-flex gap-2">
@@ -322,7 +322,7 @@
</div> </div>
<div class="col-6 col-lg-2"> <div class="col-6 col-lg-2">
<label for="ownerLimitInput" class="form-label">Limite</label> <label for="ownerLimitInput" class="form-label">Limite</label>
<input id="ownerLimitInput" class="form-control" type="number" min="1" max="5000" step="1" value="500" /> <input id="ownerLimitInput" class="form-control" type="number" min="1" max="100000" step="1" value="500" />
</div> </div>
<div class="col-12 col-lg-3"> <div class="col-12 col-lg-3">
<div class="d-grid d-sm-flex gap-2"> <div class="d-grid d-sm-flex gap-2">
@@ -380,7 +380,7 @@
</div> </div>
<div class="col-6 col-lg-2"> <div class="col-6 col-lg-2">
<label for="accountLimitInput" class="form-label">Limite</label> <label for="accountLimitInput" class="form-label">Limite</label>
<input id="accountLimitInput" class="form-control" type="number" min="1" max="5000" step="1" value="500" /> <input id="accountLimitInput" class="form-control" type="number" min="1" max="100000" step="1" value="500" />
</div> </div>
<div class="col-12 col-lg-3"> <div class="col-12 col-lg-3">
<div class="d-grid d-sm-flex gap-2"> <div class="d-grid d-sm-flex gap-2">

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/frontend/ts/demo_decode_replay.ts // file: kb-app-demo-desktop/frontend/ts/demo_decode_replay.ts
// version: 5 // version: 6
import * as bootstrap from "bootstrap"; import * as bootstrap from "bootstrap";
import "simplebar"; import "simplebar";
@@ -279,6 +279,14 @@ async function loadOptions(): Promise<void> {
element<HTMLElement>("#decodeReplayVersionBadge").textContent = `Pipeline ${options.pipelineVersion}`; element<HTMLElement>("#decodeReplayVersionBadge").textContent = `Pipeline ${options.pipelineVersion}`;
element<HTMLInputElement>("#decodeReplayLimitInput").value = String(options.defaultLimit); element<HTMLInputElement>("#decodeReplayLimitInput").value = String(options.defaultLimit);
element<HTMLInputElement>("#decodeReplayConcurrencyInput").value = String(options.defaultMaxConcurrentInputs); element<HTMLInputElement>("#decodeReplayConcurrencyInput").value = String(options.defaultMaxConcurrentInputs);
const programOptions = element<HTMLDataListElement>("#decodeReplayProgramIdOptions");
programOptions.replaceChildren();
for (const program of options.programs) {
const option = document.createElement("option");
option.value = program.programId;
option.label = program.code;
programOptions.append(option);
}
const container = element<HTMLElement>("#decodeReplayDecoderList"); const container = element<HTMLElement>("#decodeReplayDecoderList");
container.innerHTML = ""; container.innerHTML = "";
for (const decoder of options.decoders) { for (const decoder of options.decoders) {

View File

@@ -94,7 +94,7 @@ let mintTable: Api<DemoSqlReplayEntityRow> | null = null;
let ownerTable: Api<DemoSqlReplayEntityRow> | null = null; let ownerTable: Api<DemoSqlReplayEntityRow> | null = null;
let accountTable: Api<DemoSqlReplayEntityRow> | null = null; let accountTable: Api<DemoSqlReplayEntityRow> | null = null;
let busyOperationCount = 0; let busyOperationCount = 0;
let maximumReplayCandidateLimit = 5_000; let maximumReplayCandidateLimit = 100_000;
function element<T extends HTMLElement>(selector: string): T { function element<T extends HTMLElement>(selector: string): T {
const value = document.querySelector<T>(selector); const value = document.querySelector<T>(selector);

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/demo_decode_replay.rs // file: kb-app-demo-desktop/src/demo_decode_replay.rs
// version: 29 // version: 30
//! Tauri commands and UI payloads for contextual instruction decode replay. //! Tauri commands and UI payloads for contextual instruction decode replay.
@@ -22,6 +22,20 @@ pub(crate) struct DemoDecodeReplayDecoderOption {
pub(crate) program_ids: std::vec::Vec<std::string::String>, pub(crate) program_ids: std::vec::Vec<std::string::String>,
} }
/// One known program suggested by the free-form Program ID field.
#[derive(Clone, Debug, serde::Serialize, TS)]
#[serde(rename_all = "camelCase")]
#[ts(
export,
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_decode_replay/DemoDecodeReplayProgramOption.ts"
)]
pub(crate) struct DemoDecodeReplayProgramOption {
/// Stable program code.
pub(crate) code: std::string::String,
/// Canonical program identifier.
pub(crate) program_id: std::string::String,
}
/// Initial options shown by the contextual decode replay demo. /// Initial options shown by the contextual decode replay demo.
#[derive(Clone, Debug, serde::Serialize, TS)] #[derive(Clone, Debug, serde::Serialize, TS)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@@ -36,6 +50,8 @@ pub(crate) struct DemoDecodeReplayOptionsPayload {
pub(crate) decoders: std::vec::Vec<crate::DemoDecodeReplayDecoderOption>, pub(crate) decoders: std::vec::Vec<crate::DemoDecodeReplayDecoderOption>,
/// Stable names of materializers currently registered by the demo. /// Stable names of materializers currently registered by the demo.
pub(crate) materializer_names: std::vec::Vec<std::string::String>, pub(crate) materializer_names: std::vec::Vec<std::string::String>,
/// Known programs offered as non-blocking autocomplete suggestions.
pub(crate) programs: std::vec::Vec<crate::DemoDecodeReplayProgramOption>,
/// Default bounded selection limit. /// Default bounded selection limit.
pub(crate) default_limit: u32, pub(crate) default_limit: u32,
/// Default maximum concurrent contextual inputs. /// Default maximum concurrent contextual inputs.

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/demo_sql_replay_candidates.rs // file: kb-app-demo-desktop/src/demo_sql_replay_candidates.rs
// version: 7 // version: 8
//! Read-only SQL replay candidate browser commands. //! Read-only SQL replay candidate browser commands.
@@ -266,18 +266,6 @@ pub(crate) fn validated_csv_file_name(
}; };
} }
pub(crate) fn csv_export_directory_from_current_dir(
current_dir: &std::path::Path,
) -> std::path::PathBuf {
let current_name = current_dir.file_name().and_then(std::ffi::OsStr::to_str);
if let (std::option::Option::Some("kb_app_demo_desktop"), std::option::Option::Some(parent)) =
(current_name, current_dir.parent())
{
return parent.join("data").join("exports_csv");
}
return current_dir.join("data").join("exports_csv");
}
pub(crate) async fn available_csv_export_path( pub(crate) async fn available_csv_export_path(
export_dir: &std::path::Path, export_dir: &std::path::Path,
file_name: &str, file_name: &str,
@@ -373,13 +361,6 @@ mod tests {
assert!(result.is_err()); assert!(result.is_err());
} }
#[test]
fn csv_export_directory_uses_workspace_root_from_demo_crate() {
let current_dir = std::path::Path::new("/tmp/khadhroony-bot2/kb_app_demo_desktop");
let result = crate::csv_export_directory_from_current_dir(current_dir);
assert_eq!(result, std::path::Path::new("/tmp/khadhroony-bot2/data/exports_csv"));
}
#[test] #[test]
fn csv_file_name_accepts_split_entity_exports() { fn csv_file_name_accepts_split_entity_exports() {
let mint_result = crate::validated_csv_file_name("replay_mints.csv"); let mint_result = crate::validated_csv_file_name("replay_mints.csv");

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/lib.rs // file: kb-app-demo-desktop/src/lib.rs
// version: 10 // version: 11
//! Tauri desktop demo application for `khadhroony-bot3`. //! Tauri desktop demo application for `khadhroony-bot3`.
@@ -95,6 +95,8 @@ pub(crate) use self::demo_decode_replay::DemoDecodeReplayDecoderOption;
pub(crate) use self::demo_decode_replay::DemoDecodeReplayObserver; pub(crate) use self::demo_decode_replay::DemoDecodeReplayObserver;
/// Internal demo decode replay item. /// Internal demo decode replay item.
pub(crate) use self::demo_decode_replay::DemoDecodeReplayOptionsPayload; pub(crate) use self::demo_decode_replay::DemoDecodeReplayOptionsPayload;
/// One known program suggested by the free-form Program ID field.
pub(crate) use self::demo_decode_replay::DemoDecodeReplayProgramOption;
/// Internal demo decode replay item. /// Internal demo decode replay item.
pub(crate) use self::demo_decode_replay::DemoDecodeReplayProgressPayload; pub(crate) use self::demo_decode_replay::DemoDecodeReplayProgressPayload;
/// Internal demo decode replay item. /// Internal demo decode replay item.
@@ -267,8 +269,6 @@ pub(crate) use self::demo_sql_replay_candidates::DemoSqlReplayTransactionRequest
pub(crate) use self::demo_sql_replay_candidates::DemoSqlReplayTransactionRow; pub(crate) use self::demo_sql_replay_candidates::DemoSqlReplayTransactionRow;
/// Resolves an available CSV path. /// Resolves an available CSV path.
pub(crate) use self::demo_sql_replay_candidates::available_csv_export_path; pub(crate) use self::demo_sql_replay_candidates::available_csv_export_path;
/// Resolves the CSV export directory.
pub(crate) use self::demo_sql_replay_candidates::csv_export_directory_from_current_dir;
/// Parses an entity-kind code. /// Parses an entity-kind code.
pub(crate) use self::demo_sql_replay_candidates::entity_kind_from_code; pub(crate) use self::demo_sql_replay_candidates::entity_kind_from_code;
/// Converts a PostgreSQL entity row. /// Converts a PostgreSQL entity row.

View File

@@ -1,5 +1,5 @@
// file: kb-app-demo-desktop/src/tauri.rs // file: kb-app-demo-desktop/src/tauri.rs
// version: 14 // version: 15
//! Tauri runtime assembly and private command wrappers. //! Tauri runtime assembly and private command wrappers.
@@ -270,6 +270,15 @@ fn demo_decode_replay_options(
return format!("{}@{}", identity.name, identity.version); return format!("{}@{}", identity.name, identity.version);
}) })
.collect::<std::vec::Vec<_>>(); .collect::<std::vec::Vec<_>>();
let programs = kb_program_ids::registered_program_ids()
.iter()
.map(|entry| {
return crate::DemoDecodeReplayProgramOption {
code: entry.code().to_string(),
program_id: entry.program_id().to_string(),
};
})
.collect();
let running = state.demo_decode_replay_running().load(std::sync::atomic::Ordering::Acquire); let running = state.demo_decode_replay_running().load(std::sync::atomic::Ordering::Acquire);
tracing::debug!( tracing::debug!(
target: crate::TRACING_TARGET, target: crate::TRACING_TARGET,
@@ -286,6 +295,7 @@ fn demo_decode_replay_options(
pipeline_version: kb_pipeline::DECODE_PIPELINE_VERSION.to_string(), pipeline_version: kb_pipeline::DECODE_PIPELINE_VERSION.to_string(),
decoders: decoder_options, decoders: decoder_options,
materializer_names, materializer_names,
programs,
default_limit: 100, default_limit: 100,
default_max_concurrent_inputs: 4, default_max_concurrent_inputs: 4,
running, running,
@@ -915,14 +925,7 @@ async fn export_demo_sql_replay_csv(
std::result::Result::Ok(value) => value, std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error), std::result::Result::Err(error) => return std::result::Result::Err(error),
}; };
let current_dir_result = std::env::current_dir(); let export_dir = crate::workspace_root_dir().join("data").join("exports_csv");
let current_dir = match current_dir_result {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => {
return std::result::Result::Err(format!("cannot resolve current directory: {error}"));
},
};
let export_dir = crate::csv_export_directory_from_current_dir(&current_dir);
let create_result = tokio::fs::create_dir_all(&export_dir).await; let create_result = tokio::fs::create_dir_all(&export_dir).await;
if let std::result::Result::Err(error) = create_result { if let std::result::Result::Err(error) = create_result {
return std::result::Result::Err(format!("cannot create CSV export directory: {error}")); return std::result::Result::Err(format!("cannot create CSV export directory: {error}"));

View File

@@ -0,0 +1,25 @@
-- file: kb-store/maintenance/reset_derived_store_keep_raw.sql
-- version: 1
-- Reset every derived Solana table while preserving canonical raw acquisition data.
-- Intended for controlled local/research rebuilds only.
-- Preserved tables:
-- - kb_sol_raw_transactions
-- - kb_sol_obs_transaction_observations
-- No CASCADE is used: unexpected dependencies fail loudly.
BEGIN;
DROP TABLE IF EXISTS kb_sol_mat_events;
DROP TABLE IF EXISTS kb_sol_decode_coverage_observations;
DROP TABLE IF EXISTS kb_sol_decode_coverage_declarations;
DROP TABLE IF EXISTS kb_sol_decode_events;
DROP TABLE IF EXISTS kb_sol_ops_processing_ledger;
DROP TABLE IF EXISTS kb_sol_core_balance_changes;
DROP TABLE IF EXISTS kb_sol_core_logs;
DROP TABLE IF EXISTS kb_sol_core_inner_instructions;
DROP TABLE IF EXISTS kb_sol_core_instructions;
DROP TABLE IF EXISTS kb_sol_core_account_keys;
DROP TABLE IF EXISTS kb_sol_core_transactions;
COMMIT;

View File

@@ -1,10 +1,10 @@
// file: kb-store/src/postgres/replay_candidates.rs // file: kb-store/src/postgres/replay_candidates.rs
// version: 1 // version: 2
//! Read-only replay candidate filters and PostgreSQL result rows. //! Read-only replay candidate filters and PostgreSQL result rows.
/// Maximum number of rows returned by one replay candidate query. /// Maximum number of rows returned by one replay candidate query.
pub const MAX_REPLAY_CANDIDATE_ROWS: u32 = 5_000; pub const MAX_REPLAY_CANDIDATE_ROWS: u32 = 100_000;
/// Program occurrence scope used while filtering replay candidates. /// Program occurrence scope used while filtering replay candidates.
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]

View File

@@ -280,6 +280,14 @@ Sauf Replay Candidates :
--- ---
### État `pre.060` des outils de replay
- plafond temporaire des listes SQL : `100000`;
- vraie pagination SQL/IPC reportée mais obligatoire avant les volumes massifs;
- export CSV ancré sur `<workspace>/data/exports_csv`;
- Program ID de Decode replay libre avec autocomplétion issue de `kb-program-ids`.
## 7. `.env` et configuration ## 7. `.env` et configuration
`kb-config` doit rester seul responsable de : `kb-config` doit rester seul responsable de :