Files
khadhroony-solana-project/docs/validation/018-V0_3_1_STORE_RAW.md

16 KiB

Validation 0.3.1 — Store API RAW foundation

1. Objet

Cette matrice est ouverte par 0.3.1-pre.001 et corrigée par pre.001-fix.001. Elle valide ksp-store-api uniquement. La façade/runtime commune ksp-store-lib et l'implémentation PostgreSQL séparée ksp-store-postgres-lib sont réunies dans 0.3.2.

Le scope concret N1 initial est :

RawTransaction + observation
RawLog + observation
provenance/références/outcomes/queries communs
contrats/capabilities backend externes

Les autres familles RAW restent extensibles et reportées jusqu'à audit réel de leur besoin.

2. Gate pre.001

Critère Statut Preuve
base stable 0.2.14 PASS Cargo 0.2.14, rel.001 et prompt 020 présents
metadata Git/tag N/A archive opérateur sans metadata Git exploitable
baseline opérateur PASS audits, check, Clippy et workspace tests fournis verts sur v0.2.14
ksp-program-api stable PASS façade instruction-only relue
ksp-store-api absent PASS aucun répertoire Store API sur la base
ksp-store-lib absent PASS aucun répertoire Store lib sur la base
archive kbot3 disponible PASS archive historique extraite et auditée
règles Store/API relues PASS règles KSP/Dependencies/Workflow prescrites relues
architecture durable relue PASS graph/store/acquisition relus, D1/D2 séparés
matrice héritage kbot3 PASS REPRENDRE / REDESSINER / REPORTER / REJETER dans le plan 022
audit externe PostgreSQL PASS PostgreSQL 18.6 courant au 28 août 2026
audit driver futur PASS tokio-postgres 0.7.18, Rust 2024/MSRV 1.85, async/transactions/COPY audités
split version PASS 0.3.1 = Store API, 0.3.2 = Store lib PostgreSQL
dependency graph 0.3.1 PASS cible Core-only
modèle backend commun PASS API object/struct commune, rows backend privées
inventaire RAW initial PASS transaction + logs + observations
autres RAW REPORTÉ account/block/slot ajoutés seulement sur besoin audité
provenance PASS provider/protocol/origin/timing sûrs, aucun secret
idempotence PASS atomic put, Inserted/AlreadyPresent, divergence = conflict
API candidate PASS capabilities object-safe + external backend; façade runtime reportée à 0.3.2
public SQL transaction ABSENT invariants atomiques exprimés par opérations métier
pagination PASS 100 par défaut / 500 max / cursor opaque borné
notification ownership PASS référence RAW KSP-owned, mécanisme hors scope
D2/CORE persistence ABSENT explicitement hors 0.3.1
DECODE/SPECIALIZED ABSENT explicitement hors 0.3.1
schema PostgreSQL candidat REPORTÉ déplacé intégralement à 0.3.2 par split API/backend
migration policy REPORTÉ responsabilité ksp-store-postgres-lib 0.3.2
PostgreSQL live gate REPORTÉ aucun backend DB dans 0.3.1; gate obligatoire à définir en 0.3.2
threat model PASS modèle hostile/API/backend couvert dans plan 022
stratégie de tests PASS unit/public/external/firewall/completeness, aucun PostgreSQL live
sizing PASS dix prereleases courtes + lanes fermeture séparées

3. Décisions structurelles à prouver par le code

Contrat Décision pre.001 Gate futur
crate ksp-store-api seule crate Store créée en 0.3.1 pre.002
dépendance normale ksp-core-lib uniquement par défaut pre.002
backend PostgreSQL absent de 0.3.1 completeness pre.007
RawPayload KSP-owned, source-independent, versionné, borné, Debug sans bytes pre.003
transaction identity réseau + signature logique, jamais PK SQL pre.003
RawTransaction objet persistant commun replayable pre.003
RawTransactionObservation acquisition/provenance séparée du RAW pre.003
RawLog famille N1 distincte avec ordering préservé pre.004
RawLogObservation provenance séparée du log canonique pre.004
future RAW families extensibles sans JSON universel pre.004 / pre.007
StoreFuture<'a, T> future object-safe KSP-owned, sans async-trait par défaut pre.005
backend trait implémentable hors workspace, Send + Sync pre.005
façade runtime Store reportée à ksp-store-lib, hors 0.3.1 0.3.2
transaction handle aucun handle SQL/backend public pre.005
atomic acquisition méthode métier RAW + observation all-or-nothing pre.005 / pre.006
write outcome Inserted / AlreadyPresent; divergence = Err Conflict pre.006
PageRequest borné, default 100, max 500 pre.006
cursor opaque, borné, aucun SQL/backend contract visible pre.006
notification reference compacte, durable, payload non dupliqué pre.006 ou report explicite
health portable et sanitisé pre.005 / pre.006

4. Dependency firewall final attendu

Le graphe final 0.3.1 doit rester :

ksp-store-api
└── ksp-core-lib
    └── solana-pubkey

Interdits par défaut dans Store API :

ksp-store-lib
ksp-onchain-transport-lib
ksp-offchain-transport-lib
ksp-interface-lib sans usage de type réel
ksp-program-api
ksp-program-lib
ksp-materializer-api
ksp-config-lib
ksp-logging-lib
ksp-wallet-lib
tokio-postgres
sqlx
serde / serde_json
chrono
tokio
async-trait
Tauri

