v0.2.6-pre.014-fix.001

This commit is contained in:
2026-08-22 03:04:25 +02:00
parent 6907e4bbb8
commit bd561cad47
19 changed files with 258 additions and 52 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml
# version: 186
# version: 187
[workspace]
resolver = "3"
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
[workspace.package]
version = "0.2.6-pre.14"
version = "0.2.6-pre.14.fix.1"
edition = "2024"
license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-config-desk/README.md -->
<!-- version: 25 -->
<!-- version: 26 -->
# `ksp-app-config-desk`
@@ -109,7 +109,7 @@ Le port HTTP est strict. Les futures applications desk utilisent les couples sui
Les bibliothèques consommées par le bundle applicatif sont déclarées sous `dependencies` : `@fltsci/tauri-plugin-tracing`, `@fortawesome/fontawesome-free`, `@tauri-apps/api`, `bootstrap`, `simplebar` et `resize-observer-polyfill`.
Les outils de compilation/développement et déclarations de types appartiennent à `devDependencies`, notamment `@tauri-apps/cli`, `@types/bootstrap`, `@types/node`, `sass-embedded`, `typescript` et `vite`. Les commandes npm directes sont réservées à l'installation ou à la mise à jour de ces dépendances ; le cycle normal de développement et de build est lancé depuis la racine du workspace par Tauri avec la configuration explicite de l'application.
Les outils de compilation/développement et déclarations de types appartiennent à `devDependencies`, notamment `@tauri-apps/cli`, `@types/bootstrap`, `@types/node`, `sass-embedded`, `typescript` et `vite`. Les commandes npm directes sont réservées à l'installation ou à la mise à jour de ces dépendances. Le cycle normal de développement et de build est **crate-local** : l'opérateur peut rester positionné à la racine du workspace, mais la commande exécute d'abord `cd crates/ksp-app-config-desk` puis `cargo tauri dev`/`build`. `-c/--config` n'est pas utilisé comme sélecteur de crate.
## Logging frontend KSP

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-config-desk/USAGE.md -->
<!-- version: 25 -->
<!-- version: 26 -->
# Utilisation de `ksp-app-config-desk`
@@ -24,11 +24,11 @@ npm i -D
cd ../../
```
`npm i -D` sans nom de package installe les dépendances déclarées du package ; la classification `dependencies` / `devDependencies` reste celle de `package.json`. Les lockfiles frontend restent ignorés et ne sont pas versionnés. Après cette installation, les commandes Cargo/Tauri sont exécutées depuis la racine du workspace.
`npm i -D` sans nom de package installe les dépendances déclarées du package ; la classification `dependencies` / `devDependencies` reste celle de `package.json`. Les lockfiles frontend restent ignorés et ne sont pas versionnés. Après cette installation, l'opérateur peut revenir à la racine du workspace, mais chaque commande Tauri entre explicitement dans la crate ciblée avant d'exécuter le CLI.
## Développement normal
Le frontend n'est pas lancé directement avec npm. KSP est un workspace Rust multi-app : depuis la racine du workspace, la configuration Tauri de l'application doit être sélectionnée explicitement :
Le frontend n'est pas lancé directement avec npm. KSP est un workspace Rust multi-app : `-c/--config` ne sélectionne pas une crate Tauri. Depuis la racine du workspace, la crate applicative est donc sélectionnée en changeant explicitement de répertoire :
```bash
(cd crates/ksp-app-config-desk && cargo tauri dev)

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-app-config-desk/frontend/main.html -->
<!-- version: 17 -->
<!-- version: 18 -->
<!DOCTYPE html>
<html lang="fr">
@@ -26,7 +26,7 @@
</header>
<main class="app-main container-fluid p-0">
<div class="row g-0 h-100">
<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 Config Desk">

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-config-desk/frontend/sass/_app.scss
// version: 6
// version: 7
$app-header-height: 72px;
$app-footer-height: 42px;
@@ -41,6 +41,11 @@ body {
overflow: hidden;
}
.app-main > .row {
flex-wrap: nowrap;
min-width: 0;
}
.app-scrollable {
height: 100%;
max-height: 100%;
@@ -72,6 +77,10 @@ body {
max-height: 100%;
}
.app-content {
min-width: 0;
}
.app-sidebar .nav-link {
white-space: nowrap;
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-config-desk/frontend/sass/splash.scss
// version: 4
// version: 5
@font-face {
font-family: "Dos Amazigh";
@@ -80,7 +80,7 @@ body {
top: 0;
left: 0;
z-index: 3;
width: 55%;
width: 100%;
max-height: 30%;
overflow-y: auto;
padding: 8px;

View File

@@ -1,7 +1,7 @@
{
"name": "ksp-app-config-desk",
"private": true,
"version": "0.2.6-pre.14",
"version": "0.2.6-pre.14.fix.1",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "KSP Config Desk",
"version": "0.2.6-pre.14",
"version": "0.2.6-pre.14.fix.1",
"identifier": "com.sasedev.ksp-app-config-desk",
"build": {
"beforeDevCommand": {

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-config-desk/tests/desktop_contract.rs
// version: 3
// version: 4
//! Desktop build/shell contract audits for Config Desk.
@@ -80,16 +80,21 @@ fn pre_014_template_uses_sidebar_navigation_and_kbot_style_splash_contract() {
let root = app_root();
let main = read_text(root.join("frontend/main.html").as_path());
let splash = read_text(root.join("frontend/splash.html").as_path());
let app_style = read_text(root.join("frontend/sass/_app.scss").as_path());
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
assert!(main.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/main.html -->"));
assert!(main.contains("app-sidebar"));
assert!(main.contains("row g-0 h-100 flex-nowrap"));
assert!(app_style.contains("flex-wrap: nowrap"));
assert!(app_style.contains("min-width: 0"));
assert!(main.contains("nav nav-pills flex-column"));
assert!(splash.starts_with("<!-- file: crates/ksp-app-config-desk/frontend/splash.html -->"));
assert!(splash.contains("id=\"debug-info\""));
assert!(splash.contains("id=\"messages-container\""));
assert!(splash.contains("sass/splash.scss"));
assert!(splash_style.contains("overflow: hidden"));
assert!(splash_style.contains("width: 100%"));
assert!(splash_style.contains("user-select: none"));
assert!(splash_ts.contains("add_debug"));
assert!(splash_ts.contains("add_message"));

View File

@@ -1,32 +1,37 @@
<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->
<!-- version: 1 -->
<!-- version: 2 -->
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="imgs/logo.png">
<link rel="stylesheet" href="sass/main.scss">
<title>Wallet Desk — Dashboard</title>
</head>
<body>
<header class="app-header shadow-sm">
<header class="app-header">
<nav class="navbar h-100 py-0 bg-light text-dark">
<div class="container-fluid h-100 d-flex align-items-center gap-3 px-4 flex-nowrap">
<img class="app-logo" src="./imgs/logo.png" alt="KSP">
<div class="d-flex flex-column me-auto">
<span class="fw-semibold text-primary">Wallet Desk<span id="headerViewTitle" class="text-body">Dashboard</span></span>
<small id="shellStatus" class="text-body-secondary app-shell-status">Initialisation du shell…</small>
<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">Wallet 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">Dashboard</span>
</div>
<div class="ms-auto d-flex align-items-center gap-2 flex-nowrap">
<button class="btn btn-outline-secondary btn-sm" type="button" data-shell-action="deselect" disabled>
<i class="fa-solid fa-xmark me-2" aria-hidden="true"></i>Deselect
</button>
<button class="btn btn-outline-primary btn-sm" type="button" data-shell-action="lock" disabled>
<i class="fa-solid fa-lock me-2" aria-hidden="true"></i>Lock
</button>
</div>
<button class="btn btn-outline-secondary btn-sm" type="button" data-shell-action="deselect" disabled>
<i class="fa-solid fa-xmark me-2" aria-hidden="true"></i>Deselect
</button>
<button class="btn btn-outline-primary btn-sm" type="button" data-shell-action="lock" disabled>
<i class="fa-solid fa-lock me-2" aria-hidden="true"></i>Lock
</button>
</div>
</nav>
</header>
<main class="app-main container-fluid p-0">
<div class="row g-0 h-100">
<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 Wallet Desk">
@@ -39,14 +44,16 @@
</nav>
</div>
</aside>
<section class="col app-content h-100" data-simplebar>
<div class="p-4">
<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">
<div class="d-flex align-items-center justify-content-between mb-4">
<div>
<h1 id="viewTitle" class="h3 mb-1">Dashboard</h1>
<p class="text-body-secondary mb-0">Identité autorisée et balance SOL via le Transport HTTP composite sont actives.</p>
</div>
<span class="badge text-bg-secondary">0.2.6-pre.014</span>
<span class="badge text-bg-secondary">0.2.6-pre.14.fix.1</span>
</div>
<section data-view-panel="dashboard">
<div class="row g-3">
@@ -419,6 +426,8 @@
<dt class="col-md-4">Rôle balance</dt><dd id="diagnosticsTransportRole" class="col-md-8"></dd>
</dl></div></div>
</section>
</div>
</div>
</div>
</section>
</div>
@@ -483,9 +492,11 @@
</div>
</div>
</div>
<footer class="app-footer bg-dark text-white-50 d-flex align-items-center px-4">
<span>KSP Wallet Desk · integration / compliance pre.013</span>
<footer class="app-footer bg-dark text-light">
<div class="container h-100 d-flex align-items-center justify-content-center">
<small>&copy; 2026 SASEDEV</small>
</div>
</footer>
<script type="module" src="./ts/main.ts"></script>
<script type="module" src="ts/main.ts" defer></script>
</body>
</html>

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-wallet-desk/frontend/sass/_app.scss
// version: 1
// version: 2
$app-header-height: 72px;
$app-footer-height: 42px;
@@ -41,13 +41,26 @@ body {
overflow: hidden;
}
.app-main > .row {
flex-wrap: nowrap;
min-width: 0;
}
.app-logo {
display: block;
width: auto;
height: 42px;
}
.app-shell-status,
.app-scrollable {
height: 100%;
max-height: 100%;
}
.app-shell-card {
max-width: 1320px;
}
.app-runtime-list dd,
#walletInventoryTable td:nth-child(2),
#walletInventoryTable td:nth-child(3) {
@@ -66,6 +79,10 @@ body {
max-height: 100%;
}
.app-content {
min-width: 0;
}
.app-sidebar .nav-link {
white-space: nowrap;
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-wallet-desk/frontend/sass/splash.scss
// version: 2
// version: 3
@font-face {
font-family: "Dos Amazigh";
@@ -80,7 +80,7 @@ body {
top: 0;
left: 0;
z-index: 3;
width: 55%;
width: 100%;
max-height: 30%;
overflow-y: auto;
padding: 8px;

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-wallet-desk/frontend/ts/main.ts
// version: 15
// version: 16
import { Modal } from "bootstrap";
import DataTable from "datatables.net-bs5";
@@ -31,7 +31,6 @@ import type { WalletSessionDto } from "./bindings/ksp_app_wallet_desk/wallet_ses
import type { WalletUnlockRequestDto } from "./bindings/ksp_app_wallet_desk/wallet_session/WalletUnlockRequestDto.ts";
import { frontendDebug, frontendInfo, frontendTrace, frontendWarn, installFrontendConsoleBridge } from "./frontend_log";
import { invokeKsp } from "./invoke";
import "../sass/main.scss";
(window as Window & typeof globalThis & { ResizeObserver?: typeof ResizeObserver }).ResizeObserver = ResizeObserver;
installFrontendConsoleBridge("main");
@@ -1437,7 +1436,6 @@ function renderRuntimeStatus(status: RuntimeStatusDto): void {
setText("#runtimeEffectiveWalletsDirectory", status.effectiveWalletsDirectory);
setText("#runtimeWalletDirectoryCreated", status.effectiveWalletsDirectoryCreatedOnStartup ? "oui" : "non, déjà présent");
setText("#runtimeShellPhase", status.shellPhase);
setText("#shellStatus", "Config/Transport résolus ; import/export, VIEW/OWNER, metadata, rotations, strong VIEW et getBalance prêts.");
frontendTrace("main", "Wallet Desk runtime status rendered", {
compositeProfile: status.activeCompositeProfile,
fallbackLoggingActive: status.fallbackLoggingActive,
@@ -1500,7 +1498,6 @@ async function initializeMain(): Promise<void> {
await loadWalletInventory("list_wallets", false);
} catch {
renderWalletInventory([]);
setText("#shellStatus", "Le statut runtime ou l'inventaire Wallet n'a pas pu être chargé.");
frontendWarn("main", "Wallet Desk startup data load failed");
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "ksp-app-wallet-desk",
"private": true,
"version": "0.2.6-pre.14",
"version": "0.2.6-pre.14.fix.1",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "KSP Wallet Desk",
"version": "0.2.6-pre.14",
"version": "0.2.6-pre.14.fix.1",
"identifier": "com.sasedev.ksp-app-wallet-desk",
"build": {
"beforeDevCommand": {

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-wallet-desk/tests/desktop_contract.rs
// version: 15
// version: 16
//! Desktop build, shell and Config-status contract audits for Wallet Desk.
@@ -338,13 +338,9 @@ fn pre_012_owner_export_uses_rust_native_save_picker_and_wallet_file_adapter() {
#[test]
fn pre_013_integration_compliance_and_devnet_smoke_are_durable_release_gates() {
let root = app_root();
let state = read_text(root.join("src/app_state.rs").as_path());
let main = read_text(root.join("frontend/ts/main.ts").as_path());
let compliance = read_text(root.join("tests/release_compliance.rs").as_path());
let smoke = read_text(root.join("tests/wallet_desk_devnet_smoke.rs").as_path());
let validation = read_text(root.join("../../docs/validation/009-V0_2_6_WALLET_DESK_COMPLIANCE.md").as_path());
assert!(state.contains("pre.013-integration-compliance"));
assert!(main.contains("pre.013-integration-compliance"));
assert!(compliance.contains("wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal"));
assert!(compliance.contains("frontend_has_no_direct_filesystem_network_or_secret_persistence_surface"));
assert!(smoke.contains("committed_wallet_desk_composite_creates_wallet_and_reaches_devnet_balance"));
@@ -357,16 +353,32 @@ fn pre_014_template_has_normalized_html_headers_light_header_and_kbot_style_spla
let root = app_root();
let main = read_text(root.join("frontend/main.html").as_path());
let splash = read_text(root.join("frontend/splash.html").as_path());
let app_style = read_text(root.join("frontend/sass/_app.scss").as_path());
let main_ts = read_text(root.join("frontend/ts/main.ts").as_path());
let state = read_text(root.join("src/app_state.rs").as_path());
let splash_style = read_text(root.join("frontend/sass/splash.scss").as_path());
let splash_ts = read_text(root.join("frontend/ts/splash.ts").as_path());
assert!(main.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/main.html -->"));
assert!(main.contains("navbar h-100 py-0 bg-light text-dark"));
assert!(main.contains("ps-2 fs-4 fw-semibold text-primary text-nowrap\">Wallet Desk"));
assert!(main.contains("row g-0 h-100 flex-nowrap"));
assert!(main.contains("col app-content app-scrollable h-100"));
assert!(main.contains("card app-shell-card mx-auto shadow-sm border-0"));
assert!(main.contains("card-body p-4"));
assert!(main.contains("&copy; 2026 SASEDEV"));
assert!(!main.contains("id=\"shellStatus\""));
assert!(app_style.contains("flex-wrap: nowrap"));
assert!(app_style.contains("min-width: 0"));
assert!(state.contains("pre.014-desktop-polish"));
assert!(main_ts.contains("pre.014-desktop-polish"));
assert!(!main_ts.contains("#shellStatus"));
assert!(main.contains("app-sidebar"));
assert!(splash.starts_with("<!-- file: crates/ksp-app-wallet-desk/frontend/splash.html -->"));
assert!(splash.contains("id=\"debug-info\""));
assert!(splash.contains("id=\"messages-container\""));
assert!(splash.contains("sass/splash.scss"));
assert!(splash_style.contains("overflow: hidden"));
assert!(splash_style.contains("width: 100%"));
assert!(splash_style.contains("user-select: none"));
assert!(splash_ts.contains("add_debug"));
assert!(splash_ts.contains("add_message"));

View File

@@ -0,0 +1,121 @@
<!-- file: deltas/0.2.6/pre.014-fix.001.md -->
<!-- version: 1 -->
# Delta `0.2.6-pre.014-fix.001` — layout desktop partagé et canari `pre.013` durable
## Base requise
```text
0.2.6-pre.014 appliquée
workspace.package.version = 0.2.6-pre.14
```
Le checkpoint opérateur fourni confirme `fmt`, audit Rust, `cargo check`, Clippy et Config Desk. `cargo test -p ksp-app-wallet-desk` révèle un seul échec : le canari `pre_013_integration_compliance_and_devnet_smoke_are_durable_release_gates` fige encore l'ancienne phase `pre.013-integration-compliance`, alors que `pre.014` a légitimement fait évoluer le runtime vers `pre.014-desktop-polish`.
## Signal technique
```text
workspace.package.version = 0.2.6-pre.14.fix.1
commit = v0.2.6-pre.014-fix.001
```
Les `package.json` et `tauri.conf.json` des deux Desks suivent le même signal. Aucun tag prerelease.
## Corrections
### Tauri crate-local et current working directory
Le workflow `cargo tauri dev` reste crate-local :
```bash
(cd crates/ksp-app-config-desk && cargo tauri dev)
(cd crates/ksp-app-wallet-desk && cargo tauri dev)
```
Le backend **debug** ne conserve pas le CWD de cette commande : les deux `main.rs` exécutent avant Config `set_current_dir(env!("CARGO_MANIFEST_DIR")/../..)`. Ainsi `config`, `config/schemas`, `./.env`, ainsi que les roots relatifs `logs`/`wallets`, restent ancrés sur la racine workspace pendant `cargo tauri dev`.
Le chemin release n'effectue actuellement aucun recalage. `pre.015` doit fermer explicitement cette différence avant le build final et documenter la stratégie bundle/production.
### Splash
Dans Config Desk et Wallet Desk :
```text
#debug-info width: 55% -> 100%
```
Le feed conserve sa hauteur maximale, son scroll interne et ses scrollbars masquées.
### Layout principal partagé
Les deux Desks empêchent désormais le `row` principal Bootstrap de wrapper :
```text
row principal -> flex-nowrap
.app-main > .row -> flex-wrap: nowrap
.app-content -> min-width: 0
```
Le contenu peut donc rétrécir/scroll sans passer sous la sidebar.
### Wallet Desk aligné sur Config Desk
Wallet Desk adopte le même gabarit structurel :
```text
header : logo + fs-4 app name + tiret + fs-5 view title
header : Deselect/Lock restent à droite
#shellStatus : supprimé
content : container-fluid px-4 py-4
content : card app-shell-card shadow-sm border-0
content : card-body p-4
footer : copyright centré identique à Config Desk
main stylesheet : chargé dans <head> comme Config Desk
```
Aucune commande Wallet, aucun DTO et aucun lifecycle VIEW/OWNER ne changent.
### Canari `pre.013`
Le test de durabilité `pre.013` continue de vérifier :
```text
release_compliance
smoke Devnet ignored/opt-in
validation 009
```
Il ne vérifie plus une `shell_phase` historique, qui est volontairement un indicateur de tranche mutable. Le test `pre.014` devient propriétaire de l'assertion `pre.014-desktop-polish` et des invariants de gabarit actuels.
## Documentation
Sont mis à jour :
```text
crates/ksp-app-config-desk/README.md
crates/ksp-app-config-desk/USAGE.md
docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md
prompts/011-V0_2_6_START_PROMPT.md
```
Restent volontairement inchangés :
```text
ROADMAP.md
CHANGELOG.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
```
## Validation opérateur requise
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-app-config-desk
cargo test -p ksp-app-wallet-desk
cargo test --workspace
```
Puis validation visuelle crate-local des deux Desks. **Ne pas exécuter `cargo tauri build`** : il reste réservé à `pre.015` et doit demeurer l'ultime opération de validation de la release.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/013-V0_2_6_WALLET_DESK_PLAN.md -->
<!-- version: 31 -->
<!-- version: 32 -->
# Plan `0.2.6` — Wallet Desk
@@ -1872,3 +1872,21 @@ bash -lc 'cd crates/ksp-app-wallet-desk && cargo tauri dev'
```
Le build Tauri de production reste reporté à `pre.015` et doit demeurer labsolue dernière opération.
### Correctif `0.2.6-pre.014-fix.001` — layout desktop et canari durable
Le retour opérateur de `pre.014` confirme le lancement Tauri crate-local mais révèle plusieurs écarts purement gabarit. Le correctif conserve `pre.014` comme tranche de polish et applique les décisions suivantes :
```text
Tauri dev : crate-local, puis backend debug recale explicitement le CWD sur la racine workspace
main : row sidebar/content non wrappable + contenu min-width: 0
Wallet Desk : header typographique, shell card/card-body et footer alignés sur Config Desk
Wallet Desk : #shellStatus supprimé du HTML et du TypeScript
splash : feed #debug-info pleine largeur dans les deux Desks
pre.013 gate : le canari ne fige plus une shell_phase destinée à évoluer à chaque tranche
```
Le recalage du CWD n'existe actuellement qu'en `debug_assertions` dans les deux `main.rs`. La candidate `pre.015` doit donc vérifier explicitement la stratégie de résolution production/bundle pour `config`, `.env`, `logs` et `wallets` avant le build final ; le comportement release ne doit pas être supposé identique au parcours `cargo tauri dev`.
Ce fix touche le frontend/build contract et porte donc le signal technique `workspace.package.version = 0.2.6-pre.14.fix.1`. `ROADMAP.md`, `CHANGELOG.md` et `docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md` restent inchangés.

View File

@@ -1,5 +1,5 @@
<!-- file: prompts/011-V0_2_6_START_PROMPT.md -->
<!-- version: 4 -->
<!-- version: 5 -->
# Prompt de démarrage `0.2.6` — Wallet Desk
@@ -703,3 +703,19 @@ Ensuite :
5. **ne pas commencer l'implémentation UI lourde avant ce gate**.
Les règles de la session ne doivent pas être renégociées au fil des corrections : elles sont dans les documents KSP versionnés et doivent être appliquées dès chaque premier patch. Si un conflit ou une règle manquante est découvert, corriger la règle et son contrôle durable avant de propager une nouvelle convention.
## `pre.014-fix.001` — retour opérateur après reprise de session
Le correctif de polish après `pre.014` traite uniquement les régressions de gabarit et de canari :
```text
sidebar/content : aucun wrap lors du redimensionnement
Wallet Desk : header/footer/shell card alignés sur Config Desk
Wallet Desk : suppression de #shellStatus
splash : #debug-info sur toute la largeur
canari pre.013 : ne plus figer la phase shell historique
version technique : 0.2.6-pre.14.fix.1
```
Le workflow Tauri reste crate-local. En debug, les deux binaires recalent ensuite leur current working directory sur la racine du workspace via `CARGO_MANIFEST_DIR/../..`; la stratégie release/bundle reste un point explicite à fermer en `pre.015`.