Files
khadhroony-solana-project/docs/validation/025-V0_3_8_STORE_DESK.md

44 KiB
Raw Blame History

Validation v0.3.8 — Store Desk V1 RAW

1. Gate pre.001

  • archive stable KSP v0.3.7 identifiée comme base exclusive ;
  • workspace.package.version = 0.3.7 avant modification ;
  • deltas/0.3.7/rel.001.md présent ;
  • prompt 027 et règles KSP relus ;
  • Store API/lib/PostgreSQL et gabarits Desk audités ;
  • archive kbot3 isolée et utilisée uniquement comme référence fonctionnelle/UX ;
  • npm/DataTables KSP inventorié ;
  • capability/gap/screen/table/pagination/DTO/threat maps produites ;
  • décision d'architecture pagination tranchée avant scaffold ;
  • 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

  • python3 scripts/audit_rust_workspace_rules.py : propre, zéro candidat d'export ;
  • 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

  • RawPageRequest / RawPage<T> cursor-keyset existants sont conservés sans modification ;
  • le pager Store Desk ne les expose pas ;
  • DataTables serverSide exige start, length, recordsTotal, recordsFiltered ;
  • DataTables accepte ajax comme fonction custom, compatible avec un invoke() Tauri sans fetch ;
  • une primitive Store backend-neutral d'inspection offset/count est justifiée ;
  • deux capabilities read fine-grained Tx/Account sont préférées à la modification des traits RAW existants ;
  • les pages d'inspection retournent des summaries sans payload/data bytes ;
  • total_items et filtered_items sont exacts dans la sémantique de query ;
  • page length UX = 25/50/100 ; length = -1 interdit ;
  • DataTables search arbitraire désactivée en V1 ;
  • filtres Store explicites et ordre canonique seulement ;
  • un seul pager est visible : celui de DataTables ;
  • aucun pager « bloc Store » ou paging local imbriqué ne subsiste.

5. Capability gaps et trajectoire

  • list/get RawTransaction cursor existe ;
  • list/get RawAccountState cursor existe ;
  • read observation par key existe pour Tx et Account ;
  • inspection offset/count/summary manque en v0.3.7 ;
  • listing observations Tx/Account manque ;
  • aucun gap n'est contourné par SQL dans l'app ;
  • inspection Tx/Account est planifiée dans Store API/lib/PostgreSQL avant l'UI métier ;
  • observation listing reste une extension Store dédiée ultérieure ;
  • les counts restent logiques/backend-neutral et n'exposent aucun diagnostic physique PostgreSQL.

6. Gabarit / npm

  • GABARIT STORE DESK = KSP ;
  • ports réservés 1438/1439 ;
  • shell/splash/fonts/assets dérivent uniquement des Desks KSP ;
  • datatables.net-bs5 ^3.0 retenu ;
  • Select non retenu par défaut ;
  • aucune version/package kbot3 n'est utilisée ;
  • audit externe : DataTables 3.0.3 / Select 4.0.1 le 2026-09-03, sans upgrade opportuniste.

7. DTO / sécurité

  • tous les u64 métier traversent IPC en texte décimal ;
  • counts convertis en number uniquement après contrôle JS-safe ;
  • payload transaction et account data sont detail-only ;
  • summaries d'inspection excluent les gros bytes ;
  • aucun cursor Store dans le pager DataTables ;
  • aucune URI/credential/backend handle/SQL n'est projeté ;
  • offset/limit hostiles sont rejetés avant I/O ;
  • draw DataTables sert uniquement à l'ordonnancement frontend ;
  • aucune persistence navigateur RAW ;
  • instrumentation exclut payload, URI, secrets et valeurs de filtres.

8. Gates futures

  • pre.002 scaffold KSP strict + DataTables skeleton ;
  • 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

  • python3 scripts/audit_rust_workspace_rules.py : General Rust clean, export completeness 0, KSP workspace Rust clean ;
  • 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 ;
  • diff contre l'archive v0.3.7 : exactement quatre fichiers ajoutés/modifiés, aucune suppression ;
  • 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, lopérateur a exécuté :

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 :

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é nest inféré au-delà des commandes effectivement fournies.

