# Validation v0.3.8 — Store Desk V1 RAW ## 1. Gate `pre.001` - [X] archive stable KSP v0.3.7 identifiée comme base exclusive ; - [X] `workspace.package.version = 0.3.7` avant modification ; - [X] `deltas/0.3.7/rel.001.md` présent ; - [X] prompt 027 et règles KSP relus ; - [X] Store API/lib/PostgreSQL et gabarits Desk audités ; - [X] archive kbot3 isolée et utilisée uniquement comme référence fonctionnelle/UX ; - [X] npm/DataTables KSP inventorié ; - [X] capability/gap/screen/table/pagination/DTO/threat maps produites ; - [X] décision d'architecture pagination tranchée avant scaffold ; - [X] aucun code kbot3, SQL app-owned ou scaffold Store Desk livré en `pre.001`. ## 2. Preuve des archives | Source | SHA-256 | Résultat | Usage | |--------------------------------------------------------|--------------------------------------------------------------------|---------------------------|----------------------------| | `khadhroony-solana-project-v0.3.7.zip` | `d57132960e4c280a67e59bea02ce08a61665890bdfb6ef16b7faf1b3c57070ae` | 1 702 entrées, ZIP propre | source exclusive de code | | `khadhroony-bot3_v0.5.3-pre.005-fix010-thelatest1.zip` | `ee47643b9f8b582ee8db97b2381ec107e45aef8c009fee44757531514615d318` | 2 501 entrées, ZIP propre | référence fonctionnelle/UX | Aucune entrée absolue, traversal, séparateur inversé ou lien symbolique ZIP n'a été détectée. ## 3. Baseline locale avant modification - [X] `python3 scripts/audit_rust_workspace_rules.py` : propre, zéro candidat d'export ; - [X] audit Markdown : propre, 301 tables / 687 fichiers ; - [ ] `cargo fmt --all -- --check` : non exécuté localement, `cargo` absent ; - [ ] `cargo check --workspace` : non exécuté localement, `cargo` absent ; - [ ] `cargo clippy --workspace --all-targets` : non exécuté localement, `cargo` absent ; - [ ] tests ciblés Store/Config : non exécutés localement, `cargo` absent. Le journal opérateur fourni pour v0.3.7 rapporte un gate complet. Il reste une preuve externe de baseline et n'est pas présenté comme une exécution locale de `pre.001`. ## 4. Décision pagination / inspection - [X] `RawPageRequest` / `RawPage` cursor-keyset existants sont conservés sans modification ; - [X] le pager Store Desk ne les expose pas ; - [X] DataTables `serverSide` exige `start`, `length`, `recordsTotal`, `recordsFiltered` ; - [X] DataTables accepte `ajax` comme fonction custom, compatible avec un `invoke()` Tauri sans fetch ; - [X] une primitive Store backend-neutral d'inspection offset/count est justifiée ; - [X] deux capabilities read fine-grained Tx/Account sont préférées à la modification des traits RAW existants ; - [X] les pages d'inspection retournent des summaries sans payload/data bytes ; - [X] `total_items` et `filtered_items` sont exacts dans la sémantique de query ; - [X] page length UX = 25/50/100 ; `length = -1` interdit ; - [X] DataTables search arbitraire désactivée en V1 ; - [X] filtres Store explicites et ordre canonique seulement ; - [X] **un seul pager est visible : celui de DataTables** ; - [X] aucun pager « bloc Store » ou paging local imbriqué ne subsiste. ## 5. Capability gaps et trajectoire - [X] list/get RawTransaction cursor existe ; - [X] list/get RawAccountState cursor existe ; - [X] read observation par key existe pour Tx et Account ; - [X] inspection offset/count/summary manque en v0.3.7 ; - [X] listing observations Tx/Account manque ; - [X] aucun gap n'est contourné par SQL dans l'app ; - [X] inspection Tx/Account est planifiée dans Store API/lib/PostgreSQL avant l'UI métier ; - [X] observation listing reste une extension Store dédiée ultérieure ; - [X] les counts restent logiques/backend-neutral et n'exposent aucun diagnostic physique PostgreSQL. ## 6. Gabarit / npm - [X] `GABARIT STORE DESK = KSP` ; - [X] ports réservés 1438/1439 ; - [X] shell/splash/fonts/assets dérivent uniquement des Desks KSP ; - [X] `datatables.net-bs5 ^3.0` retenu ; - [X] Select non retenu par défaut ; - [X] aucune version/package kbot3 n'est utilisée ; - [X] audit externe : DataTables 3.0.3 / Select 4.0.1 le 2026-09-03, sans upgrade opportuniste. ## 7. DTO / sécurité - [X] tous les `u64` métier traversent IPC en texte décimal ; - [X] counts convertis en `number` uniquement après contrôle JS-safe ; - [X] payload transaction et account data sont detail-only ; - [X] summaries d'inspection excluent les gros bytes ; - [X] aucun cursor Store dans le pager DataTables ; - [X] aucune URI/credential/backend handle/SQL n'est projeté ; - [X] offset/limit hostiles sont rejetés avant I/O ; - [X] `draw` DataTables sert uniquement à l'ordonnancement frontend ; - [X] aucune persistence navigateur RAW ; - [X] instrumentation exclut payload, URI, secrets et valeurs de filtres. ## 8. Gates futures - [X] `pre.002` scaffold KSP strict + DataTables skeleton ; - [X] `pre.003` contrats Store inspection offset/count/summaries ; - [ ] `pre.004` PostgreSQL + façade inspection RawTransaction ; - [ ] `pre.005` PostgreSQL + façade inspection RawAccountState ; - [ ] `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 ; - [ ] `pre.014` prompt suivant + CHANGELOG + ROADMAP ; - [ ] `rel.001` publication stable v0.3.8. ## 9. Gate post-modification `pre.001` - [X] `python3 scripts/audit_rust_workspace_rules.py` : General Rust clean, export completeness 0, KSP workspace Rust clean ; - [X] `python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.8` : clean, 283 tables / 153 fichiers ; - [X] diff contre l'archive v0.3.7 : exactement quatre fichiers ajoutés/modifiés, aucune suppression ; - [X] archive delta testée par `unzip -t` ; - [ ] gates Cargo : non exécutés dans l'environnement d'assemblage, `cargo` absent. ## 10. Gate opérateur de la base `pre.001` Après application de `pre.001`, l’opérateur a exécuté : ```text cargo fmt --all 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 cargo check --workspace cargo clippy --workspace --all-targets ``` Résultats fournis : ```text 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), 690 file(s)) cargo check --workspace: PASS cargo clippy --workspace --all-targets: PASS ``` Cette preuve opérateur ferme le gate technique de la base `0.3.8-pre.1` avant matérialisation de `pre.002`. Aucun test crate ciblé n’est inféré au-delà des commandes effectivement fournies. ## 11. `pre.002` — scaffold Store Desk matérialisé - [X] `crates/ksp-app-store-desk` créé comme package Rust lib + bin ; - [X] workspace avancé à `0.3.8-pre.2` ; - [X] ports Vite/HMR stricts 1438/1439 ; - [X] identité Tauri `KSP Store Desk` / `com.sasedev.ksp-app-store-desk` ; - [X] splash, logo, favicon et font repris byte-exact depuis le gabarit Desk KSP ; - [X] shell et SASS dérivés du gabarit KSP, sans source kbot3 ; - [X] Config + Logging initialisés selon le pattern Desk KSP ; - [X] `ksp-core-lib` admis au scaffold pour les erreurs applicatives typées, sans contourner Store ; - [X] aucune dépendance `ksp-store-lib`, `ksp-store-api`, `ksp-store-postgres-lib`, Transport ou Job dans cette tranche ; - [X] capabilities limitées à `core:default` + `tracing:default` ; - [X] frontend tracing installé pour navigation, boutons, refresh et IPC ; - [X] dépendances npm KSP stables conservées ; - [X] `datatables.net-bs5` ajouté sans Select ; - [X] skeletons RAW Transactions / RAW Accounts vides créés ; - [X] aucun Store n’est ouvert et aucune donnée Store n’est chargée ; - [X] aucun contrôle `Premier / Précédent / Suivant` Store n’est rendu ; - [X] DataTables reste l’unique owner visuel du paging dès le scaffold ; - [X] le mode local vide de `pre.002` ne préjuge pas du `serverSide` prévu en `pre.007`/`pre.008` ; - [X] plan corrigé : suppression du placeholder préventif `pre.003-fix.NNN` ; - [X] plan corrigé : screen-map alignée sur le pager DataTables unique. ## 12. Gates d’assemblage `pre.002` - [X] `python3 scripts/audit_rust_workspace_rules.py` : General Rust clean, export completeness 0, KSP workspace Rust clean ; - [X] audit Markdown : clean, 283 tables / 155 fichiers sur le périmètre `deltas/0.3.8` ; - [X] manifest parse : 4 JSON + 2 TOML ; - [X] package baseline : 7 dépendances runtime obligatoires, devDependencies exactes sur 4 Desks KSP, Select absent ; - [X] assets : 5 fichiers binaires byte-identical sur 4 Desks KSP ; - [X] SASS partagé : 5 fichiers body-identical au gabarit KSP ; - [X] splash : body identique au gabarit modulo identité Store Desk et metadata fichier ; - [X] audit shell/DataTables : structure KSP + deux skeletons + owner visuel unique du pager ; - [X] audit statique des dépendances/scopes Store/Transport/Job : aucun bypass ; - [X] ports : 1438/1439 stricts et sans collision avec les autres Desks ; - [X] audit frontend : pas de `fetch`, storage navigateur ni dialogue bloquant ; - [X] audit TypeScript syntaxique par `transpileModule` 5.8.3 : 5 fichiers propres ; - [X] audit Rust source du nouveau scaffold : aucun `panic!`, `unwrap`, `expect` ou bloc `unsafe` ; - [X] delta scope : 47 ajouts, 3 modifications, 0 suppression ; 46 fichiers applicatifs + delta ; - [X] archive delta finale vérifiée par `unzip -t` ; - [ ] `cargo fmt --all` : non exécuté dans l’environnement d’assemblage, `cargo` absent ; - [ ] `cargo check --workspace` : non exécuté dans l’environnement d’assemblage, `cargo` absent ; - [ ] `cargo clippy --workspace --all-targets` : non exécuté dans l’environnement d’assemblage, `cargo` absent ; - [ ] `cargo test -p ksp-app-store-desk` : à exécuter par l’opérateur ; - [ ] `cargo tree -p ksp-app-store-desk --edges normal` : à exécuter par l’opérateur ; - [ ] `cargo tree -p ksp-app-store-desk -e features` : à exécuter par l’opérateur. La case `pre.002` de la section « Gates futures » reste ouverte jusqu’au retour de ces gates Cargo opérateur. ## 13. Retour opérateur `pre.002` et ouverture de `pre.002-fix.001` Après application de `pre.002`, l’opérateur a exécuté le gate demandé. Les résultats fournis établissent : ```text 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), 692 file(s)) cargo check --workspace: PASS cargo test -p ksp-app-store-desk: PASS (12 unit + 2 dependency boundary + 5 desktop contract + 3 desktop security + 1 public API) cargo tree -p ksp-app-store-desk --edges normal: produit cargo tree -p ksp-app-store-desk -e features: produit ``` `cargo clippy --workspace --all-targets` n’est pas vert : deux erreurs `clippy::implicit-return` sont présentes dans les helpers `parse_json` des tests `desktop_contract.rs` et `desktop_security.rs`. Quatre crates de tests signalent aussi `missing_docs` comme warnings. Le même retour opérateur signale une divergence de `vite.config.ts` par rapport au gabarit `ksp-app-*-desk`. L’audit comparatif confirme trois écarts non justifiés : ```text server.hmr au lieu de server.ws options SCSS quietDeps/silenceDeprecations/verbose absentes otherassets/[name][hash][extname] au lieu de otherassets/[name][extname] ``` Le correctif `pre.002-fix.001` reste strictement dans le couloir scaffold de `pre.002` : - réalignement de `vite.config.ts` sur le gabarit Desk KSP, avec seules différences d’identité et de ports 1438/1439 ; - ajout d’un canari d’égalité du template Vite après normalisation identité/ports/header ; - correction explicite des deux retours Clippy dans les helpers de tests ; - ajout des crate-level docs manquantes aux quatre crates d’intégration afin de supprimer les warnings observés ; - aucune capability Store, aucun SQL, aucun changement d’architecture pagination. La case `pre.002` reste ouverte jusqu’au gate opérateur du fix. ## 14. Gate opérateur `pre.002-fix.001` Le gate complet rejoué par l’opérateur après le fix est vert : ```text 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), 693 file(s)) cargo check --workspace: PASS cargo clippy --workspace --all-targets: PASS cargo test -p ksp-app-store-desk: PASS ``` Détail Store Desk communiqué : 12 tests unitaires, 2 dependency-boundary, 6 desktop-contract, 3 desktop-security, 1 public-API, tous verts. Les arbres `cargo tree` normal/features ont également été produits. `pre.002` est donc fermé et `pre.003` peut s’ouvrir. ## 15. `pre.003` — contrats Store d’inspection et tracing développement - [X] `workspace.package.version = 0.3.8-pre.3` ; - [X] `RawInspectionPageRequest` sépare explicitement offset/limit de `RawPageRequest` cursor ; - [X] `RawInspectionPage` expose `total_items` / `filtered_items` exacts avec validation de cohérence ; - [X] `RawTransactionInspectionQuery` conserve network/range/direction et page random-access ; - [X] `RawAccountStateInspectionQuery` conserve network/pubkey?/range/direction et page random-access ; - [X] `RawTransactionSummary` exclut les payload bytes et expose uniquement metadata/retention/size ; - [X] `RawAccountStateSummary` exclut les data bytes et expose uniquement metadata/data length ; - [X] `RawTransactionInspectionRead` et `RawAccountStateInspectionRead` sont object-safe et backend-neutral ; - [X] `ksp-store-lib` réexporte les nouveaux contrats sans encore les implémenter sur `Store` ; - [X] le chemin cursor/keyset existant reste inchangé ; - [X] aucun SQL, migration ou backend physique n’est introduit ; - [X] aucun nom/protocole DataTables n’entre dans `ksp-store-api` ; - [X] Store Desk demande explicitement le profil Logging `supertrace` pendant le développement ; - [X] fallback Logging Store Desk reste `Trace` ; - [X] tracing frontend couvre boutons, navigation, tabs, changements de contrôles, Refresh et IPC ; - [X] les futurs événements DataTables page/length/query doivent être instrumentés lors de `pre.007`/`pre.008` sans logguer les valeurs de filtres ni payloads. ## 16. Gate opérateur `pre.003` et ouverture de `pre.003-fix.001` Le gate opérateur de `pre.003` confirme : ```text 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), 694 file(s)) cargo check --workspace: PASS cargo clippy --workspace --all-targets: PASS cargo test -p ksp-store-api: PASS cargo test -p ksp-app-store-desk: PASS cargo check -p ksp-store-lib --no-default-features: PASS ``` `cargo test -p ksp-store-lib` échoue sur un seul canari historique : ```text pre_009_facade_modules_and_crate_root_exports_are_exact ``` Le diagnostic est un inventaire attendu devenu obsolète après les réexports publics intentionnels de `pre.003`. La surface réelle contient bien les huit nouveaux symboles backend-neutral prévus : ```text RawAccountStateInspectionQuery RawAccountStateInspectionRead RawAccountStateSummary RawInspectionPage RawInspectionPageRequest RawTransactionInspectionQuery RawTransactionInspectionRead RawTransactionSummary ``` Le correctif `pre.003-fix.001` met uniquement à jour ce canari exact de `91` à `99` exports. Aucun contrat, comportement runtime, backend PostgreSQL, SQL, migration, pagination ou code Store Desk n'est modifié. La case `pre.003` reste ouverte jusqu'au rejeu vert du gate opérateur sur `0.3.8-pre.3.fix.1`. ## 17. Gate opérateur `pre.003-fix.001` Le rejeu opérateur sur `0.3.8-pre.3.fix.1` est entièrement vert : ```text 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), 695 file(s)) cargo check --workspace: PASS cargo clippy --workspace --all-targets: PASS cargo test -p ksp-store-api: PASS cargo test -p ksp-store-lib: PASS cargo check -p ksp-store-lib --no-default-features: PASS cargo test -p ksp-app-store-desk: PASS ``` Le canari d'inventaire façade corrigé est vert. `pre.003` est fermé et `pre.004` peut introduire uniquement le vertical slice `RawTransactionInspection` PostgreSQL + façade. ## 18. `pre.004` — inspection PostgreSQL RawTransaction + façade Store - [X] `workspace.package.version = 0.3.8-pre.4` ; - [X] `PostgresBackend` implémente `RawTransactionInspectionRead` sans implémenter encore `RawAccountStateInspectionRead` ; - [X] `Store` implémente le même trait et garde le guard network avant dispatch ; - [X] la query d'inspection PostgreSQL est une instruction unique par direction, donc counts et page partagent le même snapshot SQL ; - [X] `total_items` compte toute la famille transaction du Store/network, y compris les tombstones `Purged` ; - [X] `filtered_items` applique uniquement le range slot optionnel ; - [X] sans filtre slot, le SQL réutilise `filtered_count` comme `total_count` au lieu d'un second count ; - [X] la page random-access utilise `LIMIT/OFFSET` uniquement dans le chemin d'inspection ; - [X] limit non représentable par PostgreSQL et offset > `i64::MAX` sont rejetés avant acquisition du pool ; - [X] les deux queries cursor/keyset historiques restent sans `OFFSET` et excluent toujours `Purged` ; - [X] les summaries ne sélectionnent ni `transaction_row.payload` ni `archive_row.payload` ; seules les tailles `OCTET_LENGTH` sont projetées ; - [X] les marqueurs hot/archive payload sont projetés comme booléens pour rejeter les formes physiques incohérentes sans transférer les bytes ; - [X] les summaries `Full`, `Archived` et `Purged` sont décodés avec les invariants physiques correspondants ; - [X] une page vide obtenue par offset profond conserve les counts exacts ; - [X] le live proof PostgreSQL opt-in couvre counts filtrés, ordre asc/desc, offset et page vide ; - [X] inventaires exacts Store/PostgreSQL passent de 10 à 11 implementations RAW et restent symétriques ; - [X] aucune migration, table, index, capability Account inspection, UI Desk ou protocole DataTables n'est ajouté dans cette tranche. ## 19. Gate opérateur `pre.004` et ouverture de `pre.004-fix.001` Le gate opérateur de `pre.004` confirme que les audits Rust/Markdown, `cargo check --workspace`, `ksp-store-lib`, `ksp-store-api` et les 66 tests unitaires PostgreSQL sont verts. Deux défauts de tests empêchent toutefois la fermeture de la tranche : ```text cargo clippy --workspace --all-targets: FAIL 4 x clippy::implicit-return dans hardening_completeness.rs cargo test -p ksp-store-postgres-lib: FAIL pre_006_raw_pagination_is_keyset_cursor_bound_and_policy_free canari historique interdisant OFFSET sur tout raw_transaction.rs ``` Le second échec ne remet pas en cause le contrat `pre.004` : l'`OFFSET` est volontairement autorisé uniquement dans les statements d'inspection random-access, tandis que les statements `LIST_TRANSACTIONS_*` cursor/keyset doivent rester OFFSET-free. `pre.004-fix.001` rescope donc le canari historique sur les statements keyset eux-mêmes au lieu de l'appliquer au fichier physique complet. Le live proof lancé ensuite n'a pas fourni de preuve PostgreSQL exploitable : le journal ne contient pas la ligne `server major ...`, émise seulement après lecture de l'URI et connexion initiale. L'exécution observée est compatible avec une attente sur `stdin().read_line()`. Le fix rend cette attente explicite dans le message du test. Pour une saisie locale masquée : ```bash read -rsp 'Dedicated PostgreSQL URI: ' KSP_LIVE_PG_URI printf '\n' printf '%s\n' "$KSP_LIVE_PG_URI" | cargo test -p ksp-store-postgres-lib --test postgres_raw_transaction_live -- --ignored --nocapture unset KSP_LIVE_PG_URI ``` Aucun SQL, contrat Store, runtime PostgreSQL ou comportement d'inspection de production n'est modifié par ce fix.