v0.2.11-pre.013

This commit is contained in:
2026-08-26 17:41:00 +02:00
parent 81eb295a09
commit 9852613426
5 changed files with 1597 additions and 5 deletions

View File

@@ -1,8 +1,18 @@
<!-- file: CHANGELOG.md --> <!-- file: CHANGELOG.md -->
<!-- version: 14 --> <!-- version: 15 -->
# Changelog KSP # Changelog KSP
## 0.2.11 — Off-chain price transport — 2026-08-26
`0.2.11` crée `ksp-offchain-transport-lib` avec une première surface volontairement bornée à **SOL/USD** et huit adapters REST V1 : CoinGecko, CoinMarketCap, CoinPaprika, Kraken, Coinbase Exchange, Jupiter Price V3, Birdeye et DexScreener. Les adapters utilisent `reqwest` directement, sans SDK provider, avec origines HTTPS possédées par la crate, DTOs wire privés et prix normalisés par `MarketPriceDecimal` sans passage canonique par `f64`. `MarketPriceObservation` conserve paire, sémantique, provenance et timestamps réellement disponibles afin de ne pas confondre prix agrégé, dernier trade d'exchange, heuristique Solana, spot provider et prix DEX pair. DexScreener exige une paire Solana explicite et ne réalise aucune discovery ou sélection automatique de pool.
La crate possède désormais le registry provider-neutral, les descriptors/capabilities, les limites et quotas informatifs, les états `MarketPriceProviderAvailability`, le cooldown et le service générique `MarketPriceService`. Les consumers disposent de `registry`, `refresh`, `refresh_many` et `refresh_all`; le batch V1 reste séquentiel et déterministe, ne dort jamais pour attendre un rate limit et n'introduit ni fallback, ni consensus, ni moyenne KSP. Les erreurs provider sont normalisées en états génériques et les credentials/endpoints/raw bodies restent absents des projections et diagnostics publics.
Config ajoute `std.offchain_transport` V1, son schema, les profils `public_keyless` et `all_free`, ainsi que `ResolvedOffchainTransportConfig` qui construit le service sans dépendance inverse. Les credentials CoinGecko/CoinMarketCap/Jupiter/Birdeye restent sous `KSP_SECRET_*`; la paire DexScreener utilise une provenance `KSP_PUBLIC_*`. Les deux applications desktop existantes embarquent les nouvelles resources Config sans encore consommer fonctionnellement le prix. Les canaris de sécurité verrouillent notamment l'absence d'URL/rate-limit provider configurable au-dessus de Config, de lecture directe d'environnement dans Off-chain Transport et de fuite de clés par `Debug`.
Le gate technique final a passé les audits Rust/Markdown, `cargo check`, Clippy, les tests ciblés Config/Off-chain, le workspace complet et les graphes Cargo. Le premier smoke live keyless a isolé une erreur de query CoinMarketCap (`ids=5426` au lieu de `id=5426`); `pre.011-fix.001` la corrige pour les modes Keyless et Basic, puis le re-smoke passe **7/7** providers keyless. Le smoke keyed Birdeye/CoinGecko Demo/CoinMarketCap Basic/Jupiter Free reste explicitement `SKIP opérateur`. `prompts/017-V0_2_12_START_PROMPT.md` ouvre ensuite `0.2.12 — SOL Prices Desk + intégration prix Wallet Desk` uniquement depuis le tag stable `v0.2.11`, avec audit/sizing desktop strict avant toute implémentation UI lourde.
## 0.2.10 — OrbitFlare Yellowstone gRPC — 2026-08-25 ## 0.2.10 — OrbitFlare Yellowstone gRPC — 2026-08-25
`0.2.10` ajoute OrbitFlare comme provider Yellowstone gRPC sur le moteur N1 et le standard N2 acquis dans `0.2.9`, sans modifier le moteur gRPC ni créer de façade provider inutile. L'audit et le smoke live ont établi le contrat réel du service Solana Free Devnet : endpoint `http://devnet.rpc.orbitflare.com:10000`, authentification par metadata gRPC secrète `x-token` portant la License Key OrbitFlare, et émission du Ping Yellowstone standard. Config Transport V3 représente ce provider avec `provider = orbitflare`, `cluster = devnet`, `protocol = solana_yellowstone` et `secret_metadata`, tandis que `.env.example` inventorie `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` sans valeur réelle. `0.2.10` ajoute OrbitFlare comme provider Yellowstone gRPC sur le moteur N1 et le standard N2 acquis dans `0.2.9`, sans modifier le moteur gRPC ni créer de façade provider inutile. L'audit et le smoke live ont établi le contrat réel du service Solana Free Devnet : endpoint `http://devnet.rpc.orbitflare.com:10000`, authentification par metadata gRPC secrète `x-token` portant la License Key OrbitFlare, et émission du Ping Yellowstone standard. Config Transport V3 représente ce provider avec `provider = orbitflare`, `cluster = devnet`, `protocol = solana_yellowstone` et `secret_metadata`, tandis que `.env.example` inventorie `KSP_SECRET_ORBITFLARE_DEVNET_GRPC_X_TOKEN` sans valeur réelle.

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 284 # version: 285
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"] members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
[workspace.package] [workspace.package]
version = "0.2.11-pre.12" version = "0.2.11-pre.13"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: ROADMAP.md --> <!-- file: ROADMAP.md -->
<!-- version: 88 --> <!-- version: 89 -->
# Roadmap KSP # Roadmap KSP
@@ -55,7 +55,7 @@ Le roadmap décrit les objectifs à atteindre et les grandes étapes prévues. U
- [X] `0.2.8` — Helius LaserStream WebSocket stable : façade provider dédiée sur lactor WebSocket partagé, sept familles standard réutilisées (`account/logs/program/root/signature/slot/slotsUpdates`) + `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s Helius-only, Config V2/secrets redacted, lifecycle adversarial, compliance HTTP 52+14 / Standard WS 18/18 et graphes Cargo finaux validés ; prompt `0.2.9` prêt. - [X] `0.2.8` — Helius LaserStream WebSocket stable : façade provider dédiée sur lactor WebSocket partagé, sept familles standard réutilisées (`account/logs/program/root/signature/slot/slotsUpdates`) + `transactionSubscribe`/`transactionUnsubscribe`, `block/vote` absents, heartbeat Ping 60 s Helius-only, Config V2/secrets redacted, lifecycle adversarial, compliance HTTP 52+14 / Standard WS 18/18 et graphes Cargo finaux validés ; prompt `0.2.9` prêt.
- [X] `0.2.9` — Yellowstone gRPC standard/provider-neutral stable : moteur Tonic/Protobuf KSP partagé, sept unary standard retenues, `Subscribe` bidi et neuf variantes dupdate, lifecycle/backpressure/reconnect/replay bornés sans promesse lossless, Config Transport V3 backward V1/V2 avec provider/protocol séparés, profils PublicNode Mainnet/Testnet authentifiés par `x-token`, smoke live `Subscribe -> Slot` 2/2 PASS et graphes Cargo finaux inspectés ; `SubscribeDeshred` reste hors scope. - [X] `0.2.9` — Yellowstone gRPC standard/provider-neutral stable : moteur Tonic/Protobuf KSP partagé, sept unary standard retenues, `Subscribe` bidi et neuf variantes dupdate, lifecycle/backpressure/reconnect/replay bornés sans promesse lossless, Config Transport V3 backward V1/V2 avec provider/protocol séparés, profils PublicNode Mainnet/Testnet authentifiés par `x-token`, smoke live `Subscribe -> Slot` 2/2 PASS et graphes Cargo finaux inspectés ; `SubscribeDeshred` reste hors scope.
- [X] `0.2.10` — OrbitFlare Yellowstone gRPC stable : profil Config V3 Devnet, License Key injectée comme metadata secrète `x-token`, smoke live `Subscribe -> Slot + Ping` validé deux fois, sans modification du moteur N1/N2 ni heartbeat provider. - [X] `0.2.10` — OrbitFlare Yellowstone gRPC stable : profil Config V3 Devnet, License Key injectée comme metadata secrète `x-token`, smoke live `Subscribe -> Slot + Ping` validé deux fois, sans modification du moteur N1/N2 ni heartbeat provider.
- [ ] `0.2.11`Introduire `ksp-offchain-transport-lib` avec SOL/USD multi-provider via HTTP REST `reqwest` sans SDK provider ; la crate possède adapters, capacités/rate limits, disponibilité et refresh génériques, sans consensus/fallback automatique. - [X] `0.2.11`Off-chain price transport stable : `ksp-offchain-transport-lib` expose SOL/USD via huit adapters REST `reqwest` sans SDK provider, décimal exact, sémantiques/provenance explicites, registry/availability/rate limits et refresh single/many/all génériques ; Config `std.offchain_transport` construit le service sans dépendance inverse, DexScreener reste lié à une paire explicite sans discovery, aucun consensus/fallback automatique nest introduit, et le smoke live keyless final passe 7/7 après correction CoinMarketCap V2.
- [ ] `0.2.12` — Introduire `ksp-app-solprices-desk` comme HID provider-agnostic consommant uniquement `ksp-offchain-transport-lib`, avec tableau prix/provider et refresh individuel/multiple ; puis intégrer cette capacité dans `ksp-app-wallet-desk` sans dupliquer la logique de récupération/normalisation. - [ ] `0.2.12` — Introduire `ksp-app-solprices-desk` comme HID provider-agnostic consommant uniquement `ksp-offchain-transport-lib`, avec tableau prix/provider et refresh individuel/multiple ; puis intégrer cette capacité dans `ksp-app-wallet-desk` sans dupliquer la logique de récupération/normalisation.
- [ ] `0.2.13` — Introduire la première surface de `ksp-interface-lib`, comprenant une API wire publique utilisable par les implémentations officielles et externes. - [ ] `0.2.13` — Introduire la première surface de `ksp-interface-lib`, comprenant une API wire publique utilisable par les implémentations officielles et externes.
- [ ] `0.2.14` — Introduire `ksp-program-api` comme premier contrat Program extensible, sans imposer encore `ksp-program-lib` complet. - [ ] `0.2.14` — Introduire `ksp-program-api` comme premier contrat Program extensible, sans imposer encore `ksp-program-lib` complet.

245
deltas/0.2.11/pre.013.md Normal file
View File

@@ -0,0 +1,245 @@
<!-- file: deltas/0.2.11/pre.013.md -->
<!-- version: 1 -->
# Delta `0.2.11-pre.013` — préparation de publication minimale
## 1. Base
```text
0.2.11-pre.012
```
Cette tranche est exclusivement le couloir de préparation de publication. Conformément à `docs/rules/PROMPT_STRUCTURE.md` et `docs/rules/FILE_CONTRACTS.md`, elle ne modifie aucun code fonctionnel, test, schema, Config, README, USAGE, plan, validation, architecture ou règle normative.
Le payload fonctionnel est limité à :
```text
prompt de démarrage 0.2.12
CHANGELOG.md
ROADMAP.md
```
avec les deux fichiers mécaniques autorisés :
```text
Cargo.toml
deltas/0.2.11/pre.013.md
```
## 2. Gate `pre.012`
Le gate opérateur `pre.012` du `2026-08-26` est entièrement vert :
```text
cargo fmt --all PASS
Rust workspace audit PASS / 0 export candidate
Markdown audit PASS / 127 tables / 122 files
cargo check --workspace PASS
cargo clippy --workspace --all-targets PASS
cargo test --workspace PASS
```
Les suites directement concernées conservent notamment :
```text
Off-chain Transport unit 58/58 PASS
Off-chain dependency boundary 6/6 PASS
Off-chain public API 7/7 PASS
Off-chain release completeness 2/2 PASS
Off-chain security hardening 3/3 PASS
Config unit 120/120 PASS
Config ownership 5/5 PASS
Config public API 16/16 PASS
```
Les smokes live restent `ignored` dans le workspace normal. Le re-smoke keyless `pre.011-fix.001` acquis avant la réconciliation documentaire reste la preuve live finale :
```text
7/7 providers keyless PASS
```
Le smoke keyed reste explicitement `SKIP opérateur` et n'est pas requalifié.
## 3. Version technique
```text
workspace.package.version = 0.2.11-pre.13
commit attendu = v0.2.11-pre.013
aucun tag prerelease
```
Le changement Cargo est mécanique ; aucune sémantique runtime ne change.
## 4. Relecture préalable au prompt `0.2.12`
Avant rédaction du prompt, les sources normatives ont été relues, notamment :
```text
docs/rules/PROMPT_STRUCTURE.md
docs/rules/VERSION_WORKFLOW.md
docs/rules/RULES_DOCUMENTATION.md
docs/rules/RULES_GENERAL.md
docs/rules/RULES_DEPENDENCIES.md
docs/rules/RULES_KSP.md
docs/rules/FILE_CONTRACTS.md
docs/architecture/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/009-ACQUISITION_WORKERS_AND_JOBS.md
docs/architecture/010-APPS_SERVICES_SCENARIOS_AND_CONTROL.md
```
La rédaction a aussi confronté :
```text
prompts/011-V0_2_6_START_PROMPT.md
prompts/015-V0_2_10_START_PROMPT.md
prompts/016-V0_2_11_START_PROMPT.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md
docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md
crates/ksp-offchain-transport-lib public API
ksp-config-lib Off-chain adapter/composite/packaging
ksp-app-config-desk gabarit Tauri actuel
ksp-app-wallet-desk composition/runtime actuel
```
Les sources officielles Tauri 2 actuelles sur configuration, sécurité et capabilities ainsi que la référence TS-RS sont inscrites dans le prompt comme sources externes à réauditer en `0.2.12-pre.001`. Aucune version historique n'est transformée en pin.
## 5. Prompt `0.2.12`
Ajout de :
```text
prompts/017-V0_2_12_START_PROMPT.md
```
Le prompt ouvre exclusivement :
```text
v0.2.11 -> 0.2.12-pre.001
```
Mission :
```text
1. créer ksp-app-solprices-desk comme HID provider-agnostic
2. valider inventory/price/availability/freshness + refresh single/many/all
3. intégrer ensuite la même capacité générique dans ksp-app-wallet-desk
4. ne dupliquer aucune récupération/normalisation provider dans les applications
```
Les décisions acquises sont reprises depuis l'architecture et la clôture `0.2.11` :
```text
SOL/USD V1 existant
8 providers sous Off-chain Transport
aucun provider concret hardcodé dans l'app
Config propriétaire des credentials
Off-chain Transport propriétaire des rate limits/cooldowns
provider_id opaque autorisé comme identifiant générique
ports SOL Prices Desk attendus 1434/1435
Tauri lancé crate-local
aucun fetch provider frontend
aucune API key/URL/header provider dans les DTOs
Wallet Desk réutilise MarketPriceService
```
Le prompt ne transforme pas les questions d'UI/composition encore ouvertes en décisions arbitraires. `pre.001` doit notamment trancher screen map, command/DTO map, composite dédié, ownership de l'état de présentation, UX refresh, capabilities Tauri, insertion Wallet Desk et stratégie de gate fonctionnel/live.
## 6. Prévision souple `0.2.12`
Le prompt fournit un forecast initial détaillé allant de l'audit/sizing au scaffold SOL Prices Desk, composition Config, table/refresh, stabilisation standalone, intégration Wallet Desk, hardening, puis trois couloirs distincts :
```text
gate technique/live final
réconciliation documentaire finale
préparation minimale de publication
```
Le forecast est explicitement recalibrable par `0.2.12-pre.001`. Si SOL Prices Desk + intégration Wallet Desk apparaît surdimensionné pour une release concrète clôturable dans la session, la frontière doit être rediscutée avant implémentation lourde plutôt que de supprimer silencieusement une partie de la mission.
## 7. `CHANGELOG.md`
Le changelog stable est préparé pour `0.2.11 — Off-chain price transport` avec les faits consolidés :
```text
SOL/USD V1
8 adapters REST sans SDK provider
MarketPriceDecimal exact
sémantiques/provenance/timestamps explicites
registry + availability + rate limits/cooldowns
refresh single/many/all séquentiel et déterministe
Config std.offchain_transport V1
origines provider fixes et secrets Config-owned
DexScreener pair explicite sans discovery
aucun consensus/fallback/moyenne KSP
CoinMarketCap ids -> id corrigé au gate live
re-smoke keyless final 7/7 PASS
smoke keyed SKIP opérateur
prompt 0.2.12 préparé
```
## 8. `ROADMAP.md`
`0.2.11` passe à l'état réalisé avec une synthèse stable correspondant au contrat réellement livré et au smoke keyless final `7/7`.
La suite active reste :
```text
0.2.12 SOL Prices Desk + intégration prix Wallet Desk
0.2.13 Interface foundation
0.2.14 Program API foundation
```
Aucune renumérotation supplémentaire n'est introduite.
## 9. Fichiers modifiés/ajoutés
```text
Cargo.toml
CHANGELOG.md
ROADMAP.md
prompts/017-V0_2_12_START_PROMPT.md
deltas/0.2.11/pre.013.md
```
Aucun autre fichier ne doit changer dans cette tranche. En particulier, `prompts/000-README.md` n'est pas mis à jour ici : c'est un README et la lane de publication minimale interdit de rouvrir les README après la réconciliation documentaire.
## 10. Gate opérateur
Comme cette tranche ne modifie aucun code/runtime/config/schema :
```bash
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.2.11
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test --workspace
```
Aucun smoke live ni `cargo tree` n'est à rejouer si le delta est appliqué exactement.
## 11. Suite
Si ce gate est vert, la seule étape restante est :
```text
0.2.11-rel.001
```
Elle est limitée à la mécanique de publication stable : version Cargo `0.2.11`, delta `rel.001`, commit final et tag stable `v0.2.11`, sans rattrapage technique ou documentaire.
Après publication du tag stable, la session suivante ouvre :
```text
0.2.12-pre.001
```
avec `prompts/017-V0_2_12_START_PROMPT.md` et commence impérativement par l'audit/sizing défini dans ce prompt.

File diff suppressed because it is too large Load Diff