v0.2.6-pre.017
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@ préserver les frontières cryptographiques Wallet
|
||||
|
||||
Le caractère binaire **n'ajoute aucune propriété cryptographique**. La confidentialité et l'authenticité continuent de dépendre d'Argon2id, XChaCha20-Poly1305 et Ed25519, jamais de l'absence de JSON.
|
||||
|
||||
`0.2.6-pre.015` fige la grammaire binaire, les identifiants numériques, les bornes structurelles et les transcripts/AAD V2. `0.2.6-pre.016` matérialise la création/ouverture/persistence V2, l'auto-détection V1/V2, les APIs génériques/versionnées et le basculement de Wallet Desk vers la façade non versionnée.
|
||||
`0.2.6-pre.015` fige la grammaire binaire, les identifiants numériques, les bornes structurelles et les transcripts/AAD V2. `0.2.6-pre.016` matérialise la création/ouverture/persistence V2, l'auto-détection V1/V2, les APIs génériques/versionnées et le basculement de Wallet Desk vers la façade non versionnée. `0.2.6-pre.017` ajoute la migration V1 -> V2 explicite et OWNER-authentifiée, en copie no-clobber ou remplacement atomique in-place.
|
||||
|
||||
V1 reste un format stable supporté. V2 ne réinterprète jamais un document V1 avec sa propre grammaire.
|
||||
|
||||
@@ -104,14 +104,14 @@ Une implémentation conforme doit vérifier les bornes **avant** toute allocatio
|
||||
|
||||
Le début de fichier est strictement :
|
||||
|
||||
| Ordre | Champ | Taille | Valeur / règle |
|
||||
|------:|---------------------------|-----------------:|------------------------------------------------|
|
||||
| 1 | `magic` | 9 | ASCII exact `KSPWALLET` |
|
||||
| 2 | `format_version` | 2 | `0x0002` |
|
||||
| 3 | `document_length` | 4 | longueur totale exacte du fichier |
|
||||
| 4 | `flags` | 2 | bit 0 = VIEW activé ; tous les autres bits = 0 |
|
||||
| 5 | `owner_auth_public_key` | 32 | clé publique Ed25519 OWNER |
|
||||
| 6 | `view_descriptor.slot_id` | 16 conditionnels | présent uniquement si `flags & 0x0001 != 0` |
|
||||
| Ordre | Champ | Taille | Valeur / règle |
|
||||
|---:|---|---:|---|
|
||||
| 1 | `magic` | 9 | ASCII exact `KSPWALLET` |
|
||||
| 2 | `format_version` | 2 | `0x0002` |
|
||||
| 3 | `document_length` | 4 | longueur totale exacte du fichier |
|
||||
| 4 | `flags` | 2 | bit 0 = VIEW activé ; tous les autres bits = 0 |
|
||||
| 5 | `owner_auth_public_key` | 32 | clé publique Ed25519 OWNER |
|
||||
| 6 | `view_descriptor.slot_id` | 16 conditionnels | présent uniquement si `flags & 0x0001 != 0` |
|
||||
|
||||
Offsets fixes avant le descripteur conditionnel :
|
||||
|
||||
@@ -154,21 +154,21 @@ Aucun compteur de slots ou de compartiments n'est nécessaire : leur cardinalit
|
||||
|
||||
Chaque key slot est encodé ainsi :
|
||||
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|--------------------------|---------:|-----------------------------------------|
|
||||
| `role` | 1 | `0x01` OWNER, `0x02` VIEW |
|
||||
| `slot_id` | 16 | identifiant binaire exact |
|
||||
| `kdf_algorithm` | 1 | `0x01` Argon2id |
|
||||
| `kdf_version` | 4 | `19` |
|
||||
| `memory_kib` | 4 | `1..1 048 576`, et `>= parallelism * 8` |
|
||||
| `iterations` | 4 | `1..64` |
|
||||
| `parallelism` | 4 | `1..64` |
|
||||
| `salt_length` | 1 | `16..64` |
|
||||
| `salt` | variable | exactement `salt_length` octets |
|
||||
| `wrap_algorithm` | 1 | `0x01` XChaCha20-Poly1305 |
|
||||
| `wrap_nonce` | 24 | nonce exact |
|
||||
| `wrap_ciphertext_length` | 2 | `16..4096` |
|
||||
| `wrap_ciphertext` | variable | exactement la longueur déclarée |
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|---|---:|---|
|
||||
| `role` | 1 | `0x01` OWNER, `0x02` VIEW |
|
||||
| `slot_id` | 16 | identifiant binaire exact |
|
||||
| `kdf_algorithm` | 1 | `0x01` Argon2id |
|
||||
| `kdf_version` | 4 | `19` |
|
||||
| `memory_kib` | 4 | `1..1 048 576`, et `>= parallelism * 8` |
|
||||
| `iterations` | 4 | `1..64` |
|
||||
| `parallelism` | 4 | `1..64` |
|
||||
| `salt_length` | 1 | `16..64` |
|
||||
| `salt` | variable | exactement `salt_length` octets |
|
||||
| `wrap_algorithm` | 1 | `0x01` XChaCha20-Poly1305 |
|
||||
| `wrap_nonce` | 24 | nonce exact |
|
||||
| `wrap_ciphertext_length` | 2 | `16..4096` |
|
||||
| `wrap_ciphertext` | variable | exactement la longueur déclarée |
|
||||
|
||||
Ordre obligatoire :
|
||||
|
||||
@@ -189,14 +189,14 @@ Toute divergence est invalide avant KDF/déchiffrement.
|
||||
|
||||
Chaque compartiment est encodé :
|
||||
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|---------------------|---------:|------------------------------------------------------|
|
||||
| `kind` | 1 | `0x01` OWNER-CONTROL, `0x02` METADATA, `0x03` SECRET |
|
||||
| `payload_version` | 4 | `1` pour le profil initial V2 |
|
||||
| `algorithm` | 1 | `0x01` XChaCha20-Poly1305 |
|
||||
| `nonce` | 24 | nonce exact |
|
||||
| `ciphertext_length` | 4 | longueur exacte |
|
||||
| `ciphertext` | variable | ciphertext + tag Poly1305 |
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|---|---:|---|
|
||||
| `kind` | 1 | `0x01` OWNER-CONTROL, `0x02` METADATA, `0x03` SECRET |
|
||||
| `payload_version` | 4 | `1` pour le profil initial V2 |
|
||||
| `algorithm` | 1 | `0x01` XChaCha20-Poly1305 |
|
||||
| `nonce` | 24 | nonce exact |
|
||||
| `ciphertext_length` | 4 | longueur exacte |
|
||||
| `ciphertext` | variable | ciphertext + tag Poly1305 |
|
||||
|
||||
Bornes initiales :
|
||||
|
||||
@@ -214,10 +214,10 @@ Les payloads plaintext V2 conservent le modèle fonctionnel établi en V1 pour c
|
||||
|
||||
La fin du document est :
|
||||
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|-----------------------------|-------:|---------------------------|
|
||||
| `state_signature.algorithm` | 1 | `0x01` Ed25519 |
|
||||
| `state_signature.signature` | 64 | signature detached exacte |
|
||||
| Champ | Taille | Valeur / règle |
|
||||
|---|---:|---|
|
||||
| `state_signature.algorithm` | 1 | `0x01` Ed25519 |
|
||||
| `state_signature.signature` | 64 | signature detached exacte |
|
||||
|
||||
Aucun octet ne peut suivre ces 65 octets.
|
||||
|
||||
@@ -377,17 +377,17 @@ Le nonce/ciphertext n'est pas inclus dans son propre AAD.
|
||||
|
||||
V1 et V2 sont deux formats explicites :
|
||||
|
||||
| Propriété | V1 | V2 |
|
||||
|--------------------------|------------------------------------|---------------|
|
||||
| enveloppe | JSON UTF-8 | binaire KSP |
|
||||
| champs binaires | Base64url no-pad | bytes directs |
|
||||
| version | `1` | `2` |
|
||||
| canonicalité | sémantique JSON + Base64 canonique | byte-exact |
|
||||
| taille fixture wire-only | 2037 octets | 628 octets |
|
||||
| Argon2id | oui | oui |
|
||||
| XChaCha20-Poly1305 | oui | oui |
|
||||
| Ed25519 OWNER state | oui | oui |
|
||||
| VIEW/OWNER | oui | oui |
|
||||
| Propriété | V1 | V2 |
|
||||
|---|---|---|
|
||||
| enveloppe | JSON UTF-8 | binaire KSP |
|
||||
| champs binaires | Base64url no-pad | bytes directs |
|
||||
| version | `1` | `2` |
|
||||
| canonicalité | sémantique JSON + Base64 canonique | byte-exact |
|
||||
| taille fixture wire-only | 2037 octets | 628 octets |
|
||||
| Argon2id | oui | oui |
|
||||
| XChaCha20-Poly1305 | oui | oui |
|
||||
| Ed25519 OWNER state | oui | oui |
|
||||
| VIEW/OWNER | oui | oui |
|
||||
|
||||
La réduction mesurée sur le fixture structurel de référence est :
|
||||
|
||||
@@ -443,7 +443,21 @@ réécriture V1 -> V2 cachée non
|
||||
migration V1 -> V2 opération explicite
|
||||
```
|
||||
|
||||
Une migration doit authentifier le wallet source avec la capability requise, produire un nouveau document V2 valide et respecter la persistence no-clobber/atomique. Une simple transcodification non authentifiée des bytes V1 n'est pas suffisante puisque V2 possède ses propres domains/transcripts.
|
||||
`pre.017` matérialise cette politique avec trois surfaces :
|
||||
|
||||
```text
|
||||
migrate_wallet_v1_to_v2(...)
|
||||
migrate_wallet_file_v1_to_v2(...)
|
||||
migrate_wallet_file_v1_to_v2_in_place(...)
|
||||
```
|
||||
|
||||
La migration authentifie toujours le wallet source avec OWNER. Elle ne transcode pas les slots/ciphertexts V1 : elle ouvre le V1, conserve l'identité Solana et le payload metadata exact — y compris les identifiants de notes — puis construit un nouvel envelope V2 avec de nouveaux matériaux cryptographiques et les domains/transcripts V2. Le mot de passe OWNER fourni reste le credential OWNER cible.
|
||||
|
||||
Lorsque VIEW est activé en V1, le caller doit fournir un mot de passe VIEW cible pour V2, car le key-wrap V1 ne peut pas être réutilisé sous l'AAD V2. OWNER peut fournir l'ancien credential ou en choisir un nouveau, conformément à son autorité existante de rotation VIEW. Une migration pure conserve en revanche la forme de capability : elle ne peut ni activer VIEW sur une source désactivée, ni supprimer VIEW d'une source activée.
|
||||
|
||||
La migration fichier vers une autre destination est no-clobber et laisse V1 intact. La variante in-place compare l'état V1 authentifié attendu avant publication et utilise le remplacement atomique existant ; un changement concurrent retourne `wallet.state_conflict`. `wallet.migration_invalid` couvre une demande de migration incohérente.
|
||||
|
||||
Une simple transcodification non authentifiée des bytes V1 n'est pas suffisante puisque V2 possède ses propres domains/transcripts.
|
||||
|
||||
## 15. Future V3 / second facteur
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ Un plan décrit le périmètre, les décisions déjà acquises, les questions ou
|
||||
- [`010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md`](010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md) — plan historique clôturé de la release stable `0.2.3 — HTTP Transactions`, ouvert par `pre.001`, exécuté jusqu'à `pre.009` puis publié par `rel.001`; il couvre les 11 méthodes, la classification `8 Read / 2 WriteSubmission / 1 Simulation`, `KSP-TRANSPORT-007`, le no-resend et la préparation de `0.2.4`.
|
||||
- [`011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md`](011-V0_2_4_HTTP_BLOCKS_ECONOMICS_PLAN.md) — plan historique clôturé de la release stable `0.2.4`, ouvert par `pre.001`, exécuté jusqu’à `pre.009`, complété par le fix documentaire Wallet `pre.009-fix.001` puis publié par `rel.001`; il couvre les 10 Blocks + 5 Economics et la compliance finale `52/52 + 14/14` sous `KSP-TRANSPORT-007`.
|
||||
- [`012-V0_2_5_WALLET_FOUNDATION_PLAN.md`](012-V0_2_5_WALLET_FOUNDATION_PLAN.md) — plan historique clôturé de la release stable `0.2.5 — Wallet foundation`, ouvert par `pre.001`, livré jusqu’à `pre.010`, renforcé par `pre.010-fix.001`–`fix.003` pour Dalek 3 et la normalisation Rust/audit structurel, puis publié par `rel.001`; il couvre `.kspwallet` V1, VIEW/OWNER, crypto, persistence, administration, transfer et compliance.
|
||||
- [`013-V0_2_6_WALLET_DESK_PLAN.md`](013-V0_2_6_WALLET_DESK_PLAN.md) — plan actif de `0.2.6 — Wallet Desk`, ouvert par `pre.001`; `pre.002` matérialise le shell Tauri et `pre.003` la composition `std.wallet`/composite ainsi que la préparation des répertoires. Le plan fixe aussi secrets `KSP_SECRET_WALLET_PASS_*`, inventory DataTables/path safety, lifecycle VIEW/OWNER, screen/command/DTO maps, balance HTTP, administration retenue et forecast étendu jusqu’à `pre.018` : `pre.014` polish Bootstrap/splashscreen, `pre.015` wire binaire `.kspwallet` V2 et `pre.016` APIs génériques/versionnées + runtime V2 désormais matérialisés ; prochain gate `pre.017` migration/canaris, puis `pre.018` documentation candidate et build Tauri final.
|
||||
- [`013-V0_2_6_WALLET_DESK_PLAN.md`](013-V0_2_6_WALLET_DESK_PLAN.md) — plan actif de `0.2.6 — Wallet Desk`, ouvert par `pre.001`; `pre.002` matérialise le shell Tauri et `pre.003` la composition `std.wallet`/composite ainsi que la préparation des répertoires. Le plan fixe aussi secrets `KSP_SECRET_WALLET_PASS_*`, inventory DataTables/path safety, lifecycle VIEW/OWNER, screen/command/DTO maps, balance HTTP, administration retenue et forecast étendu jusqu’à `pre.018` : `pre.014` polish Bootstrap/splashscreen, `pre.015` wire binaire `.kspwallet` V2 et `pre.016` APIs génériques/versionnées + runtime V2 et `pre.017` migration explicite V1 -> V2 désormais matérialisés ; prochain gate `pre.018` documentation candidate et build Tauri final.
|
||||
|
||||
Le `pre.001` de chaque release fonctionnelle peut introduire son propre plan détaillé lorsque la release s'ouvre.
|
||||
|
||||
|
||||
@@ -449,6 +449,8 @@ pre.018 documentation finale, validations, prompt 0.2.7 et cargo tauri build en
|
||||
rel.001 publication stable 0.2.6
|
||||
```
|
||||
|
||||
`pre.017` est désormais matérialisé : la migration V1 -> V2 est explicite, OWNER-authentifiée et séparée de toute ouverture normale, avec copie no-clobber et remplacement in-place stale-protected. Le prochain gate est `pre.018`.
|
||||
|
||||
La tranche `pre.014` est réservée aux défauts visuels/templating observés en usage réel, notamment les scrollbars occasionnelles du splashscreen ; son contenu précis sera borné à partir du retour opérateur avant implémentation. `ROADMAP.md` reste synthétique et `CHANGELOG.md` n'est synchronisé qu'à la phase documentaire finale.
|
||||
|
||||
## `0.2.7` — WebSocket Solana standard
|
||||
|
||||
@@ -770,32 +770,32 @@ outil de logging contrôlé
|
||||
|
||||
## 12. Command map
|
||||
|
||||
| Command | Entrée frontend | Sortie sûre | Délégation |
|
||||
|----------------------------------------------|--------------------|-------------------------------------|-------------------------------------|
|
||||
| `get_runtime_status` | — | `WalletRuntimeStatusDto` | Config/app state |
|
||||
| `list_wallets` | — | `Vec<WalletInventoryEntryDto>` | app filesystem + Wallet inspect |
|
||||
| `refresh_wallets` | — | inventory DTO | app filesystem + Wallet inspect |
|
||||
| `select_wallet` | wallet id | `LockedWalletDto` | app resolver + Wallet inspect |
|
||||
| `deselect_wallet` | — | session DTO | app state |
|
||||
| `create_wallet` | create request | `WalletAuthorizedDto` OWNER | Wallet create file |
|
||||
| `unlock_wallet_view` | password | authorized VIEW | Wallet open VIEW |
|
||||
| `unlock_wallet_owner` | password | authorized OWNER | Wallet open OWNER |
|
||||
| `unlock_wallet_view_with_configured_secret` | — | authorized VIEW / operation result | Config env + Wallet open VIEW |
|
||||
| `unlock_wallet_owner_with_configured_secret` | — | authorized OWNER / operation result | Config env + Wallet open OWNER |
|
||||
| `lock_wallet` | — | `LockedWalletDto` | drop handle + inspect |
|
||||
| `refresh_wallet_balance` | — | `WalletBalanceDto` | Transport getBalance |
|
||||
| `inspect_import_source` | format only | transfer inspection DTO / cancel | Rust native picker + Wallet inspect |
|
||||
| `import_wallet` | import request | authorized OWNER | staged bytes + Wallet import |
|
||||
| `update_wallet_alias` | alias mutation | authorized DTO | WalletOwner |
|
||||
| `add_wallet_note` | note create | authorized DTO | WalletOwner |
|
||||
| `update_wallet_note` | note update | authorized DTO | WalletOwner |
|
||||
| `delete_wallet_note` | note id | authorized DTO | WalletOwner |
|
||||
| `rotate_owner_password` | rotation request | operation result | WalletOwner |
|
||||
| `rotate_view_password` | rotation request | operation result | WalletOwner |
|
||||
| `disable_view` | confirmation | authorized DTO | WalletOwner |
|
||||
| `recreate_view` | new VIEW password | authorized DTO | WalletOwner |
|
||||
| `export_wallet_owner` | format + save path | operation result | Wallet export file |
|
||||
| `emit_frontend_log` | redacted payload | `()` | Logging facade |
|
||||
| Command | Entrée frontend | Sortie sûre | Délégation |
|
||||
|----------------------------------------------|--------------------|-------------------------------------|---------------------------------|
|
||||
| `get_runtime_status` | — | `WalletRuntimeStatusDto` | Config/app state |
|
||||
| `list_wallets` | — | `Vec<WalletInventoryEntryDto>` | app filesystem + Wallet inspect |
|
||||
| `refresh_wallets` | — | inventory DTO | app filesystem + Wallet inspect |
|
||||
| `select_wallet` | wallet id | `LockedWalletDto` | app resolver + Wallet inspect |
|
||||
| `deselect_wallet` | — | session DTO | app state |
|
||||
| `create_wallet` | create request | `WalletAuthorizedDto` OWNER | Wallet create file |
|
||||
| `unlock_wallet_view` | password | authorized VIEW | Wallet open VIEW |
|
||||
| `unlock_wallet_owner` | password | authorized OWNER | Wallet open OWNER |
|
||||
| `unlock_wallet_view_with_configured_secret` | — | authorized VIEW / operation result | Config env + Wallet open VIEW |
|
||||
| `unlock_wallet_owner_with_configured_secret` | — | authorized OWNER / operation result | Config env + Wallet open OWNER |
|
||||
| `lock_wallet` | — | `LockedWalletDto` | drop handle + inspect |
|
||||
| `refresh_wallet_balance` | — | `WalletBalanceDto` | Transport getBalance |
|
||||
| `inspect_import_source` | format only | transfer inspection DTO / cancel | Rust native picker + Wallet inspect |
|
||||
| `import_wallet` | import request | authorized OWNER | staged bytes + Wallet import |
|
||||
| `update_wallet_alias` | alias mutation | authorized DTO | WalletOwner |
|
||||
| `add_wallet_note` | note create | authorized DTO | WalletOwner |
|
||||
| `update_wallet_note` | note update | authorized DTO | WalletOwner |
|
||||
| `delete_wallet_note` | note id | authorized DTO | WalletOwner |
|
||||
| `rotate_owner_password` | rotation request | operation result | WalletOwner |
|
||||
| `rotate_view_password` | rotation request | operation result | WalletOwner |
|
||||
| `disable_view` | confirmation | authorized DTO | WalletOwner |
|
||||
| `recreate_view` | new VIEW password | authorized DTO | WalletOwner |
|
||||
| `export_wallet_owner` | format + save path | operation result | Wallet export file |
|
||||
| `emit_frontend_log` | redacted payload | `()` | Logging facade |
|
||||
|
||||
Aucune commande de signature arbitraire n'est ajoutée dans cette release.
|
||||
|
||||
@@ -1741,7 +1741,29 @@ Une future API `_v3` pourra être ajoutée sans transformer automatiquement le d
|
||||
|
||||
### `pre.017` — migration V1 -> V2 + persistence/canaris
|
||||
|
||||
Ajouter la migration explicite et authentifiée V1 vers V2, les paths de remplacement/no-clobber nécessaires, les canaris adversariaux/interop et la régression complète Wallet Desk. Aucune migration silencieuse lors d'une simple ouverture.
|
||||
**Statut : matérialisé par `0.2.6-pre.017`.**
|
||||
|
||||
La migration est une opération explicite OWNER-authentifiée et reste séparée de toute ouverture normale :
|
||||
|
||||
```text
|
||||
migrate_wallet_v1_to_v2(...) snapshot mémoire V1 -> V2
|
||||
migrate_wallet_file_v1_to_v2(...) source V1 conservée + destination V2 no-clobber
|
||||
migrate_wallet_file_v1_to_v2_in_place(...) remplacement atomique V1 -> V2
|
||||
```
|
||||
|
||||
Invariants retenus :
|
||||
|
||||
- source obligatoirement V1 et authentifiée par OWNER avant conversion ;
|
||||
- même identité Solana, alias, textes de notes et identifiants stables de notes après migration ;
|
||||
- OWNER conserve le même mot de passe fourni à la migration ;
|
||||
- VIEW reste activé ou désactivé comme dans V1 ; quand VIEW est activé, le caller fournit le mot de passe cible V2, qui peut être l'ancien ou un remplacement autorisé par OWNER ;
|
||||
- aucun ciphertext/slot V1 n'est transcodé directement : V2 reçoit de nouvelles clés de contenu, nouveaux salts/nonces/slot IDs, un nouvel OWNER auth key et ses propres transcripts/AAD ;
|
||||
- copy migration = destination no-clobber, source inchangée ;
|
||||
- in-place migration = vérification de l'enveloppe V1 authentifiée attendue puis remplacement atomique ; un état concurrent/stale retourne `wallet.state_conflict` ;
|
||||
- `wallet.migration_invalid` couvre les demandes incohérentes avec la forme VIEW source/cible ;
|
||||
- une ouverture générique V1 continue de laisser le fichier en V1.
|
||||
|
||||
Les canaris `pre.017` couvrent migration mémoire, conservation identité/metadata/note IDs, choix du credential VIEW cible, no-clobber, remplacement in-place, tampering, stale-state et exposition API publique. Wallet Desk reste version-neutral et non-migrant : aucune ouverture/inventory du Desk ne déclenche la migration.
|
||||
|
||||
### `pre.018` — documentation finale, candidate build et prompt suivant
|
||||
|
||||
|
||||
@@ -51,19 +51,19 @@ Le checkpoint opérateur `pre.012` du 21 août 2026 est vert : `cargo fmt`, audi
|
||||
|
||||
## 3. Matrice de frontières
|
||||
|
||||
| Frontière | Contrat `0.2.6` | Preuve durable |
|
||||
|------------------------------|--------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
|
||||
| Frontend -> Config | aucun accès direct env/.env | `release_compliance::backend_keeps_config_wallet_transport_and_logging_ownership_boundaries` + ownership Config |
|
||||
| Frontend -> Wallet secret | passwords uniquement request-only ; jamais de keypair en IPC | `desktop_security` + `release_compliance::response_dtos_keep_secret_key_material_out_of_ipc` |
|
||||
| Frontend -> filesystem | aucun path arbitraire ; picker natif Rust | tests import/export + capability audit |
|
||||
| Frontend -> réseau Solana | aucun `fetch`/WebSocket/RPC direct | `release_compliance::frontend_has_no_direct_filesystem_network_or_secret_persistence_surface` |
|
||||
| Wallet Desk -> Solana crates | aucune dépendance protocole directe | `release_compliance::wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal` |
|
||||
| Wallet Desk -> HTTP | `ksp-onchain-transport-lib` uniquement | manifest + smoke Devnet |
|
||||
| Wallet Desk -> Wallet crypto | `ksp-wallet-lib` uniquement | manifest + feature canaries |
|
||||
| Wallet Desk -> logging | façade `ksp-logging-lib` + adapter `tauri-plugin-tracing` | source audit + workspace logging canary |
|
||||
| locked -> frontend | format/version/VIEW enabled seulement | `desktop_security` |
|
||||
| VIEW/OWNER handles | Rust-only `AppState` | session/security tests |
|
||||
| export | OWNER-only, file direct, no-clobber | `desktop_security` + runtime `pre.012` |
|
||||
| Frontière | Contrat `0.2.6` | Preuve durable |
|
||||
|---|---|---|
|
||||
| Frontend -> Config | aucun accès direct env/.env | `release_compliance::backend_keeps_config_wallet_transport_and_logging_ownership_boundaries` + ownership Config |
|
||||
| Frontend -> Wallet secret | passwords uniquement request-only ; jamais de keypair en IPC | `desktop_security` + `release_compliance::response_dtos_keep_secret_key_material_out_of_ipc` |
|
||||
| Frontend -> filesystem | aucun path arbitraire ; picker natif Rust | tests import/export + capability audit |
|
||||
| Frontend -> réseau Solana | aucun `fetch`/WebSocket/RPC direct | `release_compliance::frontend_has_no_direct_filesystem_network_or_secret_persistence_surface` |
|
||||
| Wallet Desk -> Solana crates | aucune dépendance protocole directe | `release_compliance::wallet_desk_dependency_firewall_and_tauri_capabilities_are_minimal` |
|
||||
| Wallet Desk -> HTTP | `ksp-onchain-transport-lib` uniquement | manifest + smoke Devnet |
|
||||
| Wallet Desk -> Wallet crypto | `ksp-wallet-lib` uniquement | manifest + feature canaries |
|
||||
| Wallet Desk -> logging | façade `ksp-logging-lib` + adapter `tauri-plugin-tracing` | source audit + workspace logging canary |
|
||||
| locked -> frontend | format/version/VIEW enabled seulement | `desktop_security` |
|
||||
| VIEW/OWNER handles | Rust-only `AppState` | session/security tests |
|
||||
| export | OWNER-only, file direct, no-clobber | `desktop_security` + runtime `pre.012` |
|
||||
|
||||
## 4. Inventory / path adversarial
|
||||
|
||||
@@ -255,4 +255,4 @@ V1 existant reste ouvrable sans migration
|
||||
V2 nouvellement créé/importé administration complète conservée en V2
|
||||
```
|
||||
|
||||
Les canaris `pre.016` couvrent également le refus croisé des lecteurs explicitement versionnés et le maintien du format V2 après metadata/rotations/disable/recreate/self-rotation VIEW. La migration V1 -> V2 reste explicitement hors de cette tranche et appartient à `pre.017`.
|
||||
Les canaris `pre.016` couvrent également le refus croisé des lecteurs explicitement versionnés et le maintien du format V2 après metadata/rotations/disable/recreate/self-rotation VIEW. `pre.017` matérialise ensuite la migration V1 -> V2 explicite : mémoire, copie no-clobber et remplacement in-place stale-protected, avec conservation identité/metadata/note IDs et canaris tampering/state-conflict. Wallet Desk reste non-migrant et continue à ouvrir/inspecter via les APIs génériques.
|
||||
|
||||
Reference in New Issue
Block a user