From c0b319025690ba4a7660170b2d8907e487060871 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Fri, 4 Sep 2026 09:58:20 +0200 Subject: [PATCH] v0.3.8-pre.013 --- Cargo.toml | 4 +- README.md | 4 +- crates/ksp-app-store-desk/README.md | 106 +++++++++++++ crates/ksp-app-store-desk/USAGE.md | 149 ++++++++++++++++++ deltas/0.3.8/pre.013.md | 142 +++++++++++++++++ docs/000-README.md | 10 +- .../002-LAYERS_AND_DEPENDENCIES.md | 4 +- docs/architecture/003-COMPONENT_CONTRACTS.md | 4 +- docs/architecture/004-COMPONENT_INVENTORY.md | 4 +- docs/architecture/005-DEPENDENCY_GRAPH.md | 14 +- .../008-DATA_MATERIALIZATION_AND_STORE.md | 17 +- ...010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md | 7 +- docs/plans/000-README.md | 4 +- docs/plans/029-V0_3_8_STORE_DESK_PLAN.md | 20 ++- docs/validation/000-README.md | 3 +- docs/validation/025-V0_3_8_STORE_DESK.md | 56 ++++++- 16 files changed, 521 insertions(+), 27 deletions(-) create mode 100644 crates/ksp-app-store-desk/README.md create mode 100644 crates/ksp-app-store-desk/USAGE.md create mode 100644 deltas/0.3.8/pre.013.md diff --git a/Cargo.toml b/Cargo.toml index 13d3b23..3647a5e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 472 +# version: 473 [workspace] resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib"] [workspace.package] -version = "0.3.8-pre.12.fix.1" +version = "0.3.8-pre.13" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/README.md b/README.md index 54f535d..eb6cbc1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - + # Khadhroony Solana Project @@ -53,6 +53,8 @@ La couche RAW dispose d'une façade Store backend-neutral et d'un premier job hi `ksp-app-backfill-desk` fournit la surface desktop spécialisée de composition de ce runtime : sélection d'un scope historique et d'un rôle HTTP logique, validation backend des bornes, Start single-run, monitoring latest-value, Cancel ciblé et Resume in-session sur checkpoint Rust-only. L'application ouvre Transport et Store via leurs façades KSP, ne dépend d'aucun backend Store concret et n'expose ni URL/credential, ni payload RAW, ni checkpoint opaque au frontend. +`ksp-app-store-desk` fournit l'inspection desktop read-only du Store RAW via `ksp-store-lib` : health/runtime backend-neutral, tables server-side `RawTransaction` et `RawAccountState`, observations associées, détails avec previews bornées et lecture des états de rétention/tombstones. DataTables possède l'unique pagination visible de l'inspection random-access ; la pagination cursor/keyset des consumers machine reste distincte et intacte. + Ces contrats restent distincts des futurs workers continus : un job borné n'est ni un service worker ni un pipeline générique imposé aux autres couches. ## Points d'entrée diff --git a/crates/ksp-app-store-desk/README.md b/crates/ksp-app-store-desk/README.md new file mode 100644 index 0000000..7a2c0e1 --- /dev/null +++ b/crates/ksp-app-store-desk/README.md @@ -0,0 +1,106 @@ + + + +# `ksp-app-store-desk` + +`ksp-app-store-desk` est l’application desktop spécialisée d’inspection read-only du Store KSP. + +Elle reste une couche de composition Tauri : Config sélectionne le profil Store et Logging, `ksp-store-lib` possède la façade backend-neutral et les contrats d’inspection, et le backend physique reste entièrement masqué à l’application comme au frontend. + +## Package + +```text +package : ksp-app-store-desk +lib : ksp_app_store_desk_lib +bin : ksp-app-store-desk +``` + +Le binaire est un launcher mince. La bibliothèque applicative possède le bootstrap, le lifecycle Store, les DTOs Tauri, les commands, les projections de détail bornées et le bridge de tracing frontend. + +## Composition + +```text +ksp-config-lib -> composite, profils, secrets et runtime packagé +ksp-core-lib -> erreurs et primitives communes +ksp-store-lib -> façade Store backend-neutral et contrats RAW/inspection +ksp-logging-lib -> logging/tracing applicatif +ksp-app-store-desk -> orchestration Tauri + projections sûres read-only +``` + +L’application ne dépend pas directement de `ksp-store-api`, `ksp-store-postgres-lib`, `tokio-postgres` ou d’un autre backend physique. Elle ne possède aucun SQL. + +## Vues + +La surface utilisateur comprend : + +- **Overview** : état du runtime Store, health portable, réseau, backend logique, migration et compteurs de pool sûrs ; +- **RAW Transactions** : inspection DataTables server-side, filtres de slot et direction, état de rétention et détail explicite ; +- **RAW Accounts** : inspection DataTables server-side, filtre pubkey exact, plage de slots, direction et détail explicite ; +- **Diagnostics** : projection sûre du shell, de Config et du runtime Store. + +Les détails Transaction et Account contiennent également leurs observations dans des DataTables server-side dédiées lorsque ces observations existent. + +## Pagination et inspection + +Store Desk utilise la surface d’inspection random-access de `ksp-store-lib` : `offset + limit` avec counts exacts. DataTables est l’unique propriétaire de la pagination visible et les tailles admises sont `25`, `50` et `100`. + +Cette voie d’inspection humaine ne remplace pas la pagination cursor/keyset du Store. Les workers, jobs et autres consumers machine peuvent continuer à utiliser `RawPageCursor` / `RawPageRequest`; Store Desk ne consomme pas ces cursors. + +Le frontend conserve `draw` localement et ne transmet ni search globale DataTables, ni ordre de colonnes arbitraire, ni cursor, ni réseau physique au Store. + +## Rows, détails et observations + +Les rows de table ne transportent jamais les bytes RAW complets : + +- Transaction : identité, slot, format, hash, taille éventuelle et état de rétention ; +- Account : pubkey, slot, state hash, owner, lamports, executable, rent epoch et longueur de data ; +- Observation : provenance d’acquisition sûre et metadata bornées, sans source payload bytes. + +Un détail est chargé explicitement pour une seule entité. Les previews payload Transaction et data Account sont limitées à **512 bytes**, rendues en hexadécimal et accompagnées de la taille exacte et d’un indicateur de troncature. + +Pour une Transaction, les états `Full`, `Archived` et `Purged` restent distincts. Un état `Purged` est représenté via son tombstone ; Store Desk n’offre aucune action d’archive, purge ou force-rehydrate. + +## Valeurs longues et copie + +Les signatures, hashes, pubkeys, owners et autres identifiants longs sont tronqués visuellement au centre tout en restant disponibles via tooltip et bouton de copie. La copie n’ajoute aucune capability Tauri : elle utilise le WebView et le tracing ne transporte que l’identifiant logique du champ, jamais la valeur copiée. + +## Config et réseaux + +Le composite dédié est : + +```text +cfg.composite.ksp-app-store-desk +``` + +Les profils committed couvrent `mainnet`, `devnet` et `testnet`. Mainnet est le profil par défaut. Le composite contient uniquement Logging + Store ; aucun Transport n’est ouvert par l’application. + +Le frontend ne reçoit jamais URI Store, credential, secret Config, SQL, handle pool ou type backend physique. + +## Sécurité et ownership + +Store Desk est read-only par contrat applicatif : aucun command Tauri d’écriture Store n’est exposé. Les capabilities guest restent limitées à `core:default` et `tracing:default`. + +Le frontend ne possède ni accès réseau navigateur direct, ni persistence navigateur des données RAW, ni accès filesystem, ni dialogue natif pour contourner les façades KSP. + +Les comptes et counts `u64` susceptibles d’excéder le domaine entier sûr JavaScript traversent IPC sous forme décimale et sont vérifiés avant conversion côté TypeScript. + +## Ports et développement + +```text +Vite HTTP : 1438 +Vite WS : 1439 +``` + +Lancement : + +```bash +(cd crates/ksp-app-store-desk && cargo tauri dev) +``` + +Build production : + +```bash +(cd crates/ksp-app-store-desk && cargo tauri build) +``` + +Voir également [`USAGE.md`](USAGE.md), [`../ksp-store-lib/README.md`](../ksp-store-lib/README.md), [`../../docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md`](../../docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md) et [`../../docs/validation/025-V0_3_8_STORE_DESK.md`](../../docs/validation/025-V0_3_8_STORE_DESK.md). diff --git a/crates/ksp-app-store-desk/USAGE.md b/crates/ksp-app-store-desk/USAGE.md new file mode 100644 index 0000000..a8435f7 --- /dev/null +++ b/crates/ksp-app-store-desk/USAGE.md @@ -0,0 +1,149 @@ + + + +# Utilisation de `ksp-app-store-desk` + +## 1. Lancement + +Depuis la racine du workspace : + +```bash +(cd crates/ksp-app-store-desk && cargo tauri dev) +``` + +Le runtime charge le composite Store Desk via `ksp-config-lib`, initialise Logging puis ouvre le Store sélectionné via `ksp-store-lib`. + +## 2. Profil et readiness + +Le composite `cfg.composite.ksp-app-store-desk` sélectionne un profil Logging et un profil Store. Mainnet est le profil par défaut ; Devnet et Testnet sont également définis dans la configuration committed. + +La vue **Overview** expose notamment : + +```text +Store open +health state +profile +network +backend kind +migration version / pending migrations +pool size / capacity / available / waiting +``` + +Ces informations sont des projections portables. Elles ne contiennent jamais URI PostgreSQL, credential, secret ou handle physique. + +## 3. RAW Transactions + +La vue **RAW Transactions** charge les données côté serveur via la façade d’inspection Store. + +Filtres disponibles : + +```text +slot minimum +slot maximum +direction ascending / descending +``` + +La table affiche des summaries sans payload RAW complet. Les signatures et hashes longs restent copiables sans que leur valeur soit journalisée. + +Le bouton de détail recharge explicitement une seule Transaction. Le modal affiche les metadata canoniques, l’état de rétention et, lorsqu’un payload est encore retenu, un preview hexadécimal limité à 512 bytes avec taille exacte et indicateur de troncature. + +Un état `Purged` est présenté à partir du tombstone disponible. Aucune opération d’archive, purge ou force-rehydrate n’est proposée par l’application. + +## 4. RAW Accounts + +La vue **RAW Accounts** utilise le même modèle d’inspection server-side. + +Filtres disponibles : + +```text +pubkey exacte +slot minimum +slot maximum +direction ascending / descending +``` + +La table ne transporte pas les bytes Account. Elle expose seulement les metadata utiles : pubkey, slot, state hash, owner, lamports, executable, rent epoch et longueur de data. + +Le détail recharge exactement l’identité `(pubkey, slot, state_hash)` puis affiche un preview hexadécimal de data limité à 512 bytes, la longueur exacte et l’indicateur de troncature. + +## 5. Observations + +Les modals Transaction et Account contiennent une table **Observations** associée à l’entité actuellement ouverte. + +La table est server-side et expose uniquement de la provenance sûre : provider logique, protocole, méthode/origine d’acquisition, timestamps, endpoint/session/filter/commitment lorsqu’ils existent, hash/taille de source et metadata Account optionnelles admises. + +Les bytes du payload source ne traversent jamais IPC. + +## 6. Pagination DataTables + +Les tables Transactions, Accounts et Observations utilisent DataTables comme unique pager visible. + +Tailles disponibles : + +```text +25 +50 +100 +``` + +Le frontend mappe `start` vers l’offset Store et `length` vers la limite. Les counts exacts restent des chaînes décimales jusqu’à vérification du domaine `Number.MAX_SAFE_INTEGER`. + +La pagination d’inspection est distincte de la pagination cursor/keyset utilisée par les consumers machine du Store. Store Desk n’accepte ni cursor, ni search globale DataTables, ni tri arbitraire de colonnes. + +## 7. Rafraîchissement et filtres + +**Refresh** redessine la table concernée avec ses filtres Store explicites. Un changement de filtre repart de la première page. + +Les valeurs de filtre sont validées côté Rust : slots décimaux, pubkey canonique et direction autorisée. Elles ne sont pas injectées dans les logs frontend. + +## 8. Valeurs longues et copie + +Les valeurs longues sont affichées sous forme tronquée au centre. Le survol permet de consulter la valeur complète et le bouton de copie copie la valeur actuellement affichée par le frontend. + +Les événements de tracing de copie transportent uniquement un `fieldId` logique. Ils ne contiennent jamais signature, pubkey, owner, hash ou preview hex. + +## 9. Read-only et frontières + +Store Desk est un outil d’inspection. Il ne fournit aucune commande pour : + +```text +écrire une entité RAW +ajouter une observation +archiver +purger +force-rehydrate +démarrer un backfill +démarrer un worker +modifier la configuration Store +``` + +Ces responsabilités appartiennent aux composants KSP propriétaires. + +Le frontend ne reçoit jamais : + +```text +URI Store +credentials/secrets +SQL +handles backend/pool +payload RAW complet +data Account complète +source payload bytes +contexte d’erreur arbitraire +``` + +## 10. Fermeture + +La fermeture de la fenêtre principale bloque les nouvelles admissions puis ferme le Store de manière bornée avant de terminer le process. + +Le shutdown applicatif n’effectue aucune mutation métier de rétention ou de données. + +## 11. Build production + +Depuis la racine du workspace : + +```bash +(cd crates/ksp-app-store-desk && cargo tauri build) +``` + +Le build frontend passe par TypeScript puis Vite avant le build Tauri. Les resources Config enregistrées sont packagées selon le contrat commun des applications Desk KSP. diff --git a/deltas/0.3.8/pre.013.md b/deltas/0.3.8/pre.013.md new file mode 100644 index 0000000..0d4d913 --- /dev/null +++ b/deltas/0.3.8/pre.013.md @@ -0,0 +1,142 @@ + + + +# Delta `0.3.8-pre.013` — réconciliation documentaire finale Store Desk + +## 1. Base requise + +```text +0.3.8-pre.012-fix.001 +workspace.package.version = 0.3.8-pre.12.fix.1 +``` + +Le gate technique final de cette base est entièrement vert : format check, audits Rust/Markdown, `cargo check`, Clippy all-targets/all-features avec `-D warnings`, tests workspace all-targets/all-features, Store façade sans default features, graphes Cargo et build Tauri Linux `deb`/`rpm`. + +## 2. Objectif + +Réconcilier exclusivement la documentation durable avec la surface réellement livrée de Store Desk. Aucun runtime, test, frontend, Config, Store API/façade/PostgreSQL, SQL, migration ou manifest de crate n'est rouvert. + +## 3. Version + +```text +workspace.package.version = 0.3.8-pre.13 +``` + +Le bump prerelease est mécanique ; aucune autre propriété Cargo n'est modifiée. + +## 4. Réconciliation durable + +- ajout des `README.md` et `USAGE.md` de `ksp-app-store-desk` ; +- README racine et index docs/plans/validation synchronisés ; +- architecture Layers/Contracts/Inventory/Dependency Graph/Data & Store/Apps & Services réalignée ; +- plan Store Desk réconcilié sur la surface finale ; +- validation finale enrichie avec la preuve opérateur du gate `pre.012-fix.001`. + +`USAGE.md` reste strictement version-neutral : aucun journal de prerelease/gate n'y est ajouté. + +## 5. Contrat final documenté + +```text +Config + Core + Logging + ksp-store-lib +Overview / Diagnostics backend-neutral +RAW Transactions server-side + détail borné +RAW Accounts server-side + détail borné +observations Transaction/Account server-side +DataTables = seul pager visible +inspection = offset/limit/counts exacts +machine/replay = keyset/cursor conservé +previews detail = 512 bytes max +rétention/tombstone = lecture uniquement +aucun SQL/backend physique/Transport/write Store +``` + +## 6. Gate technique enregistré + +```text +1 592 tests passés +0 échec +15 tests ignorés opt-in/operator-only +Clippy -D warnings propre +ksp-store-lib --no-default-features propre +frontend tsc + Vite build propre +2 bundles Tauri Linux : deb, rpm +``` + +## 7. Hors scope + +```text +CHANGELOG.md +ROADMAP.md +prompt suivant +src/** +tests/** hors documentation existante +frontend/** +Config runtime +Store API/façade/PostgreSQL +SQL/schema/migrations +manifest de crate +nouvelle dépendance +``` + +Ces surfaces de publication restent réservées à `pre.014`. + +## 8. Fichiers ajoutés + +```text +crates/ksp-app-store-desk/README.md +crates/ksp-app-store-desk/USAGE.md +deltas/0.3.8/pre.013.md +``` + +## 9. Fichiers modifiés + +```text +Cargo.toml +README.md +docs/000-README.md +docs/plans/000-README.md +docs/validation/000-README.md +docs/architecture/002-LAYERS_AND_DEPENDENCIES.md +docs/architecture/003-COMPONENT_CONTRACTS.md +docs/architecture/004-COMPONENT_INVENTORY.md +docs/architecture/005-DEPENDENCY_GRAPH.md +docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md +docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md +docs/plans/029-V0_3_8_STORE_DESK_PLAN.md +docs/validation/025-V0_3_8_STORE_DESK.md +``` + +## 10. Fichiers supprimés + +Aucun. + +## 11. Validations de l’environnement d’assemblage + +```text +python3 scripts/audit_rust_workspace_rules.py : clean +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas : clean, 314 tables / 721 fichiers +contrôle différentiel strict : 3 ajouts / 13 modifications / 0 suppression +CHANGELOG.md / ROADMAP.md : inchangés +USAGE.md : version-neutral +reconstruction exacte de l’overlay sur pre.012-fix.001 +``` + +Cargo/rustc/rustfmt/Tauri ne sont pas disponibles dans l’environnement d’assemblage ; le gate technique autoritaire reste celui de `pre.012-fix.001`. + +## 12. Gate documentaire après application + +```bash +python3 scripts/audit_rust_workspace_rules.py +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas +``` + +Aucun replay du build Tauri ou des 1 592 tests n’est requis pour cette tranche documentaire si ces deux audits restent propres et si l’overlay appliqué est exactement celui livré. + +## 13. Suite + +```text +0.3.8-pre.014 — préparation publication + prompt 0.3.9 +0.3.8-rel.001 — publication stable v0.3.8 +``` + +Tout défaut strictement documentaire découvert dans cette tranche ouvre `pre.013-fix.NNN`. Aucun rattrapage fonctionnel n'est admis dans la lane de publication. diff --git a/docs/000-README.md b/docs/000-README.md index 45c4ed4..b906801 100644 --- a/docs/000-README.md +++ b/docs/000-README.md @@ -1,5 +1,5 @@ - + # Documentation KSP @@ -64,7 +64,8 @@ docs/ │ ├── 025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md │ ├── 026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md │ ├── 027-V0_3_6_JOB_API_BACKFILL_PLAN.md -│ └── 028-V0_3_7_BACKFILL_DESK_PLAN.md +│ ├── 028-V0_3_7_BACKFILL_DESK_PLAN.md +│ └── 029-V0_3_8_STORE_DESK_PLAN.md ├── validation/ │ ├── 000-README.md │ ├── 001-V0_1_4_CONFIG_DESKTOP.md @@ -90,7 +91,8 @@ docs/ │ ├── 021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md │ ├── 022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md │ ├── 023-V0_3_6_JOB_API_BACKFILL.md -│ └── 024-V0_3_7_BACKFILL_DESK.md +│ ├── 024-V0_3_7_BACKFILL_DESK.md +│ └── 025-V0_3_8_STORE_DESK.md └── rules/ ├── FILE_CONTRACTS.md ├── PROMPT_STRUCTURE.md @@ -107,7 +109,7 @@ D'autres sous-répertoires seront ajoutés uniquement lorsque leur rôle aura é ## Documents de planification -Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. La candidate `0.2.10 — OrbitFlare Yellowstone gRPC` est réconciliée dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) : Devnet `http://devnet.rpc.orbitflare.com:10000`, License Key `ORBIT-*` injectée comme metadata secrète `x-token`, Config Transport V3 inchangée, live `Subscribe -> Slot + Ping` passé, aucun overlay provider et aucun heartbeat supplémentaire. La candidate `0.2.11 — Off-chain price transport` est réconciliée dans [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit adapters REST sans SDK provider, décimal exact, registry/availability/rate limits possédés par Off-chain Transport, Config `std.offchain_transport`, refresh individuel/multiple provider-neutral et smoke live keyless final `7/7` après correction CoinMarketCap V2. [`../crates/ksp-offchain-transport-lib/README.md`](../crates/ksp-offchain-transport-lib/README.md) et [`../crates/ksp-offchain-transport-lib/USAGE.md`](../crates/ksp-offchain-transport-lib/USAGE.md) deviennent les références durables ; la future `ksp-app-solprices-desk` reste une HID sans logique provider. La release stable `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk` est conservée dans [`plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md) et [`validation/015-V0_2_12_SOL_PRICES_DESK.md`](validation/015-V0_2_12_SOL_PRICES_DESK.md) : `ksp-app-solprices-desk` fournit le refresh manuel row/selected/all provider-neutral, états/timestamps exacts et diagnostics sûrs sur ports 1434/1435 ; Wallet Desk réutilise `MarketPriceService::refresh_all` pendant le refresh balance pour afficher une moyenne SOL/USD consumer-owned et l'équivalent USD exact, sans provider concret ni fallback Off-chain. Les gates finaux workspace/live et les trois builds Tauri Linux sont verts avant publication. `0.2.13 — Interface / wire foundation` est réconciliée comme candidate dans [`plans/020-V0_2_13_INTERFACE_PLAN.md`](plans/020-V0_2_13_INTERFACE_PLAN.md) avec la matrice finale candidate [`validation/016-V0_2_13_INTERFACE.md`](validation/016-V0_2_13_INTERFACE.md) : `ksp-interface-lib` expose le `Pubkey` Core, `ProgramAccountMeta` et `ProgramInstruction`, bornés à `255` account metas et `10_240` bytes de data, avec façade crate-root exacte, diagnostics bornés, consumer externe et firewall `Interface -> Core` validés. Le gate technique final `pre.006` est intégralement vert ; [`../crates/ksp-interface-lib/README.md`](../crates/ksp-interface-lib/README.md) et [`../crates/ksp-interface-lib/USAGE.md`](../crates/ksp-interface-lib/USAGE.md) deviennent les références durables avant préparation de publication. Le prompt d’ouverture historique reste [`../prompts/018-V0_2_13_START_PROMPT.md`](../prompts/018-V0_2_13_START_PROMPT.md). `0.2.14 — Program API foundation` est réconciliée comme candidate dans [`plans/021-V0_2_14_PROGRAM_API_PLAN.md`](plans/021-V0_2_14_PROGRAM_API_PLAN.md) avec la matrice finale candidate [`validation/017-V0_2_14_PROGRAM_API.md`](validation/017-V0_2_14_PROGRAM_API.md) : `ksp-program-api` fournit une façade instruction-only ouverte, `ProgramInstructionRecognition`, `ProgramInstructionDecodeOutcome` et `ProgramInstructionDecoder`, avec output associé possédé par l’implémentation, Program Pubkeys opaques/non enregistrés acceptés, canari externe et firewall `Program API -> Core + Interface`. Le gate technique final `pre.006` est intégralement vert ; [`../crates/ksp-program-api/README.md`](../crates/ksp-program-api/README.md) et [`../crates/ksp-program-api/USAGE.md`](../crates/ksp-program-api/USAGE.md) deviennent les références durables avant préparation de publication. Le prompt d’ouverture historique reste [`../prompts/019-V0_2_14_START_PROMPT.md`](../prompts/019-V0_2_14_START_PROMPT.md). `0.3.1 — Store API RAW foundation` est réconciliée comme candidate dans [`plans/022-V0_3_1_STORE_RAW_PLAN.md`](plans/022-V0_3_1_STORE_RAW_PLAN.md) avec la matrice [`validation/018-V0_3_1_STORE_RAW.md`](validation/018-V0_3_1_STORE_RAW.md) : `ksp-store-api` reste Core-only et backend-agnostic, expose les modèles RAW transaction/account et observations, queries cursorisées, outcomes, capabilities fines et lifecycle de rétention/tombstone, sans backend runtime, PostgreSQL, processing ledger ni N2/N3/N4. Le gate `pre.008` a été reconstruit après `cargo clean` et validé sur le workspace complet et les trois builds Tauri ; `pre.009` réconcilie la documentation durable avant la préparation de publication `pre.010`. `0.3.2 — Store/PostgreSQL runtime foundation` est réconciliée comme candidate dans [`plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md`](plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md) avec la matrice finale [`validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md`](validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md) : `ksp-store-lib` fournit la façade runtime backend-neutral, `ksp-store-postgres-lib` possède le backend physique tokio-postgres/Deadpool/Rustls et les migrations metadata-only, tandis que `std.store` sélectionne des targets PostgreSQL séparés par réseau. Le gate technique `pre.010` valide workspace, graphes, trois builds Tauri et la fondation PostgreSQL réelle sur un serveur major 17 ; [`../crates/ksp-store-lib/README.md`](../crates/ksp-store-lib/README.md), [`../crates/ksp-store-lib/USAGE.md`](../crates/ksp-store-lib/USAGE.md), [`../crates/ksp-store-postgres-lib/README.md`](../crates/ksp-store-postgres-lib/README.md) et [`../crates/ksp-store-postgres-lib/USAGE.md`](../crates/ksp-store-postgres-lib/USAGE.md) deviennent les références durables avant la lane de publication. `0.3.3 — Store/PostgreSQL RawTransaction vertical slice` est réconciliée comme candidate dans [`plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) avec la matrice finale [`validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) : les six capabilities `RawTransaction*` sont implémentées côté backend et façade, V001 matérialise canonical/observations/archive avec binding réseau, navigation keyset et rétention atomique, et le gate final rejoue le workspace complet ainsi que le live PostgreSQL 17. `RawAccountState` physique reste réservé à `0.3.4`. `0.3.4 — Store/PostgreSQL RawAccountState` est conservée dans [`plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) et [`validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) ; elle complète la surface RAW backend/façade à dix capabilities. `0.3.5 — Interface acquisition events` est conservée dans [`plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md`](plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md) et [`validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md`](validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md) ; elle ajoute les faits passifs provider-neutral de slot et d'exécution de transaction sans déplacer l'ownership Transport/Store. La candidate `0.3.6 — Job API + RAW transaction backfill` est réconciliée dans [`plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md`](plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md) avec [`validation/023-V0_3_6_JOB_API_BACKFILL.md`](validation/023-V0_3_6_JOB_API_BACKFILL.md) : `ksp-job-api` reste Core-only et runtime-neutral, tandis que `ksp-job-backfill-lib` fournit le premier runtime historique borné vers RAW via Transport observé + façade Store, avec provenance, idempotence, concurrence bornée, frontier/checkpoint contigus, annulation et snapshots latest-value. [`../crates/ksp-job-api/README.md`](../crates/ksp-job-api/README.md), [`../crates/ksp-job-api/USAGE.md`](../crates/ksp-job-api/USAGE.md), [`../crates/ksp-job-backfill-lib/README.md`](../crates/ksp-job-backfill-lib/README.md) et [`../crates/ksp-job-backfill-lib/USAGE.md`](../crates/ksp-job-backfill-lib/USAGE.md) deviennent les références de crate durables. La candidate `0.3.7 — Backfill Desk` est réconciliée dans [`plans/028-V0_3_7_BACKFILL_DESK_PLAN.md`](plans/028-V0_3_7_BACKFILL_DESK_PLAN.md) avec [`validation/024-V0_3_7_BACKFILL_DESK.md`](validation/024-V0_3_7_BACKFILL_DESK.md) : `ksp-app-backfill-desk` compose Config, HTTP Transport, Store et le runtime Backfill pour Start/monitoring/Cancel/Resume in-session, conserve checkpoint et ressources physiques côté Rust, et fournit un autocomplete libre alimenté par le registre Program IDs de Core. [`../crates/ksp-app-backfill-desk/README.md`](../crates/ksp-app-backfill-desk/README.md) et [`../crates/ksp-app-backfill-desk/USAGE.md`](../crates/ksp-app-backfill-desk/USAGE.md) deviennent les références applicatives durables. +Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.4 — ksp-app-config-desk` est conservé comme historique clôturé dans [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md), avec sa matrice finale [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). La release stable `0.2.0` clôt l'audit de bot3 et le découpage de la série. Son plan directeur est conservé comme historique clôturé dans [`plans/007-V0_2_0_SERIES_PLANNING.md`](plans/007-V0_2_0_SERIES_PLANNING.md), avec sa matrice finale [`validation/002-V0_2_0_SERIES_PLANNING.md`](validation/002-V0_2_0_SERIES_PLANNING.md). La release stable `0.2.1 — HTTP Solana foundation` a été ouverte par [`../prompts/006-V0_2_1_START_PROMPT.md`](../prompts/006-V0_2_1_START_PROMPT.md). Son gate de sizing et sa matrice exhaustive sont conservés dans [`plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md`](plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md), avec la validation finale [`validation/003-V0_2_1_ONCHAIN_HTTP.md`](validation/003-V0_2_1_ONCHAIN_HTTP.md), README/USAGE Transport et le smoke Devnet opt-in de composition Config -> Transport. Le prompt [`../prompts/007-V0_2_2_START_PROMPT.md`](../prompts/007-V0_2_2_START_PROMPT.md) a ouvert la release stable `0.2.2 — HTTP Accounts + Tokens + Cluster`. Son plan clôturé [`plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md`](plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md) conserve l'audit et l'implémentation des 22 wrappers typés, tandis que [`validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) enregistre les validations déterministes, les graphes Cargo et les deux smokes Devnet passés avant publication. Le prompt [`../prompts/008-V0_2_3_START_PROMPT.md`](../prompts/008-V0_2_3_START_PROMPT.md) a ouvert la release stable `0.2.3 — HTTP Transactions`. Son plan clôturé [`plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) conserve l'audit et l'implémentation des 11 wrappers ; le réaudit [`validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) confirme la complétude des 37 wrappers HTTP typés et [`validation/006-V0_2_3_HTTP_TRANSACTIONS.md`](validation/006-V0_2_3_HTTP_TRANSACTIONS.md) enregistre les validations finales, graphes Cargo et deux smokes Devnet passés avant publication. Le prompt [`../prompts/009-V0_2_4_START_PROMPT.md`](../prompts/009-V0_2_4_START_PROMPT.md) a ouvert la release stable `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Son plan clôturé [`plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](plans/011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) conserve l’implémentation des 15 wrappers et la compliance `52/52 + 14/14`; la matrice finale [`validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md`](validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md) enregistre le réaudit SIMD/inventaire, les canaries globales et les preuves opérateur avant publication. Le prompt [`../prompts/010-V0_2_5_START_PROMPT.md`](../prompts/010-V0_2_5_START_PROMPT.md), finalisé par `0.2.4-pre.009-fix.001`, ouvre `0.2.5 — Wallet foundation` sur la base stable `v0.2.4`. Son plan historique clôturé [`plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](plans/012-V0_2_5_WALLET_FOUNDATION_PLAN.md) part du gate `pre.001` (héritage, threat model offline, VIEW/OWNER indépendants et niveau B read-only), puis matérialise la crate en `pre.002`, le wire/transcript en `pre.003`, les primitives Argon2id/XChaCha20-Poly1305 en `pre.004`, les payloads/create/open en `pre.005`, la persistence en `pre.006`, l'administration/signature en `pre.007` et les adapters transfer en `pre.008`. `pre.009` ferme l'audit adversarial/interoperability/compliance dans [`validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md`](validation/008-V0_2_5_WALLET_SECURITY_COMPLIANCE.md) avant la documentation finale `pre.010` ; `pre.010` finalise [`../crates/ksp-wallet-lib/README.md`](../crates/ksp-wallet-lib/README.md), [`../crates/ksp-wallet-lib/USAGE.md`](../crates/ksp-wallet-lib/USAGE.md), la spec, les graphes et la matrice ; `pre.010-fix.001`–`fix.003` ferment ensuite la mise à niveau Dalek et la normalisation Rust/audit structurel. `0.2.5-rel.001` publie la release stable et [`../prompts/011-V0_2_6_START_PROMPT.md`](../prompts/011-V0_2_6_START_PROMPT.md) ouvre `0.2.6 — Wallet Desk`. Le gate `0.2.6-pre.001` est conservé dans [`plans/013-V0_2_6_WALLET_DESK_PLAN.md`](plans/013-V0_2_6_WALLET_DESK_PLAN.md) : il réaudite Config Desk et les APIs finales, retient le gabarit desktop, fixe `std.wallet`, la composition Config/Wallet/HTTP/Logging, les secrets `KSP_SECRET_WALLET_PASS_*`, les frontières VIEW/OWNER et la trajectoire de validation. `pre.002`–`pre.014` matérialisent ensuite le shell Tauri, Config Wallet/composite, inventory, create/open, balance HTTP, import/export, metadata, rotations, révocation VIEW forte, compliance et polish desktop. `pre.015` fige le wire binaire `.kspwallet` V2, `pre.016` matérialise les APIs génériques/versionnées et le runtime V2, puis `pre.017` ajoute la migration explicite OWNER-authentifiée V1 -> V2. `pre.018` ferme le runtime Tauri packagé Config/resources et la documentation candidate ; `pre.018-fix.001` corrige le canari d'ownership Config, après quoi le gate workspace et le build final Linux sont verts. `pre.018-fix.002` renforce uniquement le contrat de reprise `0.2.7`. `0.2.6-rel.001` publie cette surface stable et [`../prompts/012-V0_2_7_START_PROMPT.md`](../prompts/012-V0_2_7_START_PROMPT.md) devient le prochain point d'entrée. Le gate `0.2.7-pre.001` ouvre la release WebSocket standard dans [`plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md`](plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md) ; la matrice normative puis finale est conservée dans [`validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md`](validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md). `0.2.7-pre.014` ferme la candidate technique/documentaire après validation 18/18, smoke WebSocket Devnet et audit du graphe Cargo ; `pre.014-fix.001` renforce uniquement le prompt suivant. `0.2.7-rel.001` publie `0.2.7 — WebSocket Solana standard` stable et [`../prompts/013-V0_2_8_START_PROMPT.md`](../prompts/013-V0_2_8_START_PROMPT.md) ouvre `0.2.8 — Helius LaserStream WebSocket`. Le plan historique clôturé [`plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md`](plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md) et la matrice finale [`validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md`](validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md) conservent la release stable `0.2.8 — Helius LaserStream WebSocket` publiée par `rel.001` : protocol `helius_laserstream`, sept familles standard Helius (`account/logs/program/root/signature/slot/slotsUpdates`), extension `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s, Config/secrets redacted, lifecycle adversarial et graphes Cargo finaux validés. [`../prompts/014-V0_2_9_START_PROMPT.md`](../prompts/014-V0_2_9_START_PROMPT.md) devient le contrat actif pour ouvrir Yellowstone gRPC standard/provider-neutral depuis le tag stable `v0.2.8`. La release stable `0.2.9` est conservée dans [`plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md`](plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md) et [`validation/012-V0_2_9_YELLOWSTONE_GRPC.md`](validation/012-V0_2_9_YELLOWSTONE_GRPC.md) : stratégie proto Apache + client KSP/Tonic, moteur N1, standard N2, Config V3, profils PublicNode Mainnet/Testnet authentifiés par `x-token` secret et smoke live `Subscribe` validé sur les deux réseaux. La candidate `0.2.10 — OrbitFlare Yellowstone gRPC` est réconciliée dans [`plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md`](plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md) et [`validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md`](validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md) : Devnet `http://devnet.rpc.orbitflare.com:10000`, License Key `ORBIT-*` injectée comme metadata secrète `x-token`, Config Transport V3 inchangée, live `Subscribe -> Slot + Ping` passé, aucun overlay provider et aucun heartbeat supplémentaire. La candidate `0.2.11 — Off-chain price transport` est réconciliée dans [`plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md`](plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md) et [`validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md`](validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md) : SOL/USD V1, huit adapters REST sans SDK provider, décimal exact, registry/availability/rate limits possédés par Off-chain Transport, Config `std.offchain_transport`, refresh individuel/multiple provider-neutral et smoke live keyless final `7/7` après correction CoinMarketCap V2. [`../crates/ksp-offchain-transport-lib/README.md`](../crates/ksp-offchain-transport-lib/README.md) et [`../crates/ksp-offchain-transport-lib/USAGE.md`](../crates/ksp-offchain-transport-lib/USAGE.md) deviennent les références durables ; la future `ksp-app-solprices-desk` reste une HID sans logique provider. La release stable `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk` est conservée dans [`plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md`](plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md) et [`validation/015-V0_2_12_SOL_PRICES_DESK.md`](validation/015-V0_2_12_SOL_PRICES_DESK.md) : `ksp-app-solprices-desk` fournit le refresh manuel row/selected/all provider-neutral, états/timestamps exacts et diagnostics sûrs sur ports 1434/1435 ; Wallet Desk réutilise `MarketPriceService::refresh_all` pendant le refresh balance pour afficher une moyenne SOL/USD consumer-owned et l'équivalent USD exact, sans provider concret ni fallback Off-chain. Les gates finaux workspace/live et les trois builds Tauri Linux sont verts avant publication. `0.2.13 — Interface / wire foundation` est réconciliée comme candidate dans [`plans/020-V0_2_13_INTERFACE_PLAN.md`](plans/020-V0_2_13_INTERFACE_PLAN.md) avec la matrice finale candidate [`validation/016-V0_2_13_INTERFACE.md`](validation/016-V0_2_13_INTERFACE.md) : `ksp-interface-lib` expose le `Pubkey` Core, `ProgramAccountMeta` et `ProgramInstruction`, bornés à `255` account metas et `10_240` bytes de data, avec façade crate-root exacte, diagnostics bornés, consumer externe et firewall `Interface -> Core` validés. Le gate technique final `pre.006` est intégralement vert ; [`../crates/ksp-interface-lib/README.md`](../crates/ksp-interface-lib/README.md) et [`../crates/ksp-interface-lib/USAGE.md`](../crates/ksp-interface-lib/USAGE.md) deviennent les références durables avant préparation de publication. Le prompt d’ouverture historique reste [`../prompts/018-V0_2_13_START_PROMPT.md`](../prompts/018-V0_2_13_START_PROMPT.md). `0.2.14 — Program API foundation` est réconciliée comme candidate dans [`plans/021-V0_2_14_PROGRAM_API_PLAN.md`](plans/021-V0_2_14_PROGRAM_API_PLAN.md) avec la matrice finale candidate [`validation/017-V0_2_14_PROGRAM_API.md`](validation/017-V0_2_14_PROGRAM_API.md) : `ksp-program-api` fournit une façade instruction-only ouverte, `ProgramInstructionRecognition`, `ProgramInstructionDecodeOutcome` et `ProgramInstructionDecoder`, avec output associé possédé par l’implémentation, Program Pubkeys opaques/non enregistrés acceptés, canari externe et firewall `Program API -> Core + Interface`. Le gate technique final `pre.006` est intégralement vert ; [`../crates/ksp-program-api/README.md`](../crates/ksp-program-api/README.md) et [`../crates/ksp-program-api/USAGE.md`](../crates/ksp-program-api/USAGE.md) deviennent les références durables avant préparation de publication. Le prompt d’ouverture historique reste [`../prompts/019-V0_2_14_START_PROMPT.md`](../prompts/019-V0_2_14_START_PROMPT.md). `0.3.1 — Store API RAW foundation` est réconciliée comme candidate dans [`plans/022-V0_3_1_STORE_RAW_PLAN.md`](plans/022-V0_3_1_STORE_RAW_PLAN.md) avec la matrice [`validation/018-V0_3_1_STORE_RAW.md`](validation/018-V0_3_1_STORE_RAW.md) : `ksp-store-api` reste Core-only et backend-agnostic, expose les modèles RAW transaction/account et observations, queries cursorisées, outcomes, capabilities fines et lifecycle de rétention/tombstone, sans backend runtime, PostgreSQL, processing ledger ni N2/N3/N4. Le gate `pre.008` a été reconstruit après `cargo clean` et validé sur le workspace complet et les trois builds Tauri ; `pre.009` réconcilie la documentation durable avant la préparation de publication `pre.010`. `0.3.2 — Store/PostgreSQL runtime foundation` est réconciliée comme candidate dans [`plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md`](plans/023-V0_3_2_STORE_POSTGRES_FOUNDATION_PLAN.md) avec la matrice finale [`validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md`](validation/019-V0_3_2_STORE_POSTGRES_FOUNDATION.md) : `ksp-store-lib` fournit la façade runtime backend-neutral, `ksp-store-postgres-lib` possède le backend physique tokio-postgres/Deadpool/Rustls et les migrations metadata-only, tandis que `std.store` sélectionne des targets PostgreSQL séparés par réseau. Le gate technique `pre.010` valide workspace, graphes, trois builds Tauri et la fondation PostgreSQL réelle sur un serveur major 17 ; [`../crates/ksp-store-lib/README.md`](../crates/ksp-store-lib/README.md), [`../crates/ksp-store-lib/USAGE.md`](../crates/ksp-store-lib/USAGE.md), [`../crates/ksp-store-postgres-lib/README.md`](../crates/ksp-store-postgres-lib/README.md) et [`../crates/ksp-store-postgres-lib/USAGE.md`](../crates/ksp-store-postgres-lib/USAGE.md) deviennent les références durables avant la lane de publication. `0.3.3 — Store/PostgreSQL RawTransaction vertical slice` est réconciliée comme candidate dans [`plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md`](plans/024-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION_PLAN.md) avec la matrice finale [`validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md`](validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md) : les six capabilities `RawTransaction*` sont implémentées côté backend et façade, V001 matérialise canonical/observations/archive avec binding réseau, navigation keyset et rétention atomique, et le gate final rejoue le workspace complet ainsi que le live PostgreSQL 17. `RawAccountState` physique reste réservé à `0.3.4`. `0.3.4 — Store/PostgreSQL RawAccountState` est conservée dans [`plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) et [`validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md`](validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md) ; elle complète la surface RAW backend/façade à dix capabilities. `0.3.5 — Interface acquisition events` est conservée dans [`plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md`](plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md) et [`validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md`](validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md) ; elle ajoute les faits passifs provider-neutral de slot et d'exécution de transaction sans déplacer l'ownership Transport/Store. La candidate `0.3.6 — Job API + RAW transaction backfill` est réconciliée dans [`plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md`](plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md) avec [`validation/023-V0_3_6_JOB_API_BACKFILL.md`](validation/023-V0_3_6_JOB_API_BACKFILL.md) : `ksp-job-api` reste Core-only et runtime-neutral, tandis que `ksp-job-backfill-lib` fournit le premier runtime historique borné vers RAW via Transport observé + façade Store, avec provenance, idempotence, concurrence bornée, frontier/checkpoint contigus, annulation et snapshots latest-value. [`../crates/ksp-job-api/README.md`](../crates/ksp-job-api/README.md), [`../crates/ksp-job-api/USAGE.md`](../crates/ksp-job-api/USAGE.md), [`../crates/ksp-job-backfill-lib/README.md`](../crates/ksp-job-backfill-lib/README.md) et [`../crates/ksp-job-backfill-lib/USAGE.md`](../crates/ksp-job-backfill-lib/USAGE.md) deviennent les références de crate durables. La candidate `0.3.7 — Backfill Desk` est réconciliée dans [`plans/028-V0_3_7_BACKFILL_DESK_PLAN.md`](plans/028-V0_3_7_BACKFILL_DESK_PLAN.md) avec [`validation/024-V0_3_7_BACKFILL_DESK.md`](validation/024-V0_3_7_BACKFILL_DESK.md) : `ksp-app-backfill-desk` compose Config, HTTP Transport, Store et le runtime Backfill pour Start/monitoring/Cancel/Resume in-session, conserve checkpoint et ressources physiques côté Rust, et fournit un autocomplete libre alimenté par le registre Program IDs de Core. [`../crates/ksp-app-backfill-desk/README.md`](../crates/ksp-app-backfill-desk/README.md) et [`../crates/ksp-app-backfill-desk/USAGE.md`](../crates/ksp-app-backfill-desk/USAGE.md) deviennent les références applicatives durables. La candidate `0.3.8 — Store Desk V1 RAW` est réconciliée dans [`plans/029-V0_3_8_STORE_DESK_PLAN.md`](plans/029-V0_3_8_STORE_DESK_PLAN.md) avec [`validation/025-V0_3_8_STORE_DESK.md`](validation/025-V0_3_8_STORE_DESK.md) : `ksp-app-store-desk` compose Config, Logging et la façade `ksp-store-lib` pour l'inspection read-only des RAW Transactions/Accounts et de leurs observations, avec DataTables server-side, counts exacts, détails bornés et séparation stricte entre inspection random-access et pagination cursor/keyset machine. [`../crates/ksp-app-store-desk/README.md`](../crates/ksp-app-store-desk/README.md) et [`../crates/ksp-app-store-desk/USAGE.md`](../crates/ksp-app-store-desk/USAGE.md) deviennent les références applicatives durables. ## Spécifications de formats diff --git a/docs/architecture/002-LAYERS_AND_DEPENDENCIES.md b/docs/architecture/002-LAYERS_AND_DEPENDENCIES.md index 13c8ccc..ec39ca5 100644 --- a/docs/architecture/002-LAYERS_AND_DEPENDENCIES.md +++ b/docs/architecture/002-LAYERS_AND_DEPENDENCIES.md @@ -1,5 +1,5 @@ - + # Couches et dépendances KSP @@ -134,7 +134,7 @@ Les applications Tauri restent minces : - instrumentation frontend ; - aucun déplacement de logique de transport, Wallet, Config, Program, Store ou Materializer dans Tauri. -Des applications spécialisées sont ajoutées au fur et à mesure pour valider les couches : Config Desk, Wallet Desk, `ksp-app-solprices-desk`, `ksp-app-backfill-desk`, Store/RAW tooling, CORE tooling puis Market Desk. `ksp-app-solprices-desk` reste une HID mince : elle consomme l’inventaire, les observations, les états et les opérations génériques de `ksp-offchain-transport-lib` sans connaître les providers, leurs endpoints, leurs credentials ni leurs limites. `ksp-app-backfill-desk` compose Config, Transport HTTP, Store et `ksp-job-backfill-lib` sans absorber découverte, retry/rate-limit, persistance ou checkpoint ; son frontend ne reçoit que des DTOs sûrs et le checkpoint de reprise reste Rust-only. +Des applications spécialisées sont ajoutées au fur et à mesure pour valider les couches : Config Desk, Wallet Desk, `ksp-app-solprices-desk`, `ksp-app-backfill-desk`, `ksp-app-store-desk`, CORE tooling puis Market Desk. `ksp-app-solprices-desk` reste une HID mince : elle consomme l’inventaire, les observations, les états et les opérations génériques de `ksp-offchain-transport-lib` sans connaître les providers, leurs endpoints, leurs credentials ni leurs limites. `ksp-app-backfill-desk` compose Config, Transport HTTP, Store et `ksp-job-backfill-lib` sans absorber découverte, retry/rate-limit, persistance ou checkpoint ; son frontend ne reçoit que des DTOs sûrs et le checkpoint de reprise reste Rust-only. `ksp-app-store-desk` compose Config, Logging et `ksp-store-lib` pour une inspection RAW read-only : il n'accède ni au backend physique ni au SQL et sépare la pagination random-access de l'interface de la pagination cursor/keyset réservée aux consumers machine. ## Workers et jobs diff --git a/docs/architecture/003-COMPONENT_CONTRACTS.md b/docs/architecture/003-COMPONENT_CONTRACTS.md index eff661c..ce50a7a 100644 --- a/docs/architecture/003-COMPONENT_CONTRACTS.md +++ b/docs/architecture/003-COMPONENT_CONTRACTS.md @@ -1,5 +1,5 @@ - + # Contrats initiaux des composants KSP @@ -214,6 +214,8 @@ Une application globale reste future. `ksp-app-backfill-desk` est l'interface spécialisée du premier job historique. Elle dépend des façades KSP nécessaires à la composition (`ksp-config-lib`, `ksp-job-api`, `ksp-job-backfill-lib`, `ksp-onchain-transport-lib`, `ksp-store-lib`, Core et Logging), garde Store/Transport/checkpoint côté Rust et expose uniquement les options, demandes opérateur bornées, états latest-value et acquittements de contrôle sûrs. +`ksp-app-store-desk` est l'interface spécialisée d'inspection du Store RAW. Elle dépend de `ksp-config-lib`, `ksp-core-lib`, `ksp-logging-lib` et `ksp-store-lib`, conserve le Store ouvert côté Rust, expose uniquement des DTOs app-owned backend-neutral et ne fournit aucun command d'écriture. Les tables utilisent les capabilities d'inspection random-access ; les détails rechargent une seule entité et bornent les previews RAW sans déplacer la rétention ou le backend dans Tauri. + ## Progression verticale Program À partir de DECODE : diff --git a/docs/architecture/004-COMPONENT_INVENTORY.md b/docs/architecture/004-COMPONENT_INVENTORY.md index fe9a99d..16d95fc 100644 --- a/docs/architecture/004-COMPONENT_INVENTORY.md +++ b/docs/architecture/004-COMPONENT_INVENTORY.md @@ -1,5 +1,5 @@ - + # Inventaire initial des composants KSP @@ -43,6 +43,7 @@ Ce document maintient l'inventaire synthétique des composants retenus ou presse | Job lifecycle | `ksp-job-api` | API | Implémenté | `0.3.6` | identité/lifecycle/annulation/notifications latest-value runtime-neutral | | Backfill | `ksp-job-backfill-lib` | lib | Implémenté | `0.3.6` | backfill `RawTransaction` borné via Transport observé + Store, checkpoint et runtime | | Backfill Desk | `ksp-app-backfill-desk` | app | Implémenté | `0.3.7` | Start/monitoring/Cancel/Resume in-session du backfill RAW via façades KSP | +| Store Desk | `ksp-app-store-desk` | app | Implémenté | `0.3.8` | inspection RAW read-only Transaction/Account/Observation via façade Store | | Worker lifecycle | `ksp-worker-api` | API | Retenu | fin couche RAW | lifecycle des services continus | | RAW worker | `ksp-worker-raw-retriever` ou nom révisé | worker | Retenu | fin couche RAW | acquisition live vers RAW | | CORE processor | nom à fixer | processor/lib | Retenu | couche CORE | normalisation Solana générique RAW -> CORE | @@ -150,7 +151,6 @@ Market Desk est progressive : V1 après les DEX prioritaires, puis enrichissemen ## Questions restantes -- nom exact de Backfill Desk ; - nécessité future d'un pool automatique WS ; - types exacts `ksp-materializer-api` lors de l'ouverture DECODE ; - nom/packaging précis du premier RAW worker et du CORE normalizer ; diff --git a/docs/architecture/005-DEPENDENCY_GRAPH.md b/docs/architecture/005-DEPENDENCY_GRAPH.md index 3057c28..1479715 100644 --- a/docs/architecture/005-DEPENDENCY_GRAPH.md +++ b/docs/architecture/005-DEPENDENCY_GRAPH.md @@ -1,5 +1,5 @@ - + # Graphe de dépendances KSP @@ -440,6 +440,18 @@ ksp-app-backfill-desk La Desk compose les ressources et contrôles du job sans traverser la façade Store : aucune dépendance directe à `ksp-store-api`, `ksp-store-postgres-lib`, `tokio-postgres`, `reqwest`, `tonic` ou `yellowstone-grpc-proto`. Le frontend ne connaît que des rôles HTTP logiques et des DTOs sûrs ; endpoints, credentials, backend Store, RAW et checkpoint concret restent sous les composants Rust propriétaires. +### Store Desk + +```text +ksp-app-store-desk + -> ksp-config-lib + -> ksp-core-lib + -> ksp-logging-lib + -> ksp-store-lib +``` + +Store Desk est un consumer read-only de la façade Store. Il ne dépend pas directement de `ksp-store-api`, `ksp-store-postgres-lib` ou `tokio-postgres`, ne possède aucun SQL et n'ouvre aucun Transport. Les capabilities d'inspection random-access alimentent les DataTables server-side ; les reads par identité alimentent les détails bornés. Les URI, secrets, handles backend, payloads complets et source bytes ne traversent pas la frontière frontend. + ### Market Desk ```text diff --git a/docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md b/docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md index de7b452..f9ca6a9 100644 --- a/docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md +++ b/docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md @@ -1,5 +1,5 @@ - + # Data, Materialization et Store @@ -325,6 +325,21 @@ Le backend PostgreSQL officiel appartient à `ksp-store-postgres-lib`. Cette cra La pagination/cursorisation reste un contrat de navigation Store. Une limite demandée par l’appelant peut être validée pour sa forme/sécurité, mais aucun plafond métier global arbitraire ni batch-size de worker n’est introduit par le runtime Store. +### Navigation machine et inspection humaine + +Deux contrats complémentaires coexistent sans collision : + +```text +workers / jobs / replay -> RawPageRequest + RawPageCursor -> keyset +inspection UI -> RawInspectionPageRequest -> offset + limit + counts exacts +``` + +La voie cursor/keyset reste canonique pour la navigation machine et les replays : le cursor est opaque, lié au contexte de query et ne dépend pas d'un `OFFSET` profond. + +La voie `RawInspectionPageRequest` est backend-neutral mais conçue pour une inspection humaine random-access. Elle peut demander des counts exacts et un offset absolu ; le backend PostgreSQL peut implémenter cette capability avec `COUNT` et `OFFSET` privés. Ce choix ne réécrit jamais les statements keyset historiques. + +`ksp-app-store-desk` est le consumer actuel de cette voie d'inspection. DataTables possède l'unique pager visible et l'application ne reçoit aucun cursor Store. Les summaries d'inspection restent sans payload/data RAW ; un détail explicite peut recharger une seule entité avec une projection applicative bornée. + ## `ksp-materializer-api` et `ksp-materializer-lib` Ils sont introduits seulement lorsque le premier groupe DECODE démontre le contrat réel. diff --git a/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md b/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md index 485e234..1da10ff 100644 --- a/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md +++ b/docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md @@ -1,5 +1,5 @@ - + # Applications, services, scenarios et control plane @@ -117,6 +117,9 @@ ksp-app-backfill-desk -> ksp-store-lib ksp-app-store-desk + -> ksp-config-lib + -> ksp-core-lib + -> ksp-logging-lib -> ksp-store-lib ``` @@ -124,6 +127,8 @@ ksp-app-store-desk Backfill Desk suit exactement cette règle : elle ouvre Store via `ksp-store-lib`, construit le pool HTTP via `ksp-onchain-transport-lib`, puis remet ces ressources à `ksp-job-backfill-lib`. Start/Cancel/Resume restent des opérations applicatives de composition ; le checkpoint de reprise et les ressources physiques ne deviennent jamais des DTOs Tauri. +Store Desk suit la même frontière sans Transport : Config sélectionne Logging + Store, `ksp-store-lib` fournit health, reads et inspection backend-neutral, et le Store ouvert reste côté Rust. Les DataTables frontend consomment des summaries server-side et counts exacts ; les détails chargent une seule entité avec preview bornée. Aucun command d'écriture, SQL, cursor opaque, backend physique ou secret Store n'est exposé à Tauri/TypeScript. + Les couches N1–N4 expriment des responsabilités et une direction de dépendances ; elles n'imposent pas de traverser toutes les couches intermédiaires. ## Tauri diff --git a/docs/plans/000-README.md b/docs/plans/000-README.md index 345c70b..dbe240c 100644 --- a/docs/plans/000-README.md +++ b/docs/plans/000-README.md @@ -1,5 +1,5 @@ - + # Plans KSP @@ -36,6 +36,8 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou - [`025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md`](025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md) — plan historique clôturé de `0.3.4 — Store/PostgreSQL RawAccountState + complétude RAW`; il complète le backend/façade à dix capabilities RAW et ferme V002. - [`026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md`](026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md) — plan historique clôturé de `0.3.5 — Interface acquisition events`; il fixe les faits passifs provider-neutral `SlotLifecycleEvent` et `TransactionExecutionEvent` sans runtime ni persistence. - [`027-V0_3_6_JOB_API_BACKFILL_PLAN.md`](027-V0_3_6_JOB_API_BACKFILL_PLAN.md) — plan candidat de `0.3.6 — Job API + RAW transaction backfill`; il fixe le contrat Job runtime-neutral, les quatre scopes historiques, RAW v1, provenance observée, persistance Store normale, concurrence/frontier/checkpoint et runtime latest-value annulable. +- [`028-V0_3_7_BACKFILL_DESK_PLAN.md`](028-V0_3_7_BACKFILL_DESK_PLAN.md) — plan historique clôturé de `0.3.7 — Backfill Desk`; il fixe la composition Config/Transport/Store/Job, Start single-run, monitoring latest-value, Cancel ciblé, Resume in-session Rust-only, autocomplete Program IDs et packaging Tauri. +- [`029-V0_3_8_STORE_DESK_PLAN.md`](029-V0_3_8_STORE_DESK_PLAN.md) — plan candidat réconcilié de `0.3.8 — Store Desk V1 RAW`; il fixe la composition Config+Store, l'inspection backend-neutral Transaction/Account/Observation, DataTables server-side random-access, détails bornés, rétention read-only et le maintien de la pagination keyset/cursor machine. Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre. diff --git a/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md b/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md index e47dc95..eaf9950 100644 --- a/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md +++ b/docs/plans/029-V0_3_8_STORE_DESK_PLAN.md @@ -1,5 +1,5 @@ - + # Plan v0.3.8 — Store Desk V1 RAW @@ -661,7 +661,7 @@ Un défaut ouvre `pre.012-fix.NNN`; aucune réconciliation README/USAGE durable ### pre.013 — réconciliation documentaire finale -README/USAGE Store Desk, architecture/index, plan/validation. Aucun changement runtime. +README/USAGE Store Desk, architecture/index, plan/validation. Aucun changement runtime. Le gate technique autoritaire est `pre.012-fix.001`, entièrement vert après réalignement du `tsconfig.json` Store Desk sur le gabarit Desk commun. ### pre.014 — préparation publication @@ -694,3 +694,19 @@ browser persistence RAW L'utilisation de `OFFSET` et `COUNT` est autorisée uniquement dans l'implémentation privée PostgreSQL de la nouvelle capability d'inspection ; elle reste interdite dans l'application et ne remplace pas les queries keyset existantes. +## 21. Réconciliation documentaire finale + +La surface réellement livrée est désormais réconciliée sans rouvrir le runtime : + +- `ksp-app-store-desk` est documentée comme application read-only de `ksp-store-lib` composée avec Config/Core/Logging ; +- Overview expose uniquement health/runtime portable et diagnostics sûrs ; +- Transactions et Accounts utilisent DataTables server-side avec inspection random-access backend-neutral, counts exacts et tailles 25/50/100 ; +- les observations sont listées server-side dans le détail de leur entité exacte ; +- les rows restent sans payload/data/source bytes et les previews de détail restent bornés à 512 bytes ; +- les états Transaction `Full` / `Archived` / `Purged` et tombstones sont lisibles sans action destructive ; +- la pagination machine `RawPageCursor`/keyset et l'inspection `RawInspectionPageRequest`/offset restent deux contrats distincts ; +- aucun Transport, SQL app-owned, backend PostgreSQL direct, write Store, archive/purge/force-rehydrate, backfill ou worker control n'entre dans Store Desk. + +Le gate technique final autoritaire a validé 1 592 tests, zéro échec, 15 tests opt-in/operator-only ignorés, Clippy `-D warnings`, la façade Store sans default features et deux bundles Tauri Linux (`deb`, `rpm`). + +La lane suivante reste strictement publication-only : `pre.014` peut modifier CHANGELOG/ROADMAP et produire le prompt `0.3.9`, sans rouvrir la documentation technique ou le code de `0.3.8`. diff --git a/docs/validation/000-README.md b/docs/validation/000-README.md index ffaca10..e3e1199 100644 --- a/docs/validation/000-README.md +++ b/docs/validation/000-README.md @@ -1,5 +1,5 @@ - + # Validations KSP @@ -33,3 +33,4 @@ Documents : - [`022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md`](022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md) — matrice finale de `0.3.5 — Interface acquisition events` : événements passifs slot/transaction, façade crate-root, bornes/debug et firewall Interface. - [`023-V0_3_6_JOB_API_BACKFILL.md`](023-V0_3_6_JOB_API_BACKFILL.md) — matrice candidate de `0.3.6 — Job API + RAW transaction backfill` : lifecycle/notifications runtime-neutral, scopes, provenance, RAW v1, Store/idempotence, concurrence/checkpoint, annulation/snapshots, hardening externe et gate workspace final. - [`024-V0_3_7_BACKFILL_DESK.md`](024-V0_3_7_BACKFILL_DESK.md) — matrice candidate de `0.3.7 — Backfill Desk` : composition Config/Transport/Store/Job, scopes et rôles HTTP, single-run, monitoring latest-value, Cancel, Resume in-session Rust-only, autocomplete Program IDs, hardening et gate workspace/Tauri final. +- [`025-V0_3_8_STORE_DESK.md`](025-V0_3_8_STORE_DESK.md) — matrice candidate finale de `0.3.8 — Store Desk V1 RAW` : composition Config/Store, inspection random-access Transaction/Account/Observation, DataTables server-side, DTOs payload/data-free, détails bornés, rétention/tombstones read-only, hardening IPC/frontend, release completeness et gate workspace/Tauri final. diff --git a/docs/validation/025-V0_3_8_STORE_DESK.md b/docs/validation/025-V0_3_8_STORE_DESK.md index 15eb3d1..792587c 100644 --- a/docs/validation/025-V0_3_8_STORE_DESK.md +++ b/docs/validation/025-V0_3_8_STORE_DESK.md @@ -1,5 +1,5 @@ - + # Validation v0.3.8 — Store Desk V1 RAW @@ -94,13 +94,13 @@ Le journal opérateur fourni pour v0.3.7 rapporte un gate complet. Il reste une - [X] `pre.004` PostgreSQL + façade inspection RawTransaction ; - [X] `pre.005` PostgreSQL + façade inspection RawAccountState ; - [X] `pre.006` composite Logging+Store + Overview/health ; -- [ ] `pre.007` RawTransaction DataTables serverSide + détail ; -- [ ] `pre.008` RawAccountState DataTables serverSide + détail ; -- [ ] `pre.009` observation listing/inspection Store ; -- [ ] `pre.010` observations UI + hardening UX ; -- [ ] `pre.011` security/dependency/release completeness ; -- [ ] `pre.012` gate technique final + Tauri build + smoke read-only opt-in ; -- [ ] `pre.013` réconciliation documentaire ; +- [X] `pre.007` RawTransaction DataTables serverSide + détail ; +- [X] `pre.008` RawAccountState DataTables serverSide + détail ; +- [X] `pre.009` observation listing/inspection Store ; +- [X] `pre.010` observations UI + hardening UX ; +- [X] `pre.011` security/dependency/release completeness ; +- [X] `pre.012` gate technique final + Tauri build + smoke read-only opt-in ; +- [X] `pre.013` réconciliation documentaire ; - [ ] `pre.014` prompt suivant + CHANGELOG + ROADMAP ; - [ ] `rel.001` publication stable v0.3.8. @@ -913,3 +913,43 @@ Le `tsconfig.json` de Store Desk avait divergé du gabarit commun Config/Wallet/ - [X] `workspace.package.version` devient `0.3.8-pre.12.fix.1` car `tsconfig.json` est un changement build/config et un test Rust est ajouté. Le gate final doit être rejoué sur l'overlay officiel. Le build Tauri reste la dernière opération lourde et doit passer avec le `tsconfig.json` versionné par ce fix, sans correction locale supplémentaire. + +## 42. Clôture `pre.012-fix.001` et réconciliation `pre.013` + +Le gate opérateur rejoué sur l'overlay officiel `0.3.8-pre.12.fix.1` est entièrement vert : + +```text +cargo fmt --all -- --check: PASS +General Rust rule audit: clean +Rust export completeness audit: 0 candidate(s) +KSP workspace Rust rule audit: clean +Markdown table audit: clean (314 table(s), 718 file(s)) +cargo check --workspace: PASS +cargo clippy --workspace --all-targets --all-features -- -D warnings: PASS +cargo test --workspace --all-targets --all-features: PASS + 1 592 passed + 0 failed + 15 ignored opt-in/operator-only +cargo check -p ksp-store-lib --no-default-features: PASS +cargo tree Store Desk / Store façade / features / duplicates: exécutés sans gate rouge +Store Desk frontend tsc + Vite build: PASS +Tauri release build: PASS + deb + rpm +``` + +Le canari `pre_012_fix_001_tsconfig_matches_common_ksp_desk_template_byte_exact` passe dans la suite `desktop_contract`, ce qui confirme que le réalignement TypeScript est bien versionné et non une correction locale. + +La surface fonctionnelle finale vérifiée reste : + +- [X] Overview/Diagnostics backend-neutral et secret-free ; +- [X] RAW Transactions DataTables server-side, filtres Store explicites, détail borné et rétention/tombstone read-only ; +- [X] RAW Accounts DataTables server-side, filtre pubkey exact/range/direction et détail data borné ; +- [X] observations Transaction/Account server-side, metadata/provenance uniquement et sans source bytes ; +- [X] counts exacts conservés en texte décimal jusqu'au contrôle JS-safe ; +- [X] DataTables est l'unique pager visible ; +- [X] la navigation machine cursor/keyset reste distincte et intacte ; +- [X] aucun SQL/backend physique, Transport, browser storage/network, dialogue natif ou command Store mutatif n'entre dans l'application ; +- [X] fermeture Store bornée avant exit. + +`pre.013` réconcilie exclusivement README/USAGE, architecture/index et plan/validation sur cette preuve. `CHANGELOG.md`, `ROADMAP.md` et le prompt suivant restent réservés à `pre.014`.