11. pre.002 — scaffold Store Desk matérialisé

  • crates/ksp-app-store-desk créé comme package Rust lib + bin ;
  • workspace avancé à 0.3.8-pre.2 ;
  • ports Vite/HMR stricts 1438/1439 ;
  • identité Tauri KSP Store Desk / com.sasedev.ksp-app-store-desk ;
  • splash, logo, favicon et font repris byte-exact depuis le gabarit Desk KSP ;
  • shell et SASS dérivés du gabarit KSP, sans source kbot3 ;
  • Config + Logging initialisés selon le pattern Desk KSP ;
  • ksp-core-lib admis au scaffold pour les erreurs applicatives typées, sans contourner Store ;
  • aucune dépendance ksp-store-lib, ksp-store-api, ksp-store-postgres-lib, Transport ou Job dans cette tranche ;
  • capabilities limitées à core:default + tracing:default ;
  • frontend tracing installé pour navigation, boutons, refresh et IPC ;
  • dépendances npm KSP stables conservées ;
  • datatables.net-bs5 ajouté sans Select ;
  • skeletons RAW Transactions / RAW Accounts vides créés ;
  • aucun Store nest ouvert et aucune donnée Store nest chargée ;
  • aucun contrôle Premier / Précédent / Suivant Store nest rendu ;
  • DataTables reste lunique owner visuel du paging dès le scaffold ;
  • le mode local vide de pre.002 ne préjuge pas du serverSide prévu en pre.007/pre.008 ;
  • plan corrigé : suppression du placeholder préventif pre.003-fix.NNN ;
  • plan corrigé : screen-map alignée sur le pager DataTables unique.

12. Gates dassemblage pre.002

  • python3 scripts/audit_rust_workspace_rules.py : General Rust clean, export completeness 0, KSP workspace Rust clean ;
  • audit Markdown : clean, 283 tables / 155 fichiers sur le périmètre deltas/0.3.8 ;
  • manifest parse : 4 JSON + 2 TOML ;
  • package baseline : 7 dépendances runtime obligatoires, devDependencies exactes sur 4 Desks KSP, Select absent ;
  • assets : 5 fichiers binaires byte-identical sur 4 Desks KSP ;
  • SASS partagé : 5 fichiers body-identical au gabarit KSP ;
  • splash : body identique au gabarit modulo identité Store Desk et metadata fichier ;
  • audit shell/DataTables : structure KSP + deux skeletons + owner visuel unique du pager ;
  • audit statique des dépendances/scopes Store/Transport/Job : aucun bypass ;
  • ports : 1438/1439 stricts et sans collision avec les autres Desks ;
  • audit frontend : pas de fetch, storage navigateur ni dialogue bloquant ;
  • audit TypeScript syntaxique par transpileModule 5.8.3 : 5 fichiers propres ;
  • audit Rust source du nouveau scaffold : aucun panic!, unwrap, expect ou bloc unsafe ;
  • delta scope : 47 ajouts, 3 modifications, 0 suppression ; 46 fichiers applicatifs + delta ;
  • archive delta finale vérifiée par unzip -t ;
  • cargo fmt --all : non exécuté dans lenvironnement dassemblage, cargo absent ;
  • cargo check --workspace : non exécuté dans lenvironnement dassemblage, cargo absent ;
  • cargo clippy --workspace --all-targets : non exécuté dans lenvironnement dassemblage, cargo absent ;
  • cargo test -p ksp-app-store-desk : à exécuter par lopérateur ;
  • cargo tree -p ksp-app-store-desk --edges normal : à exécuter par lopérateur ;
  • cargo tree -p ksp-app-store-desk -e features : à exécuter par lopérateur.

La case pre.002 de la section « Gates futures » reste ouverte jusquau 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, lopérateur a exécuté le gate demandé. Les résultats fournis établissent :

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 nest 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. Laudit comparatif confirme trois écarts non justifiés :

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 didentité et de ports 1438/1439 ;
  • ajout dun 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 dintégration afin de supprimer les warnings observés ;
  • aucune capability Store, aucun SQL, aucun changement darchitecture pagination.

La case pre.002 reste ouverte jusquau gate opérateur du fix.

14. Gate opérateur pre.002-fix.001

Le gate complet rejoué par lopérateur après le fix est vert :

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 souvrir.

