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,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;"]);
}