Toute divergence exige un usage public réel et une révision du plan.

5. Matrice N1 initiale

Famille 0.3.1 Identité logique candidate Replay couvert Provenance
transaction IN network + signature future décomposition générique Solana complète couverte par le format RAW observations séparées
logs IN identité transaction/slot + clé déterministe à stabiliser ordre et contenu log nécessaires à replay/inspection observations séparées
account REPORTÉ pubkey + context/slot/version à auditer futur compte RAW replayable prévu par primitives communes
block REPORTÉ network + slot/block identity futur backfill/block replay prévu par primitives communes
slot/update REPORTÉ sémantique exacte à auditer seulement si un fait durable distinct est utile prévu par primitives communes

6. Frontière N1 -> D2

0.3.1 doit préserver sans implémenter :

RawTransaction
    -> generic Solana normalization
    -> transaction/message
    -> account keys
    -> top-level instructions
    -> CPI/inner instructions
    -> logs/meta/balances/return data
    -> traitement individuel ultérieur

Canari négatif durable :

ksp-store-api -X-> ksp-program-api

Le terme CORE reste le nom architectural actuel de D2 mais peut être renommé avant ouverture de cette couche sans modifier la séparation fonctionnelle.

7. Extensibilité backend

Le canari externe doit démontrer :

crate/test backend externe
    -> dépend de ksp-store-api
    -> définit son propre backend mémoire
    -> implémente les contrats/capabilities publics
    -X-> ksp-store-lib
    -X-> PostgreSQL

0.3.2 ajoutera ensuite la façade de consommation ksp-store-lib. Le backend officiel ksp-store-postgres-lib devra satisfaire la même suite de conformance API.

8. Threat/API gates futurs

Gate Attendu Statut initial
oversized RAW payload rejet avant stockage/copied allocation pathologique pre.003
payload Debug aucun bytes brut pre.003
hostile provenance text borné/trim/control policy explicite pre.003
duplicate same content outcome AlreadyPresent pre.006
duplicate divergent content erreur Conflict stable pre.006
check-then-insert absent de l'API publique pre.005
partial transaction+observation interdit par atomic acquisition contract pre.005
page limit 0/>500 rejet pre.006
cursor oversize rejet pre.006
SQL/backend cursor leak absent pre.006 / pre.007
provider secret leak absent du modèle public pre.003 / pre.007
backend row/public type absent pre.007
async runtime dependency aucune dependency Tokio dans API par défaut pre.005 / pre.007
external backend implémente API sans dépendre de Store lib pre.005
closed RAW enum future family ajoutable pre.004 / pre.007
D2/D3/D4 creep aucune surface pre.007

9. Gates de fermeture prévus

Gate technique final pre.008

Commandes de référence :

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/0.3.1
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-store-api
cargo test -p ksp-logging-lib --test ownership
cargo test --workspace
cargo tree -p ksp-store-api --edges normal
cargo tree --duplicates

Réconciliation documentaire pre.009

Doit fermer :

crates/ksp-store-api/README.md
crates/ksp-store-api/USAGE.md
plan 022
validation 018
indexes/références durables concernées

Sans CHANGELOG.md, ROADMAP.md ni prompt suivant.

Préparation de publication pre.010

Doit rester limitée à :

Cargo.toml
CHANGELOG.md
ROADMAP.md
prompts/021-V0_3_2_START_PROMPT.md
delta pre.010

Le ROADMAP.md est déjà réconcilié par pre.001-fix.001; pre.010 ne doit plus avoir à réparer ce split, seulement refléter l'état final et préparer le prompt 0.3.2.

10. PostgreSQL reporté à 0.3.2

Aucun gate PostgreSQL live n'est demandé à 0.3.1.

Le prochain prompt devra transformer les invariants API en façade commune + backend de référence et prévoir :

ksp-store-lib
  -> façade Store commune
  -> réexports utiles de ksp-store-api
  -> feature postgres par défaut
  -> dispatch backend selon Config
  -> erreur backend connu mais non compilé

ksp-store-postgres-lib
  -> tokio-postgres
  -> pool/TLS audités
  -> migrations KSP-owned
  -> schema conformance
  -> write/read round-trip des modèles API
  -> idempotence/race
  -> atomic rollback
  -> pagination

Config
  -> std.store
  -> URI/DSN backend lorsque naturel
  -> secrets ${KSP_SECRET_*} / .env owned par ksp-config-lib
  -> aucun vrai secret versionné

sécurité
  -> URI/DSN/credentials redacted
  -> aucune lecture directe env/.env par Store ou backend
  -> PostgreSQL réel opt-in puis gate final obligatoire

11. État initial des tranches

Tranche Objet État
pre.001 audit/design/split API/backend PRÊT après gate local
pre.002 scaffold Store API À FAIRE
pre.003 primitives + RawTransaction À FAIRE
pre.004 RawLog + extensibilité N1 À FAIRE
pre.005 backend contracts/capabilities À FAIRE
pre.006 queries/outcomes/notification À FAIRE
pre.007 adversarial/completeness À FAIRE
pre.008 gate technique final À FAIRE
pre.009 réconciliation documentaire À FAIRE
pre.010 préparation publication À FAIRE
rel.001 stable À FAIRE