15. pre.003 — contrats Store dinspection et tracing développement

  • workspace.package.version = 0.3.8-pre.3 ;
  • RawInspectionPageRequest sépare explicitement offset/limit de RawPageRequest cursor ;
  • RawInspectionPage<T> expose total_items / filtered_items exacts avec validation de cohérence ;
  • RawTransactionInspectionQuery conserve network/range/direction et page random-access ;
  • RawAccountStateInspectionQuery conserve network/pubkey?/range/direction et page random-access ;
  • RawTransactionSummary exclut les payload bytes et expose uniquement metadata/retention/size ;
  • RawAccountStateSummary exclut les data bytes et expose uniquement metadata/data length ;
  • RawTransactionInspectionRead et RawAccountStateInspectionRead sont object-safe et backend-neutral ;
  • ksp-store-lib réexporte les nouveaux contrats sans encore les implémenter sur Store ;
  • le chemin cursor/keyset existant reste inchangé ;
  • aucun SQL, migration ou backend physique nest introduit ;
  • aucun nom/protocole DataTables nentre dans ksp-store-api ;
  • Store Desk demande explicitement le profil Logging supertrace pendant le développement ;
  • fallback Logging Store Desk reste Trace ;
  • tracing frontend couvre boutons, navigation, tabs, changements de contrôles, Refresh et IPC ;
  • 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 :

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 :

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 :

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 :

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

  • workspace.package.version = 0.3.8-pre.4 ;
  • PostgresBackend implémente RawTransactionInspectionRead sans implémenter encore RawAccountStateInspectionRead ;
  • Store implémente le même trait et garde le guard network avant dispatch ;
  • la query d'inspection PostgreSQL est une instruction unique par direction, donc counts et page partagent le même snapshot SQL ;
  • total_items compte toute la famille transaction du Store/network, y compris les tombstones Purged ;
  • filtered_items applique uniquement le range slot optionnel ;
  • sans filtre slot, le SQL réutilise filtered_count comme total_count au lieu d'un second count ;
  • la page random-access utilise LIMIT/OFFSET uniquement dans le chemin d'inspection ;
  • limit non représentable par PostgreSQL et offset > i64::MAX sont rejetés avant acquisition du pool ;
  • les deux queries cursor/keyset historiques restent sans OFFSET et excluent toujours Purged ;
  • les summaries ne sélectionnent ni transaction_row.payload ni archive_row.payload ; seules les tailles OCTET_LENGTH sont projetées ;
  • les marqueurs hot/archive payload sont projetés comme booléens pour rejeter les formes physiques incohérentes sans transférer les bytes ;
  • les summaries Full, Archived et Purged sont décodés avec les invariants physiques correspondants ;
  • une page vide obtenue par offset profond conserve les counts exacts ;
  • le live proof PostgreSQL opt-in couvre counts filtrés, ordre asc/desc, offset et page vide ;
  • inventaires exacts Store/PostgreSQL passent de 10 à 11 implementations RAW et restent symétriques ;
  • 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 :

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 :

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.

20. Gate opérateur pre.004-fix.001 et live proof PostgreSQL

Le rejeu opérateur sur 0.3.8-pre.4.fix.1 est entièrement vert :

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), 697 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-store-postgres-lib: PASS
cargo test -p ksp-store-lib: PASS
cargo check -p ksp-store-lib --no-default-features: PASS
cargo test -p ksp-store-api: PASS

Le live proof postgres_raw_transaction_live a ensuite été exécuté sur une base PostgreSQL dédiée vide. Il atteint réellement PostgreSQL 17 et passe :

KSP Store RawTransaction live proof: server major 17
test pre_009_real_postgres_raw_transaction_vertical_slice_is_atomic_concurrent_and_recoverable ... ok

pre.004 est donc fermé sans réserve et pre.005 peut ouvrir uniquement le vertical slice RawAccountStateInspectionRead.

