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

8.7 KiB

Delta 0.3.15-pre.006 — inventaire Config-only des routes Raw Transaction Ingest

Base requise

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 :

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

Yellowstone gRPC activé sur le réseau logique ;
HTTP getTransaction composable sur un même rôle logique.

standard-logs-hydrated

WebSocket SolanaStandard activé ;
capability explicite Logs ;
HTTP getTransaction composable sur un même rôle logique.

standard-block-direct

WebSocket SolanaStandard activé ;
capability explicite Block.

Aucun HTTP n'est exigé pour cette route directe.

helius-transaction-hydrated

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 :

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 :

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 :

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

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 :

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 :

(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

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

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

aucun

Version Cargo

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

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 :

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

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

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

aucune pour pre.006 ; les choix physiques d'endpoint et la revalidation Start restent explicitement dans pre.007.