From 8099b6cb390be91358e651ee531f6b4eca148e72 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 17 Aug 2026 08:55:24 +0200 Subject: [PATCH] v0.1.4-pre.019 --- Cargo.toml | 4 +- ROADMAP.md | 4 +- config/std.logging.json | 212 ++++++------------ crates/ksp-app-config-desk/README.md | 10 +- crates/ksp-app-config-desk/TODO.md | 9 +- crates/ksp-app-config-desk/USAGE.md | 23 +- deltas/0.1.4/pre.019.md | 84 +++++++ docs/000-README.md | 7 +- docs/IDEAS.md | 12 +- docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md | 15 +- docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md | 79 ++++--- docs/validation/000-README.md | 12 + docs/validation/001-V0_1_4_CONFIG_DESKTOP.md | 79 +++++++ prompts/000-README.md | 3 +- prompts/005-V0_2_1_START_PROMPT.md | 68 ++++++ 15 files changed, 422 insertions(+), 199 deletions(-) create mode 100644 deltas/0.1.4/pre.019.md create mode 100644 docs/validation/000-README.md create mode 100644 docs/validation/001-V0_1_4_CONFIG_DESKTOP.md create mode 100644 prompts/005-V0_2_1_START_PROMPT.md diff --git a/Cargo.toml b/Cargo.toml index 4177d3a..441d7db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 90 +# version: 91 [workspace] resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib"] [workspace.package] -version = "0.1.4-pre.18.fix.1" +version = "0.1.4-pre.19" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/ROADMAP.md b/ROADMAP.md index ca739c1..6dd91ad 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,5 +1,5 @@ - + # Roadmap KSP @@ -36,7 +36,7 @@ Regrouper les releases consacrées aux fondations N1. Chaque release concrète e - [X] `0.1.3` — Stabiliser `ksp-config-lib` : documents, profils, résolution, validation, environnement KSP/KSPB, management/persistence et adapter Logging. - [/] `0.1.4` — Introduire `ksp-app-config-desk` pour valider réellement Config et la frontière Tauri. -`0.1.1`, `0.1.2` et `0.1.3` sont désormais stables. `0.1.4` est ouverte par `pre.001` avec le plan `docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md` ; elle introduit `ksp-app-config-desk`, première validation desktop/Tauri de Config et modèle des futures applications Tauri KSP. +`0.1.1`, `0.1.2` et `0.1.3` sont désormais stables. `0.1.4` a atteint sa tranche finale `pre.019` avec `ksp-app-config-desk`, première validation desktop/Tauri de Config et modèle des futures applications Tauri KSP ; sa publication stable reste conditionnée à la validation finale puis à `rel.001`. Les contrats publics supplémentaires ne sont introduits que lorsqu'une release concrète en démontre le besoin. diff --git a/config/std.logging.json b/config/std.logging.json index ba0b0c7..3776633 100644 --- a/config/std.logging.json +++ b/config/std.logging.json @@ -1,147 +1,77 @@ { - "default_profile": "local_dev", - "format_version": 1, - "logs_directory": "${KSP_LOGS_DIRECTORY:-logs}", - "profiles": [ - { - "console": { - "ansi": true, - "enabled": true, - "filter": { - "domains": [ - "*" - ], - "level": "debug", - "targets": [ - "*" - ] - }, - "format": "compact", - "output": "stderr" - }, - "default_filter": "info", - "files": [ + "format_version": 1, + "logs_directory": "${KSP_LOGS_DIRECTORY:-logs}", + "default_profile": "local_dev", + "profiles": [ { - "ansi": false, - "enabled": true, - "filter": { - "domains": [ - "*" + "profile_id": "local_dev", + "default_filter": "warn", + "span_events": "new_and_close", + "console": { + "enabled": true, + "output": "stderr", + "ansi": true, + "format": "compact", + "filter": { + "level": "info", + "targets": [ + "*" + ], + "domains": [ + "*" + ] + } + }, + "files": [ + { + "output_id": "file.all.info", + "enabled": true, + "path": "info/ksp-info.log", + "rotation": "daily", + "format": "human", + "ansi": false, + "filter": { + "level": "info", + "targets": [ + "*" + ], + "domains": [ + "*" + ] + } + }, + { + "output_id": "file.config.error", + "enabled": true, + "path": "config/ksp-config-errors.jsonl", + "rotation": "daily", + "format": "json", + "ansi": false, + "filter": { + "level": "error", + "targets": [ + "ksp-config-lib" + ], + "domains": [ + "config" + ] + } + } ], - "level": "debug", - "targets": [ - "*" + "target_filters": [ + { + "target_prefix": "ksp-config-lib", + "level": "info" + }, + { + "target_prefix": "ksp-logging-lib", + "level": "info" + }, + { + "target_prefix": "ksp-app-config-desk", + "level": "info" + } ] - }, - "format": "human", - "output_id": "file.all.debug", - "path": "debug/ksp-debug.log", - "rotation": "daily" - }, - { - "ansi": false, - "enabled": true, - "filter": { - "domains": [ - "config" - ], - "level": "error", - "targets": [ - "ksp-config-lib" - ] - }, - "format": "json", - "output_id": "file.config.error", - "path": "config/ksp-config-errors.jsonl", - "rotation": "hourly" } - ], - "profile_id": "local_dev", - "span_events": "off", - "target_filters": [ - { - "level": "trace", - "target_prefix": "ksp-config-lib" - }, - { - "level": "debug", - "target_prefix": "ksp-logging-lib" - }, - { - "level": "debug", - "target_prefix": "ksp-app-config-desk" - } - ] - }, - { - "console": { - "ansi": true, - "enabled": true, - "filter": { - "domains": [ - "*" - ], - "level": "debug", - "targets": [ - "*" - ] - }, - "format": "compact", - "output": "stderr" - }, - "default_filter": "info", - "files": [ - { - "ansi": false, - "enabled": true, - "filter": { - "domains": [ - "*" - ], - "level": "debug", - "targets": [ - "*" - ] - }, - "format": "human", - "output_id": "file.all.debug", - "path": "debug2/ksp-debug.log", - "rotation": "daily" - }, - { - "ansi": false, - "enabled": true, - "filter": { - "domains": [ - "config" - ], - "level": "error", - "targets": [ - "ksp-config-lib" - ] - }, - "format": "json", - "output_id": "file.config.error", - "path": "config2/ksp-config-errors.jsonl", - "rotation": "hourly" - } - ], - "profile_id": "local_test", - "span_events": "off", - "target_filters": [ - { - "level": "trace", - "target_prefix": "ksp-config-lib" - }, - { - "level": "debug", - "target_prefix": "ksp-logging-lib" - }, - { - "level": "debug", - "target_prefix": "ksp-app-config-desk" - } - ] - } - ] + ] } diff --git a/crates/ksp-app-config-desk/README.md b/crates/ksp-app-config-desk/README.md index 64d4345..5a51801 100644 --- a/crates/ksp-app-config-desk/README.md +++ b/crates/ksp-app-config-desk/README.md @@ -1,5 +1,5 @@ - + # `ksp-app-config-desk` @@ -124,7 +124,7 @@ main -> ksp-app-config-desk.frontend.main splash -> ksp-app-config-desk.frontend.splash ``` -Rust valide le niveau et le `targetId`, choisit un callsite statique puis émet exclusivement via les macros de `ksp-logging-lib`. Le package applicatif n'importe pas directement `tracing`. Le pont actuel garantit donc le trajet WebView -> Rust tout en conservant l'affichage local des appels `console.*` dans la console WebKit. Il ne réémet pas encore les événements Rust arbitraires vers la console WebKit : cette direction nécessitera une intégration contrôlée de `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`, sans second subscriber ni boucle avec le bridge KSP. Le panneau **Test Logging** complète désormais ce bridge : il peut émettre des événements backend via `ksp-logging-lib` avec target KSP statique et domain contrôlé, ou réutiliser le bridge frontend existant avec son target/domain fixes. +Rust valide le niveau et le `targetId`, choisit un callsite statique puis émet exclusivement via les macros de `ksp-logging-lib`. Le package applicatif n'importe pas directement `tracing`. Le pont actuel garantit donc le trajet WebView -> Rust tout en conservant l'affichage local des appels `console.*` dans la console WebKit. Le retour général Rust -> console WebKit est volontairement hors périmètre de `0.1.4` : une future intégration devra passer par une couche possédée par `ksp-logging-lib`, sans second subscriber, double émission ni boucle avec le bridge KSP. Le panneau **Test Logging** complète désormais ce bridge : il peut émettre des événements backend via `ksp-logging-lib` avec target KSP statique et domain contrôlé, ou réutiliser le bridge frontend existant avec son target/domain fixes. ## Panneau Test Logging @@ -168,7 +168,11 @@ Le panneau expose `format_version`, `logs_directory`, `default_profile`, tous le `pre.016` distingue en plus le **profil default persistant** du **profil runtime actif**. La section **Runtime actif** expose le profil actuellement appliqué, `selection_source` (`default_profile`, `explicit` ou `fallback`), la génération, l'état console, les compteurs de lignes abandonnées et les file sinks réellement actifs. Un profil déjà persisté peut être appliqué explicitement sans modifier `default_profile` ni écrire le document ; cette action est désactivée tant que le brouillon contient des changements non sauvegardés. -Chaque lancement de Config Desk crée aussi une `LoggingRuntimeIdentity` stable : `application_id` + timestamp UTC de démarrage + PID. `ksp-logging-lib` utilise cette identité pour préfixer les noms des fichiers actifs et la conserve pendant tous les hot reloads du même processus. Deux lancements distincts ne partagent donc plus le même fichier persistant, même avec une rotation `daily`. Exemple d'un prefix effectif : `ksp-app-config-desk.20260816-182519.123Z-p4242.ksp-debug.log`. Le path Config reste inchangé ; l'identité appartient au runtime, pas au document source. +Chaque lancement de Config Desk crée aussi une `LoggingRuntimeIdentity` stable : `application_id` + timestamp UTC de démarrage + PID. `ksp-logging-lib` utilise cette identité pour préfixer les noms des fichiers actifs et la conserve pendant tous les hot reloads du même processus. Deux lancements distincts ne partagent donc plus le même fichier persistant, même avec une rotation `daily`. Avec la configuration de release `info/ksp-info.log`, un prefix effectif peut être `ksp-app-config-desk.20260816-182519.123Z-p4242.ksp-info.log`. Le path Config reste inchangé ; l'identité appartient au runtime, pas au document source. + +## Baseline Logging de release + +La configuration canonique livrée avec `0.1.4` revient à une baseline opératoire `info` conformément à KSP-APP-031 : console `info`, sink général `info/ksp-info.log` au niveau `info`, et overrides `ksp-config-lib`, `ksp-logging-lib`, `ksp-app-config-desk` à `info`. Le `default_filter` reste `warn` pour les autres targets KSP. Les niveaux `debug`/`trace` restent disponibles et peuvent être remontés temporairement depuis Config Desk lors d’un développement ou diagnostic, puis redescendus avant la release suivante. ## Traçabilité frontend diff --git a/crates/ksp-app-config-desk/TODO.md b/crates/ksp-app-config-desk/TODO.md index 38020aa..2193c2e 100644 --- a/crates/ksp-app-config-desk/TODO.md +++ b/crates/ksp-app-config-desk/TODO.md @@ -1,11 +1,10 @@ - + # TODO `ksp-app-config-desk` -Le gabarit frontend, le bootstrap Config/Logging, `AppState`, le `LoggingGuard` durable, les premiers DTO TS-RS, le bridge frontend logging KSP, le lifecycle `splash -> main`, les panneaux Documents, Profils/provenance et Environnement avec management `.env`/reveal Secret privilégié, ainsi que l'édition typée/persistence atomique du document Logging, son hot reload transactionnel, la sélection explicite du profil runtime, les fichiers isolés par identité de lancement, le panneau Test Logging backend/frontend, le registre d'éditeurs spécialisés et les audits desktop de robustesse sont maintenant présents. +Aucun TODO bloquant ne reste ouvert pour la release `0.1.4`. -La clôture `pre.019` doit encore : +La première version fonctionnelle de Config Desk couvre le shell Tauri, le bootstrap Config/Logging, l’inventaire et la réparation des documents, l’inspection des profils/provenance, le management `.env`, le reveal Secret privilégié, l’éditeur Logging typé, la persistence atomique, le hot reload transactionnel, la sélection explicite du profil runtime, les fichiers de logs isolés par lancement, le panneau Test Logging backend/frontend, le registre d’éditeurs spécialisés et les audits desktop. -- ramener le target applicatif de `debug` à `info` ou `warn` avant clôture de la release ; -- étudier puis intégrer le retour Rust -> console WebKit via `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`, afin de pouvoir utiliser `attachConsole()` sans second subscriber, double émission ni boucle avec le bridge KSP. +Le retour général **Rust -> console WebKit** via une `WebviewLayer` du plugin tracing est volontairement reporté hors `0.1.4`. Le trajet **WebView -> Rust -> ksp-logging-lib** est déjà validé et le panneau Test Logging couvre le routing runtime. Une future intégration Rust -> WebKit devra être conçue dans `ksp-logging-lib` afin de préserver le subscriber unique, d’éviter les doubles émissions et de ne pas créer de boucle avec le bridge `console.*` existant. Le sujet est conservé dans `docs/IDEAS.md`. diff --git a/crates/ksp-app-config-desk/USAGE.md b/crates/ksp-app-config-desk/USAGE.md index ed4e7bc..9de9e2e 100644 --- a/crates/ksp-app-config-desk/USAGE.md +++ b/crates/ksp-app-config-desk/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de `ksp-app-config-desk` @@ -85,7 +85,7 @@ splash Ils sont convertis côté Rust vers des targets KSP statiques `ksp-app-config-desk.frontend*` et émis uniquement via `ksp-logging-lib`. Un niveau différent de `trace`, `debug`, `info`, `warn` ou `error`, ou un `targetId` non whitelisté, est rejeté avec un `CommandErrorDto` sûr. -`main.ts` et `splash.ts` installent aussi le bridge `console.*`; l'échec éventuel d'un `invoke` est écrit uniquement sur la console WebView originale afin d'éviter une boucle de logging. Ce bridge conserve donc les messages JavaScript dans la console WebKit et les transmet vers Rust, mais il ne reflète pas encore les événements Rust généraux dans cette console. `attachConsole()` du package officiel nécessite que le subscriber Rust publie vers une `WebviewLayer`; cette couche devra être raccordée plus tard à l'ownership de `ksp-logging-lib` plutôt que d'installer un subscriber Tauri parallèle. +`main.ts` et `splash.ts` installent aussi le bridge `console.*`; l'échec éventuel d'un `invoke` est écrit uniquement sur la console WebView originale afin d'éviter une boucle de logging. Ce bridge conserve les messages JavaScript dans la console WebKit et les transmet vers Rust. Le retour général Rust -> console WebKit est reporté hors `0.1.4`; il devra être ajouté ultérieurement sous ownership de `ksp-logging-lib`, sans installer de subscriber Tauri parallèle ni créer de boucle avec ce bridge. ## Bindings TS-RS @@ -257,10 +257,10 @@ Au démarrage de Config Desk, l'identité de lancement est construite une seule 20260816-182519.123Z-p4242 ``` -Pour un fichier source configuré comme `debug/ksp-debug.log`, le runtime peut donc exposer un prefix comme : +Avec la baseline de release configurée sur `info/ksp-info.log`, le runtime peut exposer un prefix comme : ```text -ksp-app-config-desk.20260816-182519.123Z-p4242.ksp-debug.log +ksp-app-config-desk.20260816-182519.123Z-p4242.ksp-info.log ``` Le même `launch_timestamp` doit rester affiché après chaque hot reload du processus courant. Après fermeture puis nouveau lancement de l'application, il doit changer. La rotation `daily` ou `hourly` peut ajouter sa composante de rotation, mais deux lancements ne doivent plus partager le même prefix applicatif. @@ -283,6 +283,21 @@ Le bouton d'application explicite est désactivé lorsque le brouillon est sale Si la résolution ou la préparation du profil explicite échoue, `ksp_logging_lib::reinitialize()` ne remplace pas les layers actifs et la génération ne doit pas avancer. Une sauvegarde de document qui échoue pendant l'application runtime conserve également l'ancien runtime et restaure la source précédente lorsqu'elle avait été modifiée. +## Baseline Logging de release + +Après les tests `debug`/`trace`, la configuration canonique `0.1.4` revient à : + +```text +default_filter = warn +console.filter.level = info +file.all.info = info/ksp-info.log @ info +ksp-config-lib = info +ksp-logging-lib = info +ksp-app-config-desk = info +``` + +Pour rouvrir un diagnostic, augmenter temporairement un niveau depuis l’éditeur Logging, utiliser **Sauvegarder et appliquer**, puis restaurer `info`/`warn` avant la prochaine clôture de release. + ## Validation desktop de robustesse La validation suit un ordre strict. Depuis la racine du workspace, valider d’abord Rust : diff --git a/deltas/0.1.4/pre.019.md b/deltas/0.1.4/pre.019.md new file mode 100644 index 0000000..7fc26b2 --- /dev/null +++ b/deltas/0.1.4/pre.019.md @@ -0,0 +1,84 @@ + + + +# Delta `0.1.4-pre.019` — clôture de Config Desk + +## Base + +`0.1.4-pre.018-fix.001` est validée : `cargo fmt --all`, `cargo check --workspace`, `cargo clippy --workspace --all-targets`, les tests Config Desk/Config/Logging, les audits desktop/ownership/API, le type-check frontend, le parcours fonctionnel `tauri dev`, puis `cargo tauri build` exécuté en dernière opération sont propres. Le build a produit les bundles Linux attendus. + +## Objectif + +Fermer la phase de développement `0.1.4` sans ajouter de nouvelle fonction métier : remettre la configuration Logging canonique au niveau de release, finaliser la documentation et les TODO, matérialiser la matrice de validation finale, préparer la reprise `0.2.1` et cadrer `rel.001`. + +## Changements + +### Baseline Logging de release + +`config/std.logging.json` est volontairement réinitialisé comme **source canonique de release** : + +- un seul profil `local_dev` ; +- `default_filter=warn` ; +- console `info` ; +- sink général `file.all.info` vers `info/ksp-info.log`, niveau `info` ; +- sink `file.config.error` conservé ; +- overrides `ksp-config-lib`, `ksp-logging-lib`, `ksp-app-config-desk` ramenés à `info`. + +Cette remise à zéro retire les profils/élévations `debug`/`trace` créés pendant les tests manuels et ferme KSP-APP-031. Les niveaux peuvent être relevés à nouveau depuis Config Desk lorsqu’un développement/correctif est explicitement rouvert. + +### TODO / WebKit + +Aucun TODO bloquant `0.1.4` ne reste ouvert. Le retour général Rust -> console WebKit est reporté : le bridge WebView -> Rust -> KSP et le panneau Test Logging satisfont le contrat de cette release. Une future réflexion devra rester sous ownership de `ksp-logging-lib` et démontrer l’absence de second subscriber, double émission et boucle. Le sujet est déplacé dans `docs/IDEAS.md`. + +### Documentation finale + +- README/USAGE Config Desk synchronisés avec la baseline de release et le report WebKit ; +- plan `0.1.4` : `pre.018` réalisé, `pre.019` en cours ; +- roadmap : `0.1.4` en tranche finale, encore non stable avant `rel.001` ; +- nouvelle matrice `docs/validation/001-V0_1_4_CONFIG_DESKTOP.md` ; +- index docs mis à jour ; +- aucun `PRESENTATION.md` ajouté. + +### Reprise suivante + +`prompts/005-V0_2_1_START_PROMPT.md` est ajouté. `0.2.1-pre.001` doit commencer par brainstorming/audit/planification et sélectionner un seul premier périmètre N2 parmi Wallet, transport on-chain et Interface/wire avant tout développement fonctionnel. + +## Version technique + +```text +workspace.package.version = 0.1.4-pre.19 +``` + +## Validation finale attendue + +Exécuter strictement dans l’ordre : + +```bash +cargo fmt --all +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test --workspace +cargo tree -p ksp-app-config-desk +cargo tree -p ksp-config-lib +cargo tree -p ksp-logging-lib +cd crates/ksp-app-config-desk +npm run check +cd ../.. +cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json +``` + +Vérifier fonctionnellement la baseline `info`/`warn`, les cinq vues, l’ouverture de l’éditeur Logging depuis Documents et un événement de test Logging `info`. + +**En toute dernière opération uniquement**, lorsque tout ce qui précède est vert : + +```bash +cargo tauri build -c crates/ksp-app-config-desk/tauri.conf.json +``` + +## Non exécuté lors de la préparation de cette archive + +L’environnement de packaging ne dispose pas du toolchain Rust/Tauri du poste opérateur. Les validations Cargo/Tauri ci-dessus restent donc à exécuter localement. + +## Suite + +Après validation complète de `pre.019`, préparer `0.1.4-rel.001` : version Cargo finale `0.1.4`, changelog stable, statuts plan/roadmap, contrôles de cohérence, commit de release puis tag stable `v0.1.4`. diff --git a/docs/000-README.md b/docs/000-README.md index 6e654b0..09bac21 100644 --- a/docs/000-README.md +++ b/docs/000-README.md @@ -1,5 +1,5 @@ - + # Documentation KSP @@ -39,6 +39,9 @@ docs/ │ ├── 004-V0_1_2_LOGGING_FOUNDATION_PLAN.md │ ├── 005-V0_1_3_CONFIG_FOUNDATION_PLAN.md │ └── 006-V0_1_4_CONFIG_DESKTOP_PLAN.md +├── validation/ +│ ├── 000-README.md +│ └── 001-V0_1_4_CONFIG_DESKTOP.md └── rules/ ├── FILE_CONTRACTS.md ├── PROMPT_STRUCTURE.md @@ -55,7 +58,7 @@ D'autres sous-répertoires seront ajoutés uniquement lorsque leur rôle aura é ## Documents de planification -Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). La release active `0.1.4 — ksp-app-config-desk` est ouverte par `pre.001` et son plan détaillé est [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md) ; son prompt d'ouverture reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). +Le plan historique de la phase fondatrice clôturée est conservé dans [`plans/001-V0_0_3_PLAN.md`](plans/001-V0_0_3_PLAN.md). La séquence active des premières releases fonctionnelles est définie dans [`plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`](plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md). Le plan détaillé de la release stable `0.1.1` est conservé comme historique clôturé dans [`plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md`](plans/003-V0_1_1_CORE_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.2` est conservé comme historique clôturé dans [`plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md`](plans/004-V0_1_2_LOGGING_FOUNDATION_PLAN.md). Le plan détaillé de la release stable `0.1.3 — Configuration foundation` est conservé comme historique clôturé dans [`plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md`](plans/005-V0_1_3_CONFIG_FOUNDATION_PLAN.md). La release `0.1.4 — ksp-app-config-desk` est dans sa tranche finale `pre.019`; son plan détaillé est [`plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md`](plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md) et sa matrice de clôture est [`validation/001-V0_1_4_CONFIG_DESKTOP.md`](validation/001-V0_1_4_CONFIG_DESKTOP.md). Son prompt d'ouverture historique reste [`../prompts/004-V0_1_4_START_PROMPT.md`](../prompts/004-V0_1_4_START_PROMPT.md). `IDEAS.md` conserve les pistes et questions qui ne sont pas encore des engagements du roadmap ni des décisions architecturales. diff --git a/docs/IDEAS.md b/docs/IDEAS.md index 034dd95..e545cd0 100644 --- a/docs/IDEAS.md +++ b/docs/IDEAS.md @@ -1,5 +1,5 @@ - + # Idées à explorer @@ -304,6 +304,16 @@ Les workers sont des services autonomes. Une app manager devra donc disposer d'u Ne pas créer de `ksp-ipc-api` générique avant de connaître les contraintes réelles du premier manager : plateforme, framing, discovery, authentication locale et lifecycle. +## Applications desktop — idées de diagnostic + +### Réflexion Rust -> console WebKit + +**Status :** Reporté hors `0.1.4`, à réévaluer au premier besoin de diagnostic WebView + +Le bridge Config Desk validé en `0.1.4` couvre `console.*`/helpers frontend -> commande Tauri -> `ksp-logging-lib` tout en conservant l’affichage local dans la console WebKit. Le retour général des événements Rust vers la console WebKit n’est pas nécessaire au contrat fonctionnel actuel. + +Si cette capacité devient utile, l’intégration doit être conçue dans la pile possédée par `ksp-logging-lib` afin de conserver un subscriber global unique. Elle doit vérifier explicitement l’absence de double émission et de boucle avec le bridge frontend avant toute adoption d’un mécanisme de type `WebviewLayer`/console attachée. + ## Séquencement des releases futures ### Numérotation fine après `0.1.x` diff --git a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md index 61ee18d..1ffa391 100644 --- a/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md +++ b/docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md @@ -1,5 +1,5 @@ - + # Séquence des releases fonctionnelles KSP @@ -38,7 +38,7 @@ Séquence par défaut : `0.1.1`, `0.1.2` et `0.1.3` sont désormais des releases stables. -`0.1.4 — ksp-app-config-desk` est l'étape active suivante. Elle doit valider réellement la fondation Config et établir le modèle de référence des futures applications Tauri KSP sans déplacer la logique Config dans l'application. +`0.1.4 — ksp-app-config-desk` a atteint sa tranche finale `pre.019`. Sa publication stable par `rel.001` doit intervenir seulement après la matrice finale ; elle établit le modèle de référence des futures applications Tauri KSP sans déplacer la logique Config dans l'application. ## `0.1.1` — Core foundation @@ -440,3 +440,14 @@ prompts/001-V0_1_1_START_PROMPT.md 0.1.2 — Logging foundation prompts/002-V0_1_2_START_PROMPT.md ``` + +## Ouverture de `0.2.1` + +Après publication stable de `0.1.4`, la session suivante s’ouvre avec : + +```text +0.2.1-pre.001 +prompts/005-V0_2_1_START_PROMPT.md +``` + +Cette première prerelease reste une tranche de brainstorming/audit/planification. Elle doit réévaluer les dépendances réelles et sélectionner un **premier périmètre N2 borné** parmi Wallet, transport on-chain et Interface/wire au lieu d’implémenter les trois simultanément. La mission concrète de `0.2.1` est figée dans son plan après cette sélection. diff --git a/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md b/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md index 72d2004..a1e695f 100644 --- a/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md +++ b/docs/plans/006-V0_1_4_CONFIG_DESKTOP_PLAN.md @@ -1,5 +1,5 @@ - + # Plan `0.1.4` — `ksp-app-config-desk` @@ -238,8 +238,8 @@ La gestion npm distingue le runtime frontend du tooling. Les bibliothèques cons Chaque application Tauri desk KSP reçoit un couple de ports Vite/HMR propre. La première application réserve : | Application | Port Vite HTTP | Port HMR | -| --------------------- | -------------: | -------: | -| `ksp-app-config-desk` | `1430` | `1431` | +|-----------------------|---------------:|---------:| +| `ksp-app-config-desk` | `1430` | `1431` | Les applications suivantes incrémentent le couple de deux ports (`1432/1433`, puis `1434/1435`, etc.). Vite doit utiliser un port strict afin qu'une collision soit signalée au lieu de provoquer un basculement silencieux vers un autre port. Cette allocation permet de faire fonctionner simultanément plusieurs applications desk en mode développement. @@ -249,20 +249,20 @@ Aucune dépendance n'est ajoutée par `pre.001`. Les versions suivantes ont ét | Dépendance | Version actuelle auditée | Usage envisagé | | ------------------------------- | -----------------------: | -------------------------------------------- | -| `tauri` | `2.11.5` | runtime desktop | -| `tauri-build` | `2.6.3` | build Tauri | -| `tauri-plugin-tracing` | `0.3.4` | intégration tracing à la frontière Tauri | -| `ts-rs` | `12.0.1` | bindings DTO applicatifs | -| `fs2` | `0.4.3` | verrou single-instance | -| `@fltsci/tauri-plugin-tracing` | `0.3.4` | package frontend compagnon du plugin tracing | -| `@tauri-apps/api` | `2.11.1` | frontend Tauri | -| `@tauri-apps/cli` | `2.11.4` | dev/build desktop | -| `@types/bootstrap` | `5.2.11` | typings Bootstrap | -| `vite` | `8.2.1` | build frontend | -| `typescript` | `7.0.2` | frontend TypeScript | -| `sass-embedded` | `1.102.0` | compilation SCSS | -| `bootstrap` | `5.3.8` | composants/layout | -| `@fortawesome/fontawesome-free` | `7.3.1` | iconographie | +| `tauri` | `2.11.5` | runtime desktop | +| `tauri-build` | `2.6.3` | build Tauri | +| `tauri-plugin-tracing` | `0.3.4` | intégration tracing à la frontière Tauri | +| `ts-rs` | `12.0.1` | bindings DTO applicatifs | +| `fs2` | `0.4.3` | verrou single-instance | +| `@fltsci/tauri-plugin-tracing` | `0.3.4` | package frontend compagnon du plugin tracing | +| `@tauri-apps/api` | `2.11.1` | frontend Tauri | +| `@tauri-apps/cli` | `2.11.4` | dev/build desktop | +| `@types/bootstrap` | `5.2.11` | typings Bootstrap | +| `vite` | `8.2.1` | build frontend | +| `typescript` | `7.0.2` | frontend TypeScript | +| `sass-embedded` | `1.102.0` | compilation SCSS | +| `bootstrap` | `5.3.8` | composants/layout | +| `@fortawesome/fontawesome-free` | `7.3.1` | iconographie | Sources d'audit : @@ -694,23 +694,23 @@ Le shell applique également une instrumentation frontend systématique : clics Les noms ci-dessous sont les noms fonctionnels cibles ; ils pourront être normalisés avant implémentation, mais leurs responsabilités sont fixées. -| Commande Tauri | Service interne | API KSP principale | Secret réel ? | +| Commande Tauri | Service interne | API KSP principale | Secret réel ? | | ------------------------------ | ------------------------------------ | --------------------------------------------------------------------------- | -------------------------------------------: | -| `get_app_snapshot` | `config_service` + `logging_service` | registry/management + runtime state | non | -| `list_config_documents` | `config_service` | future vue publique du `ConfigFileRegistry` | non | -| `inspect_config_document` | `config_service` | `load_validated_document` + `read_source` si erreur | non | -| `save_config_source_candidate` | `config_service` | future API Config de réparation validée | non | -| `inspect_profile` | `config_service` | `load_resolved_profile` + résolution détaillée | non | -| `get_environment_report` | `environment_service` | `ConfigManagement::environment_report` | non | +| `get_app_snapshot` | `config_service` + `logging_service` | registry/management + runtime state | non | +| `list_config_documents` | `config_service` | future vue publique du `ConfigFileRegistry` | non | +| `inspect_config_document` | `config_service` | `load_validated_document` + `read_source` si erreur | non | +| `save_config_source_candidate` | `config_service` | future API Config de réparation validée | non | +| `inspect_profile` | `config_service` | `load_resolved_profile` + résolution détaillée | non | +| `get_environment_report` | `environment_service` | `ConfigManagement::environment_report` | non | | `set_dotenv_value` | `environment_service` | `ConfigManagement::set_dotenv_value` + rapport frais | entrée potentiellement Secret, jamais loggée | -| `remove_dotenv_value` | `environment_service` | `ConfigManagement::remove_dotenv_value` + rapport frais | non | -| `reveal_environment_value` | `secret_service` | `reveal_effective_environment_value` ou `reveal_dotenv_value` | **oui** | -| `get_logging_editor` | `logging_service` | `load_logging_document` | non | -| `save_logging_document` | `logging_service` | `save_logging_document` | non par design Logging | -| `apply_logging_profile` | `logging_service` | `ConfigEnvironment::load` + `load_resolved_logging_config` + `reinitialize` | valeurs resolved possibles, jamais DTO/log | -| `emit_frontend_log` | `frontend_logging_service` | façade `ksp-logging-lib` | non, message technique frontend seulement | -| `emit_logging_test` | `logging_service` | façade/macros `ksp-logging-lib` | non, message explicitement saisi pour test | -| `splash_frontend_ready` | `splash` | lifecycle Tauri + settings splash déjà résolus | non | +| `remove_dotenv_value` | `environment_service` | `ConfigManagement::remove_dotenv_value` + rapport frais | non | +| `reveal_environment_value` | `secret_service` | `reveal_effective_environment_value` ou `reveal_dotenv_value` | **oui** | +| `get_logging_editor` | `logging_service` | `load_logging_document` | non | +| `save_logging_document` | `logging_service` | `save_logging_document` | non par design Logging | +| `apply_logging_profile` | `logging_service` | `ConfigEnvironment::load` + `load_resolved_logging_config` + `reinitialize` | valeurs resolved possibles, jamais DTO/log | +| `emit_frontend_log` | `frontend_logging_service` | façade `ksp-logging-lib` | non, message technique frontend seulement | +| `emit_logging_test` | `logging_service` | façade/macros `ksp-logging-lib` | non, message explicitement saisi pour test | +| `splash_frontend_ready` | `splash` | lifecycle Tauri + settings splash déjà résolus | non | Tous les wrappers dans `tauri.rs` : @@ -1073,7 +1073,7 @@ selon la tranche. Le frontend reste suffisamment mince pour ne pas nécessiter dès le départ un framework de test lourd. Les validations minimum prévues : - `tsc` strict ; -- build Vite ; +- build Vite uniquement via le `beforeBuildCommand` de la validation finale `cargo tauri build` ; - tests de fonctions pures TypeScript uniquement si une logique non triviale apparaît ; - parcours manuel reproductible du panneau `.env` (create/update/delete/reload/shadowing) ; - parcours manuel reproductible des panneaux et de la matrice Logging. @@ -1270,13 +1270,13 @@ pre.017 panneau Test Logging [réalisé] - preuve routing avant/après hot reload - preuve bridge frontend -pre.018 robustesse/extensibilité/tests desktop [en cours] +pre.018 robustesse/extensibilité/tests desktop [réalisé] - invalid source au démarrage - audits secrets/Config ownership/tracing - tests frontend/Tauri/build - ajout futur file_id/editor sans refonte shell -pre.019 clôture +pre.019 clôture [en cours] - fmt/check/clippy - tests ciblés + cargo test --workspace - cargo tree pertinents @@ -1291,6 +1291,13 @@ pre.019 clôture Ce découpage est une **prévision**, pas une obligation de produire exactement dix-neuf prereleases. Lorsqu'une tranche atteint son objectif en moins de temps, elle peut absorber le début logique de la suivante ; lorsqu'elle dépasse 20 minutes de façon significative, elle doit préférentiellement être scindée plutôt que compressée. Un défaut déjà livré est corrigé par un `fix` conformément au workflow KSP. +### 18.1 État de clôture `pre.019` + +La tranche finale remet la configuration Logging canonique à une baseline de release `info`/`warn`, retire le profil de test de la source de référence, ferme les TODO bloquants `0.1.4`, crée une matrice de validation durable sous `docs/validation/`, et prépare le prompt d’ouverture de `0.2.1-pre.001`. + +La validation finale suit KSP-APP-034 : tous les contrôles Rust et frontend, puis le parcours `tauri dev`, puis **`cargo tauri build` en toute dernière opération**. `rel.001` ne doit être préparée qu’après succès de cette matrice. + + ## 19. Dépendances et ordre d'introduction Aucune dépendance n'est ajoutée par `pre.001`. @@ -1442,6 +1449,6 @@ Aucune question n'empêche d'ouvrir le développement après validation du prés 2. nom exact et nombre minimal de variables splash Config/.env ; 3. features Cargo minimales de Tauri/Tokio nécessaires au shell/splash ; 4. détails du fallback Logging minimal utilisé uniquement lorsque la Config Logging ne peut pas être résolue au démarrage ; -5. implémentation exacte du retour Rust -> console WebKit : `attachConsole()` est retenu comme capacité candidate, mais seulement après intégration d'une `tauri_plugin_tracing::WebviewLayer` dans le subscriber possédé par `ksp-logging-lib`; `interceptConsole()`/`takeoverConsole()` ne doivent pas doubler le bridge JS -> Rust KSP ni réintroduire des targets non conformes. +5. retour Rust -> console WebKit : étudié à la clôture `pre.019` puis **reporté hors `0.1.4`**. Le bridge WebView -> Rust -> KSP et le panneau Test Logging couvrent le besoin fonctionnel de cette release. Une future réflexion Rust -> WebKit devra rester sous ownership de `ksp-logging-lib`, sans second subscriber, double émission ni boucle avec le bridge `console.*`. Ces points doivent être résolus par code/tests dans les prereleases prévues, pas par contournement applicatif. diff --git a/docs/validation/000-README.md b/docs/validation/000-README.md new file mode 100644 index 0000000..74725b8 --- /dev/null +++ b/docs/validation/000-README.md @@ -0,0 +1,12 @@ + + + +# Validations KSP + +Ce répertoire conserve les matrices de validation durables utilisées pour clôturer une release ou une capacité importante. + +Les deltas restent l’historique autoritatif des livraisons ; une matrice de validation synthétise les critères et preuves attendues sans remplacer les deltas. + +Documents : + +- [`001-V0_1_4_CONFIG_DESKTOP.md`](001-V0_1_4_CONFIG_DESKTOP.md) — matrice finale de `0.1.4 — ksp-app-config-desk`. diff --git a/docs/validation/001-V0_1_4_CONFIG_DESKTOP.md b/docs/validation/001-V0_1_4_CONFIG_DESKTOP.md new file mode 100644 index 0000000..ede2717 --- /dev/null +++ b/docs/validation/001-V0_1_4_CONFIG_DESKTOP.md @@ -0,0 +1,79 @@ + + + +# Validation finale `0.1.4` — Config Desk + +## Objet + +Cette matrice ferme fonctionnellement `ksp-app-config-desk` avant `0.1.4-rel.001`. Les preuves détaillées restent dans `deltas/0.1.4/` et dans les logs de validation opérateur. + +## Fonctionnel déjà validé avant `pre.019` + +- [X] splash -> fenêtre principale ; +- [X] inventaire Documents depuis le registre Config ; +- [X] diagnostic JSON/schema/sémantique/effective et réparation de source via Config ; +- [X] inspection `default_profile`, profils, globals/effective et provenance sûre ; +- [X] rapport Environnement sûr ; +- [X] create/update/remove `.env` exclusivement via Config ; +- [X] shadowing process > `.env` observable ; +- [X] reveal Secret séparé, privilégié, transitoire et non persisté dans l’UI ; +- [X] aucun `window.alert` / `window.confirm` / `window.prompt` applicatif ; +- [X] éditeur Logging typé multi-profils, 0/1/N file sinks et target filters ; +- [X] persistence atomique et hot reload immédiat ; +- [X] rollback source/runtime sur échec ; +- [X] profil runtime explicite distinct de `default_profile` ; +- [X] génération runtime observable ; +- [X] fichiers de logs distincts par lancement avec identité applicative + timestamp ; +- [X] panneau Test Logging backend et bridge frontend ; +- [X] routing `target`/`domain`/niveau démontré avant/après hot reload ; +- [X] registre d’éditeurs spécialisés `file_id -> view` ; +- [X] audit bootstrap fallback avant installation du subscriber ; +- [X] audits Config ownership / Logging ownership / desktop security. + +## Baseline de release `pre.019` + +- [X] `std.logging.json` canonique revenu à `info`/`warn` ; +- [X] profil de test manuel retiré de la source canonique ; +- [X] TODO bloquants `0.1.4` fermés ; +- [X] retour Rust -> console WebKit explicitement reporté hors `0.1.4` ; +- [X] README/USAGE/plan/roadmap/prompt suivant synchronisés ; +- [X] aucun `PRESENTATION.md` ajouté. + +## Validation technique finale à exécuter sur `pre.019` + +Exécuter dans cet ordre : + +```bash +cargo fmt --all +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test --workspace +cargo tree -p ksp-app-config-desk +cargo tree -p ksp-config-lib +cargo tree -p ksp-logging-lib +cd crates/ksp-app-config-desk +npm run check +cd ../.. +cargo tauri dev -c crates/ksp-app-config-desk/tauri.conf.json +``` + +Parcours fonctionnel final minimum : + +1. vérifier le démarrage et `active_profile=local_dev` ; +2. vérifier que la baseline Logging affichée est `info`/`warn` ; +3. Documents -> `cfg.std.logging` -> éditeur Logging ; +4. vérifier Documents, Profils, Environnement et Logging sans mutation inattendue ; +5. émettre un test Logging `info` backend et frontend ; +6. confirmer qu’aucun profil de test manuel n’est présent dans la source canonique. + +Lorsque tout ce qui précède est validé, exécuter **en toute dernière opération** : + +```bash +cargo tauri build -c crates/ksp-app-config-desk/tauri.conf.json +``` + +Le build final doit produire les bundles attendus pour la plateforme. Aucun `vite build` standalone n’est exécuté avant lui. + +## Passage à `rel.001` + +`0.1.4-rel.001` peut être préparée uniquement après succès de cette séquence. La release finale synchronise `workspace.package.version = "0.1.4"`, le changelog stable, le statut roadmap/plan et le tag stable `v0.1.4` après validation du commit de release. diff --git a/prompts/000-README.md b/prompts/000-README.md index fe9a4d2..6f6c24f 100644 --- a/prompts/000-README.md +++ b/prompts/000-README.md @@ -1,5 +1,5 @@ - + # Prompts KSP @@ -25,3 +25,4 @@ Le prompt générique `0.1.x` a été affiné pendant `0.0.3` puis remplacé par - [`002-V0_1_2_START_PROMPT.md`](002-V0_1_2_START_PROMPT.md) — prompt final destiné à ouvrir `0.1.2 — Logging foundation` après publication stable de `0.1.1`. - [`003-V0_1_3_START_PROMPT.md`](003-V0_1_3_START_PROMPT.md) — prompt historique destiné à ouvrir `0.1.3 — Configuration foundation` après publication stable de `0.1.2` ; - [`004-V0_1_4_START_PROMPT.md`](004-V0_1_4_START_PROMPT.md) — prompt final destiné à ouvrir `0.1.4 — ksp-app-config-desk` après publication stable de `0.1.3`. +- [`005-V0_2_1_START_PROMPT.md`](005-V0_2_1_START_PROMPT.md) — prompt de reprise préparé à la clôture de `0.1.4`; il ouvre `0.2.1-pre.001` par un brainstorming visant à sélectionner le premier périmètre N2 borné. diff --git a/prompts/005-V0_2_1_START_PROMPT.md b/prompts/005-V0_2_1_START_PROMPT.md new file mode 100644 index 0000000..8278596 --- /dev/null +++ b/prompts/005-V0_2_1_START_PROMPT.md @@ -0,0 +1,68 @@ + + + +# Prompt de démarrage `0.2.1` — ouverture des capacités Solana N2 + +## Contexte de reprise + +La base attendue est la release stable `v0.1.4` de `khadhroony-solana-project`. Les fondations `ksp-core-lib`, `ksp-logging-lib`, `ksp-config-lib` et la première application de référence `ksp-app-config-desk` sont alors stabilisées. + +`0.2.x` ouvre les capacités Solana N2. Les candidats déjà retenus par l’architecture sont notamment : + +- `ksp-wallet-lib` puis une application wallet spécialisée ; +- `ksp-onchain-transport-lib` ; +- `ksp-interface-lib` pour les contrats wire/réexports/réimplémentations compatibles ; +- plus tard `ksp-program-api` / `ksp-program-lib` puis la chaîne d’exécution. + +Wallet, transport on-chain et Interface sont partiellement indépendants. **Ne pas supposer leur ordre sans le réévaluer.** + +## Première mission : `0.2.1-pre.001` + +La première prerelease est une tranche de **brainstorming, audit et planification**, pas une grosse implémentation. + +Elle doit : + +1. partir de la base stable `v0.1.4` et relire `ROADMAP.md`, `docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md`, les règles N1/N2 et les décisions d’architecture ; +2. inventorier les besoins réels et dépendances pour Wallet, transport on-chain et Interface/wire ; +3. sélectionner **un seul premier périmètre fonctionnel borné** pour `0.2.1` ; +4. justifier cet ordre par les premiers scénarios d’usage et les dépendances réelles, pas par symétrie avec bot2/bot3 ; +5. définir les contrats publics minimaux, hors-périmètre, risques, dépendances externes, tests et critères de clôture ; +6. produire le plan détaillé `docs/plans/007-V0_2_1_..._PLAN.md` avec une prévision souple des prereleases ; +7. ne commencer le développement fonctionnel qu’après validation de ce plan. + +## Contraintes architecturales à préserver + +- Rust 2024, `unsafe` interdit, pas de `unwrap`/`expect`/`panic` ni opérateur `?` selon les règles KSP ; +- dépendances externes communes sous `[workspace.dependencies]` puis `.workspace = true` ; +- `ksp-config-lib` reste seul propriétaire de Config, `.env`, environnement et persistence Config ; +- `ksp-logging-lib` reste seule façade/propriétaire du runtime `tracing` ; +- les applications Tauri restent minces et suivent le modèle validé par Config Desk ; +- `cargo tauri build -c ...` reste la dernière opération de validation Tauri ; +- les executables KSP ne dépendent pas directement des crates Solana/protocoles au-delà des exceptions bas niveau explicitement autorisées ; +- `ksp-interface-lib` possède les interfaces/wires Solana/SPL/Metaplex nécessaires lorsqu’un réexport contrôlé ou une réimplémentation compatible est préférable à une dépendance métier directe ; +- les APIs publiques extensibles utilisent les crates `*-api` prévues par l’architecture ; +- les demos/scénarios restent spécialisés et ne dupliquent pas la logique des bibliothèques. + +## Points à réexaminer explicitement + +### Wallet + +Évaluer format KSP, stockage/chiffrement, import/export, pubkey/signature, séparation secret/public, profils/réseaux et frontière avec Config. Ne pas déplacer les secrets wallet dans Config par commodité. + +### Transport on-chain + +Évaluer RPC HTTP/WS, providers, timeouts/retry/backoff, subscriptions, modèles de réponse homogènes, séparation transport/store et configuration des endpoints. Aucun Store n’est introduit dans `0.2.1` sauf décision explicite de replanification. + +### Interface/wire + +Réévaluer la politique de réexport/réimplémentation pour les interfaces Solana/SPL/Metaplex déjà identifiées. La crate doit éviter les doublons de versions et permettre aux crates KSP supérieures de ne pas dépendre directement des bibliothèques métier externes. + +## Discipline de session + +- `pre.001` : réflexion + plan ; +- prereleases suivantes : tranches bornées ; +- dernière prerelease : validations finales, documentation, nettoyage, changelog et prompt suivant ; +- un défaut livré reçoit un `fix.NNN`, il n’est pas réécrit silencieusement ; +- tous les deltas `0.2.1` sont commités. + +Commencer la session par l’audit/brainstorming de `0.2.1-pre.001` et proposer la sélection du premier périmètre N2 avant toute modification fonctionnelle.