21. pre.005 — inspection PostgreSQL RawAccountState + façade Store

  • workspace.package.version = 0.3.8-pre.5 ;
  • PostgresBackend implémente RawAccountStateInspectionRead ;
  • Store implémente le même trait avec guard network avant dispatch ;
  • les inventaires RAW Store/PostgreSQL passent de 11 à 12 et restent exactement symétriques ;
  • chaque direction d'inspection Account utilise une seule instruction SQL regroupant filtered_count, total_count conditionnel et page LATERAL ;
  • filtered_items applique le filtre exact pubkey optionnel et le range slot inclusif ;
  • total_items compte toute la famille ksp_raw_account_states et réutilise filtered_count lorsqu'aucun filtre n'est actif ;
  • l'ordre inspection est canonique (slot, pubkey, state_hash) en ascendant ou descendant ;
  • la page random-access utilise LIMIT/OFFSET uniquement dans le chemin inspection ;
  • limit/offset non représentables par PostgreSQL sont rejetés avant acquisition du pool ;
  • les quatre statements cursor/keyset Account historiques restent sans OFFSET ;
  • le SQL d'inspection ne sélectionne jamais account_row.data et projette seulement OCTET_LENGTH(account_row.data) ;
  • RawAccountStateSummary est reconstruit avec reference, lamports, owner, executable, rent epoch et data length uniquement ;
  • longueurs, widths et décimaux hostiles sont rejetés sans écho de valeur ;
  • une page vide obtenue par offset profond conserve les counts exacts ;
  • le live proof Account opt-in couvre filtre pubkey, counts, ordre asc/desc, offset, data length et page vide profonde ;
  • aucune migration, table, index, capability destructive Account, UI Desk ou protocole DataTables n'est ajouté.

22. Gate opérateur pre.005 et ouverture de pre.005-fix.001

Le gate opérateur de pre.005 confirme que les audits Rust/Markdown, ksp-store-lib, ksp-store-api et le live proof PostgreSQL Account sont verts, mais la tranche ne peut pas être fermée : cargo fmt --all, cargo clippy --workspace --all-targets et cargo test -p ksp-store-postgres-lib échouent tous sur une erreur de syntaxe dans le fichier de tests unitaires unit_tests/raw_account.rs.

La fixture inspection_row(data_length_bytes) a perdu sa signature de fonction lors de l'assemblage du delta ; seul son return super::RawAccountInspectionDbRow { ... }; est resté, ce qui laisse une accolade fermante orpheline. Le live proof d'intégration peut néanmoins compiler et passer car ce fichier n'est inclus que sous cfg(test) dans les tests unitaires de la bibliothèque.

pre.005-fix.001 restaure uniquement la signature de cette fixture. Aucun SQL, runtime PostgreSQL, contrat Store, capability ou comportement d'inspection de production n'est modifié. Le live proof Account exécuté sur PostgreSQL 17 reste une preuve valide du chemin runtime :

KSP Store RawAccountState live proof: server major 17
test pre_009_real_postgres_raw_account_vertical_slice_is_atomic_concurrent_and_recoverable ... ok

23. Gate opérateur pre.005-fix.001 et ouverture de pre.005-fix.002

Le rejeu opérateur sur 0.3.8-pre.5.fix.1 confirme que la restauration de la fixture Account inspection est correcte : cargo fmt --all, cargo check --workspace, cargo clippy --workspace --all-targets, les 69 tests unitaires PostgreSQL, ksp-store-lib, le mode --no-default-features et ksp-store-api compilent ou passent jusqu'au test d'intégration dependency_boundary.

Deux canaris historiques Account restent cependant trop larges :

pre_005_raw_account_acquisition_is_atomic_idempotent_and_keeps_trait_impls_out_of_sql_module: FAIL
pre_006_raw_account_additional_observation_is_reference_guarded_cancellation_safe_and_keeps_destructive_scope_closed: FAIL
reason: raw_account.rs contient désormais OFFSET dans les deux statements d'inspection random-access

Ces canaris interdisaient OFFSET sur tout raw_account.rs, alors que depuis pre.005 le fichier contient légitimement deux statements INSPECT_ACCOUNT_STATES_* avec LIMIT/OFFSET. Cette interdiction globale est obsolète. pre.005-fix.002 retire uniquement OFFSET de leurs listes de scope interdit ; les garanties de pagination restent couvertes par :

  • pre_007_raw_account_pagination_is_keyset_cursor_bound_and_policy_free, qui exige que les quatre statements LIST_ACCOUNT_STATES_* et le cursor restent sans OFFSET ;
  • v0_3_8_pre_005_raw_account_keyset_sql_remains_offset_free_while_inspection_is_random_access, qui exige exactement deux occurrences d'OFFSET, uniquement dans les deux statements d'inspection.

Les interdictions destructives UPDATE, DELETE FROM et ON CONFLICT DO UPDATE restent inchangées dans les deux canaris historiques. Aucun SQL, runtime, contrat public, migration, capability ou comportement Store n'est modifié.

Le live proof Account est de nouveau vert sur PostgreSQL 17 :

