v0.3.15-pre.006
This commit is contained in:
271
deltas/0.3.15/pre.006.md
Normal file
271
deltas/0.3.15/pre.006.md
Normal file
@@ -0,0 +1,271 @@
|
||||
<!-- file: deltas/0.3.15/pre.006.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.3.15-pre.006` — inventaire Config-only des routes Raw Transaction Ingest
|
||||
|
||||
## Base requise
|
||||
|
||||
```text
|
||||
0.3.15-pre.005-fix.002
|
||||
workspace.package.version = 0.3.15-pre.5.fix.2
|
||||
deltas/0.3.15/pre.005.md présent
|
||||
deltas/0.3.15/pre.005-fix.001.md présent
|
||||
deltas/0.3.15/pre.005-fix.002.md présent
|
||||
```
|
||||
|
||||
Le gate opérateur de `pre.005-fix.002` est PASS : audits, `cargo check`, Clippy strict, tests ciblés Desk, workspace all-targets/all-features et parcours visuel via `cargo tauri dev`. Le shell clair commun et le bornage de `routeFoundation` sont confirmés.
|
||||
|
||||
Conformément à `KSP-APP-025` / `KSP-APP-034`, aucun script npm applicatif n'est lancé directement par l'opérateur. Tauri possède le cycle frontend via ses hooks crate-local.
|
||||
|
||||
## Objectif
|
||||
|
||||
Remplacer la fondation statique de routes par un inventaire **Config-only** déterministe qui permet au Desk de distinguer les routes composables et non composables avant toute reconstruction de ressource Transport, ouverture Store ou création Worker.
|
||||
|
||||
`Configured` signifie uniquement « requirements Config satisfaites ». Il ne constitue aucune preuve de disponibilité réseau, Store ou Worker.
|
||||
|
||||
## Inventaire backend
|
||||
|
||||
Le backend :
|
||||
|
||||
```text
|
||||
charge le composite Raw Transaction Ingest Desk validé ;
|
||||
énumère ses profils dans l'ordre source ;
|
||||
résout pour chaque profil les composants Transport et Store via ksp-config-lib ;
|
||||
exige un unique réseau logique identique entre tous les endpoints Transport activés et Store ;
|
||||
calcule les cinq routes V1 avec des capabilities typées ;
|
||||
retourne une projection sûre accompagnée d'une génération monotone.
|
||||
```
|
||||
|
||||
Le calcul ne lance aucun probe réseau et ne construit aucun client/session Transport.
|
||||
|
||||
## Requirements des cinq routes
|
||||
|
||||
### `yellowstone-hydrated`
|
||||
|
||||
```text
|
||||
Yellowstone gRPC activé sur le réseau logique ;
|
||||
HTTP getTransaction composable sur un même rôle logique.
|
||||
```
|
||||
|
||||
### `standard-logs-hydrated`
|
||||
|
||||
```text
|
||||
WebSocket SolanaStandard activé ;
|
||||
capability explicite Logs ;
|
||||
HTTP getTransaction composable sur un même rôle logique.
|
||||
```
|
||||
|
||||
### `standard-block-direct`
|
||||
|
||||
```text
|
||||
WebSocket SolanaStandard activé ;
|
||||
capability explicite Block.
|
||||
```
|
||||
|
||||
Aucun HTTP n'est exigé pour cette route directe.
|
||||
|
||||
### `helius-transaction-hydrated`
|
||||
|
||||
```text
|
||||
WebSocket HeliusLaserStream activé ;
|
||||
capability explicite HeliusTransaction ;
|
||||
HTTP getTransaction composable sur un même rôle logique.
|
||||
```
|
||||
|
||||
### `http-block-polling`
|
||||
|
||||
Un même rôle HTTP logique doit couvrir la composition suivante :
|
||||
|
||||
```text
|
||||
getSlot
|
||||
getBlocksWithLimit
|
||||
getBlock
|
||||
```
|
||||
|
||||
La preuve HTTP utilise directement les `HttpTransportSettings`, rôles et `request_kinds` typés. Aucun `HttpTransportPool` ni client HTTP n'est construit dans cette tranche.
|
||||
|
||||
## Reasons sûres
|
||||
|
||||
L'inventaire projette uniquement les reasons applicatives bornées suivantes :
|
||||
|
||||
```text
|
||||
profile_unresolved
|
||||
network_mismatch
|
||||
missing_http_get_transaction
|
||||
missing_http_block_scan
|
||||
missing_ws_logs_capability
|
||||
missing_ws_block_capability
|
||||
missing_helius_transaction_capability
|
||||
missing_yellowstone_grpc
|
||||
missing_required_secret
|
||||
```
|
||||
|
||||
Les erreurs Config arbitraires, URL, tokens, metadata, URI Store et identités physiques ne traversent pas le DTO d'inventaire.
|
||||
|
||||
## Projection frontend
|
||||
|
||||
La vue `Routes` expose uniquement :
|
||||
|
||||
```text
|
||||
profil logique ;
|
||||
profil default ;
|
||||
réseau logique lorsque résolu ;
|
||||
génération ;
|
||||
route_id ;
|
||||
famille et label sûrs ;
|
||||
state ;
|
||||
selectable ;
|
||||
reason sûre.
|
||||
```
|
||||
|
||||
Le sélecteur de profil ne modifie aucun backend runtime : il sélectionne uniquement la projection déjà calculée à afficher.
|
||||
|
||||
Un refresh reconstruit un inventaire complet depuis Config et ne publie la nouvelle génération qu'après succès.
|
||||
|
||||
## Frontières conservées
|
||||
|
||||
```text
|
||||
aucun Store::open ;
|
||||
aucun ksp-store-lib direct ;
|
||||
aucun HttpTransportPool ;
|
||||
aucune WsProtocolSession ;
|
||||
aucun YellowstoneGrpcChannel ;
|
||||
aucun RawTransactionIngestWorker ;
|
||||
aucun RawTransactionIngestRuntimeResources ;
|
||||
aucun Start/Stop Worker ;
|
||||
aucune logique Backfill ;
|
||||
aucune inférence de capability depuis le provider ;
|
||||
aucun endpoint, URL, secret, metadata, Store URI, source key, handle ou payload RAW côté frontend.
|
||||
```
|
||||
|
||||
La seule nouvelle dépendance KSP directe du Desk est `ksp-onchain-transport-lib`, nécessaire pour consommer les contracts typés de capabilities Transport déjà établis.
|
||||
|
||||
## Cas committed attendu
|
||||
|
||||
Sur le profil autonome `devnet_public` :
|
||||
|
||||
```text
|
||||
yellowstone-hydrated -> Unavailable / missing_yellowstone_grpc
|
||||
standard-logs-hydrated -> Configured
|
||||
standard-block-direct -> Unavailable / missing_ws_block_capability
|
||||
helius-transaction-hydrated -> Unavailable / missing_helius_transaction_capability
|
||||
http-block-polling -> Configured
|
||||
```
|
||||
|
||||
Ce résultat reste une preuve Config uniquement.
|
||||
|
||||
## Workflow Tauri
|
||||
|
||||
Le guide du Desk rappelle le workflow normatif :
|
||||
|
||||
```bash
|
||||
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev)
|
||||
```
|
||||
|
||||
Les scripts `npm run ...` présents dans `tauri.conf.json` sont des hooks déclenchés par Tauri et ne sont pas des commandes de gate opérateur directes. Le `cargo tauri build` final reste réservé à la validation finale et doit être la dernière opération de cette validation conformément à `KSP-APP-034`.
|
||||
|
||||
## Fichiers ajoutés
|
||||
|
||||
```text
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/route_inventory.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/unit_tests/route_inventory.rs
|
||||
deltas/0.3.15/pre.006.md
|
||||
```
|
||||
|
||||
## Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-app-raw-transaction-ingest-desk/Cargo.toml
|
||||
crates/ksp-app-raw-transaction-ingest-desk/README.md
|
||||
crates/ksp-app-raw-transaction-ingest-desk/USAGE.md
|
||||
crates/ksp-app-raw-transaction-ingest-desk/frontend/main.html
|
||||
crates/ksp-app-raw-transaction-ingest-desk/frontend/ts/main.ts
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/bootstrap.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/constants.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/dto_route.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/errors.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/lib.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/src/tauri.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/tests/dependency_boundary.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_contract.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_security.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/tests/release_completeness.rs
|
||||
crates/ksp-app-raw-transaction-ingest-desk/unit_tests/dto_route.rs
|
||||
docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md
|
||||
docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md
|
||||
```
|
||||
|
||||
## Fichiers supprimés
|
||||
|
||||
```text
|
||||
aucun
|
||||
```
|
||||
|
||||
## Version Cargo
|
||||
|
||||
```text
|
||||
header Cargo.toml : 601 -> 602
|
||||
workspace.package.version : 0.3.15-pre.5.fix.2 -> 0.3.15-pre.6
|
||||
```
|
||||
|
||||
## Validations exécutées dans l'environnement d'assemblage
|
||||
|
||||
```text
|
||||
General Rust rule audit: clean
|
||||
Rust export completeness audit: 0 candidate(s)
|
||||
KSP workspace Rust rule audit: clean
|
||||
Markdown table audit: clean
|
||||
HTML parse: clean
|
||||
contrôle des headers/version de fichiers modifiés : clean
|
||||
absence de lockfiles, target et node_modules livrés : clean après purge des caches d'audit
|
||||
```
|
||||
|
||||
## Validations non exécutées dans l'environnement d'assemblage
|
||||
|
||||
La toolchain Cargo/Rust n'est pas disponible dans cet environnement. Les validations suivantes restent donc autoritatives côté opérateur :
|
||||
|
||||
```text
|
||||
cargo fmt
|
||||
cargo check
|
||||
cargo clippy -D warnings
|
||||
tests Desk
|
||||
tests workspace
|
||||
parcours Tauri dev
|
||||
```
|
||||
|
||||
Aucun `npm run build` direct ne fait partie du gate.
|
||||
|
||||
## Gate opérateur attendu
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
cargo fmt --all -- --check
|
||||
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.15
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||
cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features
|
||||
cargo test --workspace --all-targets --all-features
|
||||
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev)
|
||||
```
|
||||
|
||||
Le lancement Tauri sert ici au parcours fonctionnel/visuel du nouvel inventaire. Il ne remplace pas les gates Rust précédents.
|
||||
|
||||
## Décisions prises
|
||||
|
||||
```text
|
||||
pre.006 reste purement déclarative et Config-only ;
|
||||
la reconstruction concrète des ressources Transport est réservée à pre.007 ;
|
||||
Store et Worker restent réservés à pre.008 ;
|
||||
HTTP block polling exige une couverture par un même rôle logique, potentiellement répartie sur plusieurs endpoints du même réseau ;
|
||||
les profils nécessitant un secret non résolu sont fail-closed avec missing_required_secret ;
|
||||
la sélection frontend d'un profil n'est pas une sélection de ressource runtime.
|
||||
```
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
```text
|
||||
aucune pour pre.006 ; les choix physiques d'endpoint et la revalidation Start restent explicitement dans pre.007.
|
||||
```
|
||||
Reference in New Issue
Block a user