v0.3.15-pre.005-fix.002

This commit is contained in:
2026-09-13 11:29:38 +02:00
parent b8d46fbb2b
commit 9ee3cd4a53
7 changed files with 310 additions and 71 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 600
# version: 601
[workspace]
resolver = "3"
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"]
[workspace.package]
version = "0.3.15-pre.5.fix.1"
version = "0.3.15-pre.5.fix.2"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-raw-transaction-ingest-desk/frontend/main.html -->
<!-- version: 1 -->
<!-- version: 2 -->
<!DOCTYPE html>
<html lang="fr">
@@ -8,27 +8,30 @@
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>KSP Raw Transaction Ingest Desk</title>
<title>Raw Transaction Ingest Desk — Routes</title>
</head>
<body>
<header class="app-header bg-dark text-light">
<div class="container-fluid h-100 d-flex align-items-center gap-3 px-4">
<img class="app-logo" src="imgs/logo.png" alt="KSP">
<div>
<div class="fw-semibold">KSP Raw Transaction Ingest Desk</div>
<small class="text-light-emphasis">Composition et supervision des routes live RawTransaction</small>
<header class="app-header">
<nav class="navbar h-100 py-0 bg-light text-dark">
<div class="container-fluid px-4 flex-nowrap">
<div class="navbar-brand d-flex align-items-center me-4 flex-nowrap">
<img alt="KSP" src="imgs/logo.png" class="app-logo">
<span class="ps-2 fs-4 fw-semibold text-primary text-nowrap">Raw Transaction Ingest Desk</span>
<span class="mx-2 fs-5 text-body-secondary" aria-hidden="true"></span>
<span id="headerViewTitle" class="fs-5 text-body text-nowrap">Routes</span>
</div>
<span id="headerPhase" class="badge text-bg-secondary ms-auto">scaffold</span>
</div>
<span id="headerPhase" class="badge text-bg-secondary ms-auto">scaffold</span>
</div>
</nav>
</header>
<main class="app-main container-fluid px-0">
<div class="row g-0 h-100">
<aside class="app-sidebar bg-dark text-light">
<div class="app-sidebar-scroll" data-simplebar>
<nav class="nav nav-pills flex-column p-3 gap-2" aria-label="Navigation principale">
<button class="nav-link active text-start" type="button" data-view="routes">
<main class="app-main container-fluid p-0">
<div class="row g-0 h-100 flex-nowrap">
<aside class="col-auto app-sidebar border-end bg-body-tertiary">
<div class="app-sidebar-scroll h-100" data-simplebar>
<nav class="nav nav-pills flex-column gap-1 p-3" aria-label="Navigation Raw Transaction Ingest Desk">
<button class="nav-link text-start active" type="button" data-view="routes">
<i class="fa-solid fa-route me-2" aria-hidden="true"></i>Routes
</button>
<button class="nav-link text-start" type="button" data-view="diagnostics">
@@ -37,56 +40,58 @@
</nav>
</div>
</aside>
<section class="app-content flex-grow-1">
<div class="h-100" data-simplebar>
<div class="container-fluid p-4">
<section data-view-panel="routes">
<div class="d-flex align-items-start justify-content-between gap-3 flex-wrap mb-4">
<div>
<h1 class="h3 mb-1">Routes live</h1>
<p class="text-body-secondary mb-0">Fondation statique V1 ; la composabilité Config sera matérialisée en pre.006.</p>
<section class="col app-content app-scrollable h-100" data-simplebar>
<div class="container-fluid px-4 py-4">
<div class="card app-shell-card mx-auto shadow-sm border-0">
<div class="card-body p-4">
<section data-view-panel="routes">
<div class="d-flex align-items-start justify-content-between gap-3 flex-wrap mb-4">
<div>
<h1 class="h3 mb-1">Routes live</h1>
<p class="text-body-secondary mb-0">Fondation statique V1 ; la composabilité Config sera matérialisée en pre.006.</p>
</div>
<button id="refreshRouteFoundation" class="btn btn-outline-primary btn-sm" type="button">
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
</button>
</div>
<button id="refreshRouteFoundation" class="btn btn-outline-primary btn-sm" type="button">
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
</button>
</div>
<div class="alert alert-info" role="status">
Aucun Worker n'est démarré par ce scaffold. Les cinq IDs ci-dessous ne constituent aucune preuve de disponibilité runtime.
</div>
<div id="routeFoundation" class="row g-3" aria-live="polite"></div>
<div class="card shadow-sm mt-4">
<div class="card-header fw-semibold">États réservés</div>
<div class="card-body">
<div id="routeStates" class="d-flex flex-wrap gap-2"></div>
<div class="alert alert-info" role="status">
Aucun Worker n'est démarré par ce scaffold. Les cinq IDs ci-dessous ne constituent aucune preuve de disponibilité runtime.
</div>
</div>
</section>
<div id="routeFoundation" class="row g-3 app-route-grid" aria-live="polite"></div>
<div class="card shadow-sm mt-4">
<div class="card-header fw-semibold">États réservés</div>
<div class="card-body">
<div id="routeStates" class="d-flex flex-wrap gap-2"></div>
</div>
</div>
</section>
<section data-view-panel="diagnostics" hidden>
<div class="d-flex align-items-center justify-content-between gap-3 flex-wrap mb-4">
<div>
<h1 class="h3 mb-1">Diagnostics</h1>
<p class="text-body-secondary mb-0">État sûr du scaffold Config, Logging et desktop.</p>
<section data-view-panel="diagnostics" hidden>
<div class="d-flex align-items-center justify-content-between gap-3 flex-wrap mb-4">
<div>
<h1 class="h3 mb-1">Diagnostics</h1>
<p class="text-body-secondary mb-0">État sûr du scaffold Config, Logging et desktop.</p>
</div>
<button id="refreshRuntimeStatus" class="btn btn-outline-primary btn-sm" type="button">
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
</button>
</div>
<button id="refreshRuntimeStatus" class="btn btn-outline-primary btn-sm" type="button">
<i class="fa-solid fa-rotate me-2" aria-hidden="true"></i>Refresh
</button>
</div>
<div class="card shadow-sm">
<div class="card-header fw-semibold">Runtime</div>
<div class="card-body">
<dl class="row mb-0 app-runtime-list">
<dt class="col-sm-5">Version</dt><dd id="runtimeVersion" class="col-sm-7"></dd>
<dt class="col-sm-5">Phase</dt><dd id="runtimeShellPhase" class="col-sm-7"></dd>
<dt class="col-sm-5">Documents Config</dt><dd id="runtimeConfigDocuments" class="col-sm-7"></dd>
<dt class="col-sm-5">Profil composite</dt><dd id="runtimeCompositeProfile" class="col-sm-7"></dd>
<dt class="col-sm-5">Profil Logging</dt><dd id="runtimeLoggingProfile" class="col-sm-7"></dd>
<dt class="col-sm-5">Fallback Logging</dt><dd id="runtimeLoggingFallback" class="col-sm-7"></dd>
</dl>
<div id="runtimeDiagnostic" class="alert alert-warning mt-3 mb-0" role="status" aria-live="polite" hidden></div>
<div class="card shadow-sm">
<div class="card-header fw-semibold">Runtime</div>
<div class="card-body">
<dl class="row mb-0 app-runtime-list">
<dt class="col-sm-5">Version</dt><dd id="runtimeVersion" class="col-sm-7"></dd>
<dt class="col-sm-5">Phase</dt><dd id="runtimeShellPhase" class="col-sm-7"></dd>
<dt class="col-sm-5">Documents Config</dt><dd id="runtimeConfigDocuments" class="col-sm-7"></dd>
<dt class="col-sm-5">Profil composite</dt><dd id="runtimeCompositeProfile" class="col-sm-7"></dd>
<dt class="col-sm-5">Profil Logging</dt><dd id="runtimeLoggingProfile" class="col-sm-7"></dd>
<dt class="col-sm-5">Fallback Logging</dt><dd id="runtimeLoggingFallback" class="col-sm-7"></dd>
</dl>
<div id="runtimeDiagnostic" class="alert alert-warning mt-3 mb-0" role="status" aria-live="polite" hidden></div>
</div>
</div>
</div>
</section>
</section>
</div>
</div>
</div>
</section>

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/frontend/sass/_app.scss
// version: 1
// version: 2
$app-header-height: 72px;
$app-footer-height: 42px;
@@ -52,6 +52,17 @@ body {
height: 42px;
}
.app-scrollable {
height: 100%;
max-height: 100%;
}
.app-shell-card {
width: 100%;
max-width: 1320px;
min-width: 0;
}
.app-sidebar {
width: $app-sidebar-width;
min-width: $app-sidebar-width;
@@ -77,12 +88,30 @@ body {
font-family: var(--bs-font-monospace);
}
.app-route-grid {
margin-right: 0;
margin-left: 0;
}
.app-route-grid > * {
min-width: 0;
}
.app-route-card {
min-width: 0;
max-width: 100%;
overflow: hidden;
border-left: 4px solid rgba($primary, 0.55);
}
.app-route-code {
min-width: 0;
overflow-wrap: anywhere;
word-break: break-word;
}
.app-placeholder {
min-height: 220px;
min-height: 320px;
display: flex;
flex-direction: column;
align-items: center;
@@ -90,6 +119,7 @@ body {
gap: 1rem;
padding: 2rem;
border: 1px dashed var(--bs-border-color);
border-radius: var(--bs-border-radius-lg);
color: var(--bs-secondary-color);
background: var(--bs-body-bg);
text-align: center;

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/frontend/ts/main.ts
// version: 1
// version: 2
import "bootstrap";
import ResizeObserver from "resize-observer-polyfill";
@@ -14,6 +14,11 @@ installFrontendConsoleBridge("main");
type ViewId = "routes" | "diagnostics";
const viewTitles: Record<ViewId, string> = {
routes: "Routes",
diagnostics: "Diagnostics",
};
function isViewId(value: string | undefined): value is ViewId {
return value === "routes" || value === "diagnostics";
}
@@ -27,7 +32,11 @@ function activateView(viewId: ViewId, source: "startup" | "user"): void {
button.classList.toggle("active", active);
button.setAttribute("aria-current", active ? "page" : "false");
});
document.title = `Raw Transaction Ingest Desk — ${viewId === "routes" ? "Routes" : "Diagnostics"}`;
const header = document.querySelector<HTMLElement>("#headerViewTitle");
if (header) {
header.textContent = viewTitles[viewId];
}
document.title = `Raw Transaction Ingest Desk — ${viewTitles[viewId]}`;
frontendTrace("main", "Raw Transaction Ingest Desk view DOM updated", { viewId, source });
}
@@ -83,7 +92,7 @@ function renderRouteFoundation(foundation: RawIngestRouteFoundationDto): void {
routeRoot.replaceChildren();
for (const routeId of foundation.routeIds) {
const column = document.createElement("div");
column.className = "col-12 col-xl-6";
column.className = "col-12 col-xl-6 app-route-column";
const card = document.createElement("div");
card.className = "card h-100 shadow-sm app-route-card";
const body = document.createElement("div");

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_contract.rs
// version: 1
// version: 2
//! Desktop scaffold contract canaries for Raw Transaction Ingest Desk.
@@ -122,3 +122,34 @@ fn pre_005_route_foundation_is_backend_owned_and_has_exact_five_ids_and_seven_st
assert!(!tauri.contains(forbidden), "scaffold Tauri surface contains premature runtime marker {forbidden}");
}
}
#[test]
fn pre_005_fix_002_shell_reuses_common_light_template_and_bounds_route_foundation() {
let html = read_text(app_root().join("frontend/main.html").as_path());
for required in [
"<header class=\"app-header\">",
"navbar h-100 py-0 bg-light text-dark",
"col-auto app-sidebar border-end bg-body-tertiary",
"col app-content app-scrollable h-100",
"card app-shell-card mx-auto shadow-sm border-0",
"id=\"routeFoundation\" class=\"row g-3 app-route-grid\"",
] {
assert!(html.contains(required), "missing common shell marker: {required}");
}
for forbidden in ["app-header bg-dark", "app-sidebar bg-dark text-light", "app-content flex-grow-1"] {
assert!(!html.contains(forbidden), "obsolete shell marker remains: {forbidden}");
}
let styles = read_text(app_root().join("frontend/sass/_app.scss").as_path());
for required in [
".app-scrollable {",
".app-shell-card {",
".app-route-grid {",
".app-route-grid > * {",
"min-width: 0;",
"max-width: 100%;",
"overflow: hidden;",
"overflow-wrap: anywhere;",
] {
assert!(styles.contains(required), "missing bounded layout marker: {required}");
}
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/tests/release_completeness.rs
// version: 1
// version: 2
//! Release-completeness canaries for the Raw Transaction Ingest Desk scaffold tranche.
@@ -46,7 +46,7 @@ fn pre_005_production_module_inventory_is_exact_and_scaffold_only() {
#[test]
fn pre_005_public_surface_exposes_only_application_run_entry_point() {
let lib = read_text(app_root().join("src/lib.rs").as_path());
let public_reexports = lib.lines().filter(|line| line.starts_with("pub use ")).collect::<std::vec::Vec<_>>();
let public_reexports = lib.lines().filter(|line| return line.starts_with("pub use ")).collect::<std::vec::Vec<_>>();
assert_eq!(public_reexports, vec!["pub use self::tauri::run;"]);
}

View File

@@ -0,0 +1,164 @@
<!-- file: deltas/0.3.15/pre.005-fix.002.md -->
<!-- version: 1 -->
# Delta `0.3.15-pre.005-fix.002` — réalignement du template Desk et bornage de `routeFoundation`
## Base requise
```text
0.3.15-pre.005-fix.001
workspace.package.version = 0.3.15-pre.5.fix.1
deltas/0.3.15/pre.005.md présent
deltas/0.3.15/pre.005-fix.001.md présent
```
## Défauts observés
Le contrôle visuel du nouveau `ksp-app-raw-transaction-ingest-desk` montre deux dérives du scaffold livré en `pre.005` :
```text
le shell principal utilise un header et une sidebar sombres alors que les autres ksp-app-*-desk utilisent le template clair commun ;
les cartes générées dans #routeFoundation peuvent déborder horizontalement à droite de la fenêtre.
```
Le gate opérateur de `pre.005-fix.001` révèle également un second défaut Clippy strict dans `tests/release_completeness.rs` :
```text
error: missing `return` statement
-D clippy::implicit-return
```
La closure de filtrage du canari de surface publique utilisait un retour implicite.
## Correction du template desktop
Le shell principal est réaligné sur le contrat visuel déjà utilisé par Config Desk, Wallet Desk, SOL Prices Desk, Store Desk et Backfill Desk :
```text
header app-header contenant une navbar bg-light text-dark ;
sidebar col-auto app-sidebar border-end bg-body-tertiary ;
contenu col app-content app-scrollable h-100 avec SimpleBar ;
container-fluid px-4 py-4 ;
card app-shell-card mx-auto shadow-sm border-0 ;
footer sombre commun inchangé.
```
Le titre de vue du header est désormais explicitement possédé par `#headerViewTitle` et synchronisé par la navigation frontend entre `Routes` et `Diagnostics`.
Aucune couleur métier spécifique n'est introduite : `_variables.scss` et `_bootswatch.scss` restent ceux du template Pulse déjà copié depuis les autres Desk.
## Correction du débordement de `routeFoundation`
La structure commune manquante est restaurée et la grille de routes reçoit en plus des gardes explicites :
```text
app-shell-card avec width 100 %, max-width 1320px et min-width 0 ;
app-route-grid sans marge horizontale négative effective ;
enfants de grille avec min-width 0 ;
cartes avec min-width 0, max-width 100 % et overflow hidden ;
IDs monospace avec overflow-wrap anywhere et word-break break-word.
```
Les colonnes générées par TypeScript portent également `app-route-column` en plus des classes Bootstrap `col-12 col-xl-6`.
Ces protections empêchent un identifiant ou une carte de forcer la largeur du flex item principal au-delà de la fenêtre.
## Correction Clippy
Le canari `pre_005_public_surface_exposes_only_application_run_entry_point` utilise maintenant un `return` explicite dans sa closure :
```rust
.filter(|line| return line.starts_with("pub use "))
```
La règle workspace `clippy::implicit_return = deny` est ainsi respectée également dans ce test d'intégration.
## Canari de régression desktop
`tests/desktop_contract.rs` vérifie désormais explicitement :
```text
le header clair commun ;
la sidebar bg-body-tertiary ;
le flex item Bootstrap col app-content app-scrollable ;
le wrapper app-shell-card ;
l'absence des anciens marqueurs bg-dark/flex-grow-1 ;
les gardes CSS de largeur et de wrapping de routeFoundation.
```
Le test ne fige pas le contenu fonctionnel futur des routes et ne transforme pas le scaffold en runtime Worker.
## Frontières conservées
```text
aucun Start/Stop Worker ;
aucune composition Transport/Store/Worker ;
aucune ouverture d'endpoint ;
aucun changement Config ;
aucune nouvelle API publique ;
aucune nouvelle dépendance ou feature ;
aucun changement des cinq IDs de route ;
aucun changement des sept états applicatifs ;
aucun endpoint, secret ou handle exposé au frontend.
```
## Fichiers ajoutés
```text
deltas/0.3.15/pre.005-fix.002.md
```
## Fichiers modifiés
```text
Cargo.toml
crates/ksp-app-raw-transaction-ingest-desk/frontend/main.html
crates/ksp-app-raw-transaction-ingest-desk/frontend/sass/_app.scss
crates/ksp-app-raw-transaction-ingest-desk/frontend/ts/main.ts
crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_contract.rs
crates/ksp-app-raw-transaction-ingest-desk/tests/release_completeness.rs
```
## Fichiers supprimés
```text
aucun
```
## Version Cargo
Le fix modifie le frontend applicatif et un test Rust. Conformément aux règles de versioning du workspace :
```text
header Cargo.toml : 600 -> 601
workspace.package.version : 0.3.15-pre.5.fix.1 -> 0.3.15-pre.5.fix.2
```
## Audits disponibles 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 (318 table(s), 195 file(s))
HTML parse: clean
```
La toolchain Cargo/Rust n'est pas disponible dans l'environnement d'assemblage. Les gates Cargo, Clippy et tests restent donc à confirmer après application du delta.
## 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 && npm run build)
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev)
```
Le dernier lancement est le contrôle visuel explicite du shell commun et de l'absence de débordement horizontal de `routeFoundation`.