KSP Store RawAccountState live proof: server major 17
test pre_009_real_postgres_raw_account_vertical_slice_is_atomic_concurrent_and_recoverable ... ok

24. Gate opérateur pre.005-fix.002 et ouverture de pre.005-fix.003

Le rejeu opérateur sur 0.3.8-pre.5.fix.2 confirme que cargo fmt --all, les audits Rust/Markdown, cargo check --workspace, cargo clippy --workspace --all-targets, les 69 tests unitaires PostgreSQL, ksp-store-lib, le mode --no-default-features et ksp-store-api sont verts. Les deux canaris dependency_boundary corrigés par pre.005-fix.002 passent également.

Il reste un unique canari historique trop large dans hardening_completeness.rs :

pre_010_raw_account_private_sql_is_non_destructive_keyset_and_family_local: FAIL
reason: raw_account.rs contient désormais OFFSET dans les deux statements d'inspection random-access

Ce canari pre.010 interdit encore OFFSET sur l'intégralité de raw_account.rs, alors que ce fichier contient légitimement depuis pre.005 deux statements INSPECT_ACCOUNT_STATES_* avec LIMIT/OFFSET. pre.005-fix.003 retire uniquement cette interdiction globale devenue obsolète.

Les garanties pertinentes restent strictes et redondantes :

  • pre_007_raw_account_pagination_is_keyset_cursor_bound_and_policy_free exige que les quatre statements LIST_ACCOUNT_STATES_* restent sans OFFSET ;
  • v0_3_8_pre_005_raw_account_keyset_sql_remains_offset_free_while_inspection_is_random_access exige les quatre statements keyset sans OFFSET, les deux statements d'inspection random-access avec LIMIT/OFFSET, et exactement deux occurrences d'OFFSET dans raw_account.rs ;
  • le canari pre_010 conserve toutes ses interdictions destructives et de policy (SELECT *, ON CONFLICT DO UPDATE, UPDATE, DELETE, TRUNCATE, batch_size, priority).

Aucun SQL, runtime PostgreSQL, contrat public, migration, capability, modèle ou comportement Store n'est modifié.

25. Clôture opérateur pre.005-fix.003

Le rejeu opérateur sur 0.3.8-pre.5.fix.3 ferme pre.005 sans réserve :

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), 701 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-store-postgres-lib: PASS (69 unitaires + integrations/doc-tests)
cargo test -p ksp-store-lib: PASS
cargo check -p ksp-store-lib --no-default-features: PASS
cargo test -p ksp-store-api: PASS

Le live proof postgres_raw_account_live est également vert sur PostgreSQL 17 :

KSP Store RawAccountState live proof: server major 17
test pre_009_real_postgres_raw_account_vertical_slice_is_atomic_concurrent_and_recoverable ... ok

Le smoke cargo tauri dev de Store Desk démarre aussi correctement ; le journal confirme le profil Logging supertrace, le cycle splash/main et les événements frontend navigation/view/IPC. pre.006 peut donc ouvrir.

26. pre.006 — composite Config + lifecycle Store + Overview

  • workspace.package.version = 0.3.8-pre.6 ;
  • config/composite.ksp-app-store-desk.json ajouté avec profils devnet, mainnet, testnet ;
  • chaque profil composite sélectionne Logging supertrace et le profil cfg.std.store homonyme ;
  • cfg.composite.ksp-app-store-desk et son filename sont enregistrés et réexportés par ksp-config-lib ;
  • le registre Config passe de 14 à 15 descriptors et conserve son ordre/inventaire exact ;
  • une fixture Store Desk adaptée au corpus Config unitaire réduit est ajoutée ;
  • les cinq Desk apps utilisant prepare_packaged_runtime() embarquent les 15 resources Config/schema ;
  • leurs canaris de packaging sont réconciliés de 14 à 15 sans changement de runtime métier ;
  • Store Desk dépend désormais de ksp-store-lib mais jamais directement de ksp-store-api ou ksp-store-postgres-lib ;
  • le bootstrap charge le composite Store Desk par son file_id, valide les composants Logging/Store et garde Trace comme fallback Logging sûr ;
  • l'ouverture Store passe exclusivement par ksp_store_lib::Store::open après résolution cfg.std.store ;
  • l'Overview/Diagnostics utilise runtime_snapshot() et health() via StoreRuntimeStatusDto ;
  • le DTO expose seulement profile/backend/network, health, migration et compteurs de pool ; aucune URI, credential, SQL, handle physique ou byte RAW ;
  • la commande Tauri store_runtime_status est backend-neutral et ne prend aucun paramètre sensible ;
  • la fermeture main-window est interceptée une fois, appelle Store::close() via la façade et sort ensuite de Tauri ;
  • les tables RAW restent serverSide:false, sans invoke d'inspection ni second pager ;
  • les clics Refresh, navigation/views, tabs/controls et IPC restent tracés sans valeurs de filtres ni secrets ;
  • aucune migration, query métier d'inspection, détail RAW ou changement de capability Tauri n'est ajouté en pre.006.

