Files
2026-09-13 11:30:56 +02:00

272 lines
8.7 KiB
Markdown

<!-- 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.
```