Le gate Cargo opérateur de pre.006 reste à exécuter après application du delta.

27. Gate opérateur pre.006 et ouverture de pre.006-fix.001

Le gate opérateur de 0.3.8-pre.6 est fonctionnellement vert : audits Rust/Markdown, cargo check --workspace, cargo clippy --workspace --all-targets, ksp-config-lib (128 unitaires + intégrations), ksp-store-lib, --no-default-features, Store Desk et les quatre autres Desk apps passent. Le smoke cargo tauri dev confirme également le composite mainnet, Logging supertrace, l'ouverture/health Store, les traces frontend et la fermeture Store bornée.

Il subsiste toutefois un warning Rust récurrent :

warning: unused import: `self::store_runtime::StoreRuntime`
  --> crates/ksp-app-store-desk/src/lib.rs

Le réexport StoreRuntime est requis par la règle de façade crate-root et ne doit pas être supprimé. Le défaut est inverse : le module propriétaire utilise encore le nom nu StoreRuntime au lieu de crate::StoreRuntime. La revue de conformité étendue de Store Desk relève le même motif pour plusieurs items partagés déjà réexportés : CommandErrorDto, FrontendLogPayloadDto, SplashSettings, SplashOrderDto, StoreStartup et StoreRuntime.

pre.006-fix.001 applique donc RUST-IMPORT-009, RUST-IMPORT-012 et RUST-API-004 dans la crate Store Desk :

  • tous les items pub/pub(crate) partagés concernés restent réexportés via lib.rs ;
  • leurs usages dans leur module propriétaire passent par crate::Item ;
  • StoreRuntime et StoreStartup utilisent crate::StoreRuntime / crate::StoreStartup jusque dans les impl, signatures et constructions ;
  • les champs DTO partagés utilisent crate::CommandErrorDto ;
  • le bridge frontend prend crate::FrontendLogPayloadDto ;
  • les impl splash utilisent crate::SplashSettings et crate::SplashOrderDto ;
  • WINDOW_LABEL_MAIN et WINDOW_LABEL_SPLASH, utilisés exclusivement dans leur module, redeviennent privés au lieu d'être pub(crate) sans façade crate-root ;
  • un canari dependency_boundary verrouille ces chemins et la distinction item partagé / helper local privé.

Aucun composite Config, Store runtime, query, SQL, DTO wire, commande Tauri, frontend, DataTables ou comportement de fermeture n'est modifié.

28. Clôture opérateur pre.006-fix.001 et pre.007 — RAW Transactions server-side

Le gate opérateur de 0.3.8-pre.6.fix.1 est entièrement vert et ne contient plus le warning de réexport StoreRuntime :

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), 703 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-app-store-desk: PASS (14 unitaires + 3 dependency + 8 desktop contract + 5 security + 1 public API)
cargo test -p ksp-config-lib: PASS (128 unitaires + intégrations)
cargo test -p ksp-store-lib: PASS
cargo check -p ksp-store-lib --no-default-features: PASS

pre.007 branche uniquement la famille RAW Transactions :

  • workspace.package.version = 0.3.8-pre.7 ;
  • StoreTransactionQueryRequestDto ne transporte que offset décimal, limit 25/50/100, slot min/max optionnels et direction canonique ;
  • aucun draw, colonnes DataTables, search arbitraire, order arbitraire, cursor Store, network ou donnée physique ne traverse le request IPC ;
  • StoreRuntime dérive le network du Store ouvert et appelle RawTransactionInspectionRead via ksp-store-lib uniquement ;
  • records_total_decimal et records_filtered_decimal restent exacts jusqu'au contrôle JS-safe côté frontend ;
  • les rows DataTables contiennent signature/slot/block time/format/version/taille/hash/rétention, sans payload bytes ;
  • Transactions utilise serverSide:true, searching:false, ordering:false, page length 25/50/100 et ajax Tauri custom ;
  • DataTables reste l'unique pager visible ; aucun cursor/pager Store parallèle n'est rendu ;
  • les filtres explicites slot min/max + direction déclenchent un redraw depuis la première page ;
  • length=-1, taille hors whitelist, offset non décimal, range inversée et direction inconnue sont rejetés avant la query Store ;
  • les counts hors Number.MAX_SAFE_INTEGER produisent une erreur UX au lieu d'un arrondi silencieux ;
  • store_get_transaction_detail reçoit uniquement la signature encodée de la row et ne reçoit jamais le network du frontend ;
  • le détail Full/Archived charge une seule transaction et expose au maximum 512 bytes en preview hex ;
  • le détail Purged utilise RawTransactionTombstone, sans inventer block time ou payload ;
  • les événements query/page/page-length/redraw/refresh/détail sont tracés sans valeurs de slot, signature ou payload ;
  • les nouveaux items pub(crate) sont réexportés via lib.rs et consommés sous crate::Item ;
  • RAW Accounts reste volontairement serverSide:false jusqu'à pre.008 ;
  • aucune modification ksp-store-api, ksp-store-lib, ksp-store-postgres-lib, migration ou capability n'est introduite par cette tranche applicative.

Le gate opérateur de pre.007 est ensuite entièrement vert :

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), 704 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-app-store-desk: PASS (21 unitaires + 4 dependency + 9 desktop contract + 7 security + 1 public API)
cargo test -p ksp-store-lib: PASS
cargo check -p ksp-store-lib --no-default-features: PASS

Le smoke cargo tauri dev confirme le chemin réel serverSide Transactions : chargement initial de 25 rows, navigation de page, passage à 100 rows/page, IPC store_query_transactions, maintien de RAW Accounts hors serverSide et shutdown Store borné.

29. pre.007-fix.001 — troncature, tooltip et copie des identifiants longs

À la demande opérateur, la présentation des chaînes longues est harmonisée avant pre.008 :

  • signature de transaction tronquée au centre dans la table ;
  • content hash tronqué au centre dans la table ;
  • signature et content hash du modal utilisent la même présentation ;
  • la valeur complète reste accessible au survol par attribut title ;
  • chaque valeur dispose d'un bouton Copier explicite ;
  • Clipboard API utilisée en premier, avec fallback document.execCommand("copy") sans plugin Tauri supplémentaire ;
  • feedback visuel temporaire après copie ;
  • tracing requested/completed/failed ne transporte que le fieldId, jamais la signature, le hash ou la valeur copiée ;
  • le helper reste générique pour réutilisation directe en pre.008 sur pubkey/owner/state hash ;
  • aucun changement backend, IPC, Store, SQL, Config ou capability Tauri.

Le gate Cargo de ce fix reste à rejouer après application du delta.

30. pre.007-fix.002 — correction des canaris copie + copie du preview payload

Le gate opérateur de pre.007-fix.001 confirme que le runtime/frontend démarre et que les boutons de copie sont présents, mais les nouveaux canaris Rust ne compilent pas : plusieurs chaînes de test contiennent des guillemets TypeScript non échappés. Le défaut est strictement dans desktop_contract.rs / desktop_security.rs; le binaire Store Desk reste compilable et le smoke Tauri atteint le détail transaction.

Le même smoke montre également le badge Preview tronquée à 512 bytes. Cette borne reste intentionnelle : le détail IPC ne transporte jamais plus de 512 bytes de RAW payload. pre.007-fix.002 ajoute toutefois une copie explicite du preview hex déjà chargé, sans lever cette borne :

  • les canaris pre.007-fix.001 utilisent des raw string literals Rust valides pour inspecter le TypeScript ;
  • le preview payload reste borné à 512 bytes côté Rust ;
  • un bouton Copier est affiché uniquement lorsqu'un preview existe ;
  • la copie porte exactement sur le preview hex affiché, jamais sur un payload complet non chargé ;
  • le bouton est libellé Copier le preview hex affiché afin de ne pas induire l'utilisateur en erreur lorsque le badge de troncature est visible ;
  • le helper de copie restaure désormais le titre initial du bouton après le feedback Copié, ce qui conserve le libellé spécifique du preview ;
  • le tracing utilise uniquement fieldId = transaction-payload-preview et ne journalise jamais le contenu hex ;
  • aucun changement Store API, Store façade, PostgreSQL, SQL, DTO IPC ou capability Tauri n'est introduit.

Le gate Cargo de ce fix reste à rejouer après application du delta.

31. pre.007-fix.003 — rescope du canari de sécurité de copie

Le gate opérateur de pre.007-fix.002 confirme le comportement runtime attendu : le preview payload tronqué à 512 bytes est copiable et le tracing réel ne transporte que fieldId = transaction-payload-preview. Un seul test de sécurité reste rouge parce que son canari interdit globalement la séquence TypeScript { signature }, qui existe légitimement dans la construction de la requête de détail hors tracing.

pre.007-fix.003 rescope ce canari sur les trois appels de tracing du helper de copie :

  • requested, failed et completed doivent chacun transporter exactement { fieldId } ;
  • les variantes transportant value avec ou sans fieldId restent explicitement interdites ;
  • aucune interdiction globale de variable métier comme signature n'est appliquée hors contexte de tracing ;
  • aucun frontend, backend, IPC, Store, SQL ou capability Tauri n'est modifié.

Le gate Cargo de ce fix reste à rejouer après application du delta.

32. Clôture pre.007-fix.003 et assemblage pre.008 — RAW Accounts server-side

Le gate opérateur de 0.3.8-pre.7.fix.3 est entièrement vert :

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), 707 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-app-store-desk: PASS (21 unitaires + 4 dependency + 11 desktop contract + 9 security + 1 public API)
cargo test -p ksp-store-lib: PASS
cargo check -p ksp-store-lib --no-default-features: PASS

pre.008 branche uniquement la famille RAW AccountState dans Store Desk :

  • workspace.package.version = 0.3.8-pre.8 ;
  • nouveaux DTO app-owned StoreAccount*Dto, tous pub(crate) réexportés via lib.rs et consommés sous crate::Item ;
  • la requête Account IPC ne transporte que offset décimal, limit 25/50/100, pubkey exacte optionnelle, slot min/max optionnels et direction canonique ;
  • aucun draw/search/order/cursor/network/URI/backend physique ne traverse la requête ;
  • le network est dérivé du Store déjà ouvert ;
  • RawAccountStateInspectionRead::inspect_raw_account_states fournit counts exacts et summaries data-free ;
  • les rows exposent pubkey, slot, state hash, owner, lamports, executable, rent epoch et data length sans byte Account ;
  • RAW Accounts passe à serverSide:true, searching:false, ordering:false, 25/50/100 et conserve DataTables comme unique pager ;
  • les counts restent décimaux jusqu'au contrôle Number.MAX_SAFE_INTEGER côté frontend ;
  • store_get_account_detail reçoit uniquement pubkey + slot + state hash de la row et dérive le network côté Rust ;
  • le détail appelle RawAccountStateRead::get_raw_account_state et projette au maximum 512 bytes de data en preview hex ;
  • pubkey, owner, state hash et preview data sont copiables via le helper générique sans journaliser leur valeur ;
  • les filtres Account, pages, page lengths, redraws, refresh et détail sont tracés sans valeurs métier ;
  • aucune modification Store API, Store façade, PostgreSQL, SQL, migration, Config ou capability Tauri n'est nécessaire.

Le gate Cargo de pre.008 reste à rejouer après application du delta.

33. pre.008-fix.001 — correction du canari pubkey Account

Le gate opérateur de 0.3.8-pre.8 confirme que les audits KSP, cargo check --workspace, Store lib et --no-default-features sont verts. L'unique blocage est la compilation du canari desktop_contract.rs : le motif TypeScript pubkey: pubkey === "" ? null : pubkey a été placé dans un string literal Rust ordinaire sans échapper les guillemets internes.

pre.008-fix.001 corrige uniquement ce canari :

  • le motif TypeScript est exprimé par un raw string literal Rust valide ;
  • le contrat vérifié reste exactement pubkey: pubkey === "" ? null : pubkey ;
  • aucun runtime Account, frontend, IPC, DTO, Store, PostgreSQL, SQL, Config ou capability Tauri n'est modifié ;
  • la version workspace devient 0.3.8-pre.8.fix.1 parce qu'un fichier de test Rust est modifié.

Le gate Cargo du fix reste à rejouer après application du delta.